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