From 6ae08bc7aa82560ad44d589f159b58efe1fcf5a9 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 6 Feb 2009 17:43:51 +0000
Subject: [PATCH] insure that we don't have any reservation IDs of zero (causes
 slurmdbd problems) Fix parsing problem when adding or removeing
 accounts/users to an existing reservation

---
 src/slurmctld/reservation.c | 44 +++++++++++++++++++++++++++++--------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c
index 94fa1c8fc27..6525748e044 100644
--- a/src/slurmctld/reservation.c
+++ b/src/slurmctld/reservation.c
@@ -71,7 +71,7 @@
 #include "src/slurmctld/slurmctld.h"
 #include "src/slurmctld/state_save.h"
 
-#define _RESV_DEBUG	0
+#define _RESV_DEBUG	1
 #define RESV_MAGIC	0x3b82
 
 /* Change RESV_STATE_VERSION value when changing the state save format
@@ -91,7 +91,9 @@ static void _clear_job_resv(slurmctld_resv_t *resv_ptr);
 static slurmctld_resv_t *_copy_resv(slurmctld_resv_t *resv_orig_ptr);
 static void _del_resv_rec(void *x);
 static void _dump_resv_req(reserve_request_msg_t *resv_ptr, char *mode);
+static int  _find_resv_id(void *x, void *key);
 static int  _find_resv_name(void *x, void *key);
+static void _generate_resv_id(void);
 static void _generate_resv_name(reserve_request_msg_t *resv_ptr);
 static bool _is_account_valid(char *account);
 static bool _is_resv_used(slurmctld_resv_t *resv_ptr);
@@ -199,6 +201,19 @@ static void _del_resv_rec(void *x)
 	}
 }
 
+static int _find_resv_id(void *x, void *key)
+{
+	slurmctld_resv_t *resv_ptr = (slurmctld_resv_t *) x;
+	uint32_t *resv_id = (uint32_t *) key;
+
+	xassert(resv_ptr->magic == RESV_MAGIC);
+
+	if (resv_ptr->resv_id != *resv_id)
+		return 0;
+	else
+		return 1;	/* match */
+}
+
 static int _find_resv_name(void *x, void *key)
 {
 	slurmctld_resv_t *resv_ptr = (slurmctld_resv_t *) x;
@@ -240,6 +255,18 @@ static void _dump_resv_req(reserve_request_msg_t *resv_ptr, char *mode)
 #endif
 }
 
+static void _generate_resv_id(void)
+{
+	while (1) {
+		if (top_suffix >= 9999)
+			top_suffix = 1;		/* wrap around */
+		else
+			top_suffix++;
+		if (!list_find_first(resv_list, _find_resv_id, &top_suffix))
+			break;
+	}
+}
+
 static void _generate_resv_name(reserve_request_msg_t *resv_ptr)
 {
 	char *key, *name, *sep;
@@ -259,11 +286,6 @@ static void _generate_resv_name(reserve_request_msg_t *resv_ptr)
 	name = xmalloc(len + 16);
 	strncpy(name, key, len);
 
-	if (top_suffix >= 9999)
-		top_suffix = 1;		/* wrap around */
-	else
-		top_suffix++;
-
 	xstrfmtcat(name, "_%d", top_suffix);
 	len++;
 
@@ -446,7 +468,6 @@ static int  _update_account_list(struct slurmctld_resv *resv_ptr,
 		ac_list[ac_cnt++] = xstrdup(tok);
 		tok = strtok_r(NULL, ",", &last);
 	}
-	xfree(tmp);
 
 	if ((plus_account == 0) && (minus_account == 0)) {
 		/* Just a reset of account list */
@@ -456,6 +477,7 @@ static int  _update_account_list(struct slurmctld_resv *resv_ptr,
 		xfree(resv_ptr->account_list);
 		resv_ptr->account_list = ac_list;
 		resv_ptr->account_cnt = ac_cnt;
+		xfree(tmp);
 		xfree(ac_type);
 		return SLURM_SUCCESS;
 	}
@@ -534,6 +556,7 @@ static int  _update_account_list(struct slurmctld_resv *resv_ptr,
 		xfree(ac_list[i]);
 	xfree(ac_list);
 	xfree(ac_type);
+	xfree(tmp);
 	return SLURM_SUCCESS;
 
  inval:	for (i=0; i<ac_cnt; i++)
@@ -639,7 +662,6 @@ static int _update_uid_list(struct slurmctld_resv *resv_ptr, char *users)
 		u_list[u_cnt++] = u_tmp;
 		tok = strtok_r(NULL, ",", &last);
 	}
-	xfree(tmp);
 
 	if ((plus_user == 0) && (minus_user == 0)) {
 		/* Just a reset of user list */
@@ -649,6 +671,7 @@ static int _update_uid_list(struct slurmctld_resv *resv_ptr, char *users)
 			resv_ptr->users = xstrdup(users);
 		resv_ptr->user_cnt  = u_cnt;
 		resv_ptr->user_list = u_list;
+		xfree(tmp);
 		xfree(u_name);
 		xfree(u_type);
 		return SLURM_SUCCESS;
@@ -719,6 +742,7 @@ static int _update_uid_list(struct slurmctld_resv *resv_ptr, char *users)
 				u_list[i];
 		}
 	}
+	xfree(tmp);
 	xfree(u_list);
 	xfree(u_name);
 	xfree(u_type);
@@ -943,7 +967,8 @@ extern int create_resv(reserve_request_msg_t *resv_desc_ptr)
 		   != SLURM_SUCCESS) {
 		goto bad_parse;
 	}
-	
+
+	_generate_resv_id();
 	if (resv_desc_ptr->name) {
 		resv_ptr = (slurmctld_resv_t *) list_find_first (resv_list, 
 				_find_resv_name, resv_desc_ptr->name);
@@ -961,6 +986,7 @@ extern int create_resv(reserve_request_msg_t *resv_desc_ptr)
 					_find_resv_name, resv_desc_ptr->name);
 			if (!resv_ptr)
 				break;
+			_generate_resv_id();	/* makes new suffix */
 			/* Same as previously created name, retry */
 		}
 	}
-- 
GitLab