From 6c8963093c64a799d0f75b937aa321ee5eb8c8c1 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Tue, 3 Feb 2009 20:12:41 +0000
Subject: [PATCH] Fix bad logic if a reservation update clears the node list,
 but sets   a node count at the same time.

---
 src/slurmctld/reservation.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c
index 0d825a6d9ea..9cebbba5fd3 100644
--- a/src/slurmctld/reservation.c
+++ b/src/slurmctld/reservation.c
@@ -919,6 +919,7 @@ extern int update_resv(reserve_request_msg_t *resv_desc_ptr)
 	time_t old_start_time, old_end_time;
 	bitstr_t *old_node_bitmap = (bitstr_t *) NULL;
 	char *old_node_list = NULL;
+	uint32_t old_node_cnt = 0;
 	slurmctld_resv_t *resv_ptr;
 	int error_code = SLURM_SUCCESS, rc;
 	char start_time[32], end_time[32];
@@ -1029,17 +1030,23 @@ extern int update_resv(reserve_request_msg_t *resv_desc_ptr)
 		old_node_list = resv_ptr->node_list;
 		resv_ptr->node_list = resv_desc_ptr->node_list;
 		resv_desc_ptr->node_list = NULL;  /* Nothing left to free */
+		old_node_cnt = resv_ptr->node_cnt;
 		old_node_bitmap = resv_ptr->node_bitmap;
 		resv_ptr->node_bitmap = node_bitmap;
+		resv_ptr->node_cnt = bit_set_count(resv_ptr->node_bitmap);
 	}
 	if (resv_desc_ptr->node_cnt != NO_VAL) {
-		old_node_list = xstrdup(resv_ptr->node_list);
-		old_node_bitmap = bit_copy(resv_ptr->node_bitmap);
+		if (!old_node_list) {
+			old_node_list = xstrdup(resv_ptr->node_list);
+			old_node_cnt = resv_ptr->node_cnt;
+			old_node_bitmap = bit_copy(resv_ptr->node_bitmap);
+		}
 		rc = _resize_resv(resv_ptr, resv_desc_ptr->node_cnt);
 		if (rc) {
 			error_code = rc;
 			goto fini;
 		}
+		resv_ptr->node_cnt = bit_set_count(resv_ptr->node_bitmap);
 	}
 	if (_resv_overlap(resv_ptr->start_time, resv_ptr->end_time, 
 			  resv_ptr->node_bitmap, resv_ptr)) {
@@ -1055,10 +1062,10 @@ extern int update_resv(reserve_request_msg_t *resv_desc_ptr)
 			FREE_NULL_BITMAP(resv_ptr->node_bitmap);
 			resv_ptr->node_bitmap = old_node_bitmap;
 			old_node_bitmap = NULL;
+			resv_ptr->node_cnt = old_node_cnt;
 		}
 	} else if (old_node_list) {
 		/* Nodes in the reservation have changed */
-		resv_ptr->node_cnt = bit_set_count(resv_ptr->node_bitmap);
 		_set_cpu_cnt(resv_ptr);
 	}
 
-- 
GitLab