From f55bfbe5b243120f15be4e8b7c80af283c4d6506 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@schedmd.com>
Date: Wed, 27 Apr 2016 13:44:56 -0700
Subject: [PATCH] Bluegene - Fix comma separated reservation creations.

---
 src/plugins/select/bluegene/select_bluegene.c | 11 ++-
 src/slurmctld/reservation.c                   | 68 ++++++++++++++-----
 2 files changed, 62 insertions(+), 17 deletions(-)

diff --git a/src/plugins/select/bluegene/select_bluegene.c b/src/plugins/select/bluegene/select_bluegene.c
index 48c7aceace3..f9eb2bf0fc1 100644
--- a/src/plugins/select/bluegene/select_bluegene.c
+++ b/src/plugins/select/bluegene/select_bluegene.c
@@ -3388,8 +3388,10 @@ extern bitstr_t *select_p_resv_test(resv_desc_msg_t *resv_desc_ptr,
 		cores = 16;
 #endif
 		job_rec.details->min_cpus *= cores;
-	} else
+	} else {
+		jobinfo->cnode_cnt = node_cnt * cnodes_per_mp;
 		job_rec.details->min_cpus = node_cnt * bg_conf->cpus_per_mp;
+	}
 
 	job_rec.details->max_cpus = job_rec.details->min_cpus;
 	job_rec.details->core_spec = (uint16_t)NO_VAL;
@@ -3434,6 +3436,7 @@ end_it:
 	xfree(job_rec.details);
 
 	if (rc == SLURM_SUCCESS && job_rec.start_time != INFINITE) {
+		xfree(resv_desc_ptr->node_list);
 		resv_desc_ptr->node_list = xstrdup_select_jobinfo(
 			jobinfo, SELECT_PRINT_NODES);
 		if (jobinfo->ionode_str) {
@@ -3451,6 +3454,12 @@ end_it:
 					continue;
 				bit_set(*core_bitmap, i+offset);
 			}
+		} else {
+			/* This means we ended up doing full nodes, so clear out
+			 * anything vestigal that would say otherwise.
+			 */
+			FREE_NULL_BITMAP(*core_bitmap);
+			xfree(resv_desc_ptr->core_cnt);
 		}
 
 		info("Reservation request for %u nodes satisfied with %s",
diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c
index 1d1e37c22c8..729ca83023a 100644
--- a/src/slurmctld/reservation.c
+++ b/src/slurmctld/reservation.c
@@ -2197,34 +2197,53 @@ extern int create_resv(resv_desc_msg_t *resv_desc_ptr)
 	if (resv_desc_ptr->node_cnt && cnodes_per_mp) {
 		/* Pack multiple small blocks into midplane rather than
 		 * allocating a whole midplane for each small block */
-		int small_block_nodes = 0, small_block_count = 0;
+		int small_block_nodes = 0, first_small = -1;
+		bool req_mixed = false;
+
 		for (i = 0; resv_desc_ptr->node_cnt[i]; i++) {
-			if (resv_desc_ptr->node_cnt[i] < cnodes_per_mp)
+			if (resv_desc_ptr->node_cnt[i] < cnodes_per_mp) {
+				if (first_small == -1)
+					first_small = i;
 				small_block_nodes += resv_desc_ptr->node_cnt[i];
+			} else
+				req_mixed = true;
+		}
+
+		if (small_block_nodes) {
+			if (req_mixed)
+				resv_desc_ptr->node_cnt[first_small] =
+					small_block_nodes < cnodes_per_mp ?
+					cnodes_per_mp : small_block_nodes;
+			else
+				resv_desc_ptr->node_cnt[first_small] =
+					small_block_nodes;
+
+			small_block_nodes = 0;
+			/* Since there will only ever be 1 small block we can
+			 * set the the one after the first small to 0.
+			 */
+			resv_desc_ptr->node_cnt[first_small+1] = 0;
 		}
-		small_block_count  =  small_block_nodes;
-		small_block_count += (cnodes_per_mp - 1);
-		small_block_count /=  cnodes_per_mp;
 
 		/* Convert c-node count to midplane count */
-		total_node_cnt = 0;
+
 		for (i = 0; resv_desc_ptr->node_cnt[i]; i++) {
+			if (!resv_desc_ptr->node_cnt[i])
+				break;
+
 			if (resv_desc_ptr->node_cnt[i] < cnodes_per_mp) {
+				/* There will only ever be one here */
 				if (!resv_desc_ptr->core_cnt)
 					resv_desc_ptr->core_cnt =
 						xmalloc(sizeof(uint32_t) * 2);
-				resv_desc_ptr->core_cnt[0] +=
+				resv_desc_ptr->core_cnt[0] =
 					resv_desc_ptr->node_cnt[i];
-				if (small_block_count == 0) {
-					resv_desc_ptr->node_cnt[i] = 0;
-					break;
-				}
-				small_block_count--;
+				resv_desc_ptr->node_cnt[i] = 1;
+			} else {
+				resv_desc_ptr->node_cnt[i] +=
+					(cnodes_per_mp - 1);
+				resv_desc_ptr->node_cnt[i] /= cnodes_per_mp;
 			}
-
-			resv_desc_ptr->node_cnt[i] += (cnodes_per_mp - 1);
-			resv_desc_ptr->node_cnt[i] /=  cnodes_per_mp;
-			total_node_cnt += resv_desc_ptr->node_cnt[i];
 		}
 	}
 #endif
@@ -3927,6 +3946,7 @@ static bitstr_t *_pick_idle_nodes(bitstr_t *avail_bitmap,
 	bool resv_debug;
 
 #ifdef HAVE_BG
+	hostlist_t hl = NULL;
 	static uint16_t static_blocks = (uint16_t)NO_VAL;
 	if (static_blocks == (uint16_t)NO_VAL) {
 		/* Since this never changes we can just set it once
@@ -3993,8 +4013,24 @@ static bitstr_t *_pick_idle_nodes(bitstr_t *avail_bitmap,
 		bit_not(tmp_bitmap);
 		bit_and(avail_bitmap, tmp_bitmap);
 		FREE_NULL_BITMAP(tmp_bitmap);
+
+#ifdef HAVE_BG
+		if (!hl)
+			hl = hostlist_create(resv_desc_ptr->node_list);
+		else
+			hostlist_push(hl, resv_desc_ptr->node_list);
+#endif
+	}
+#ifdef HAVE_BG
+	if (hl) {
+		hostlist_uniq(hl);
+		hostlist_sort(hl);
+		xfree(resv_desc_ptr->node_list);
+		resv_desc_ptr->node_list = hostlist_ranged_string_xmalloc(hl);
+		hostlist_destroy(hl);
 	}
 
+#endif
 	return ret_bitmap;
 }
 
-- 
GitLab