From ad6138a153fdf6617d235cb25ba97239624904ed Mon Sep 17 00:00:00 2001
From: alejluther <alucero@os3sl.com>
Date: Thu, 25 Oct 2012 12:27:33 +0200
Subject: [PATCH] Last changes for core based reservation topology support

---
 src/plugins/select/cons_res/select_cons_res.c | 26 +++++++++----------
 src/slurmctld/reservation.c                   | 18 ++++++++-----
 testsuite/expect/inc3.11.1                    |  1 -
 testsuite/expect/inc3.11.8                    |  2 +-
 4 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/src/plugins/select/cons_res/select_cons_res.c b/src/plugins/select/cons_res/select_cons_res.c
index 9ecd59b3bdf..0d53275191d 100644
--- a/src/plugins/select/cons_res/select_cons_res.c
+++ b/src/plugins/select/cons_res/select_cons_res.c
@@ -2631,7 +2631,6 @@ bitstr_t *sequential_pick(bitstr_t *avail_bitmap, uint32_t node_cnt,
 		if (core_cnt) {
 			info("reservation request can not be satisfied");
 			FREE_NULL_BITMAP(sp_avail_bitmap);
-			FREE_NULL_BITMAP(tmpcore);
 			return NULL;
 		}
 
@@ -2721,9 +2720,13 @@ extern bitstr_t * select_p_resv_test(bitstr_t *avail_bitmap, uint32_t node_cnt,
 	if (bit_set_count(avail_bitmap) < node_cnt)
 		return avail_nodes_bitmap;
 
+	if (*core_bitmap == NULL)
+		*core_bitmap = _make_core_bitmap_filtered(avail_bitmap, 0);
+	
 	rem_nodes = node_cnt;
 	rem_cores = core_cnt;
 
+	/* TODO: allowing asymmetric cluster */
 	cores_per_node = core_cnt / MAX(node_cnt, 1);
 
 	/* Construct a set of switch array entries,
@@ -2744,9 +2747,6 @@ extern bitstr_t * select_p_resv_test(bitstr_t *avail_bitmap, uint32_t node_cnt,
 		switches_core_bitmap[i] = 
 			_make_core_bitmap_filtered(switches_bitmap[i], 1);
 
-		bit_fmt(str, sizeof(str), switches_core_bitmap[i]);
-		debug2("Switch %d can use cores: %s", i, str);
-
 		if (*core_bitmap) {
 			bit_not(*core_bitmap);
 			bit_and(switches_core_bitmap[i], *core_bitmap);
@@ -2871,15 +2871,17 @@ extern bitstr_t * select_p_resv_test(bitstr_t *avail_bitmap, uint32_t node_cnt,
 				int coff;
 				avail_cores_in_node = 0;
 				coff = cr_get_coremap_offset(i);
-				debug2("Testing node %d, core offset %d", i, coff);
-				for (j = 0; j < cr_node_num_cores[i]; j++){
+				debug2("Testing node %d, core offset %d",
+				       i, coff);
+				for (j=0; j<cr_node_num_cores[i]; j++){
 					if (!bit_test(*core_bitmap, coff + j))
 						avail_cores_in_node++;
 				}
 				if (avail_cores_in_node < cores_per_node)
 					continue;
 				
-				debug2("Using node %d with %d cores available", i, avail_cores_in_node);
+				debug2("Using node %d with %d cores available",
+				       i, avail_cores_in_node);
 			}
 
 			bit_set(avail_nodes_bitmap, i);
@@ -2914,9 +2916,7 @@ fini:	for (i=0; i<switch_record_cnt; i++)
 		if (*core_bitmap){
 			exc_core_bitmap = bit_copy(*core_bitmap);
 			bit_nclear(*core_bitmap, 0, bit_size(*core_bitmap)-1);
-		} else 
-			*core_bitmap = 
-				_make_core_bitmap_filtered(avail_nodes_bitmap, 0);
+		}
 
 		cores_per_node = core_cnt / MAX(node_cnt, 1);
 
@@ -2946,8 +2946,8 @@ fini:	for (i=0; i<switch_record_cnt; i++)
 				}
  			}
  
-			debug2("Node %d has %d available cores", inx, 
-				avail_cores_in_node);
+			debug2("Node %d has %d available cores", inx,
+			       avail_cores_in_node);
 
 			if (avail_cores_in_node < cores_per_node)
 				continue;
@@ -2960,7 +2960,7 @@ fini:	for (i=0; i<switch_record_cnt; i++)
 					avail_cores_in_node++;
 				}
 
-				if((avail_cores_in_node == cores_per_node) || 
+				if ((avail_cores_in_node == cores_per_node) ||
 					(core_cnt == 0))
 					break;
 			}
diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c
index 284894e4079..a66e3926a61 100644
--- a/src/slurmctld/reservation.c
+++ b/src/slurmctld/reservation.c
@@ -1783,6 +1783,10 @@ extern int update_resv(resv_desc_msg_t *resv_desc_ptr)
 	if (!resv_ptr)
 		return ESLURM_RESERVATION_INVALID;
 
+	/* TODO: core based reservation updates */
+	if (resv_ptr->full_nodes == 0)
+		return ESLURM_RESERVATION_NOT_USABLE;
+
 	/* Make backup to restore state in case of failure */
 	resv_backup = _copy_resv(resv_ptr);
 
@@ -2462,6 +2466,7 @@ static void _validate_all_reservations(void)
 static void _validate_node_choice(slurmctld_resv_t *resv_ptr)
 {
 	bitstr_t *tmp_bitmap = NULL;
+	bitstr_t *core_bitmap = NULL;
 	int i;
 	resv_desc_msg_t resv_desc;
 
@@ -2482,7 +2487,7 @@ static void _validate_node_choice(slurmctld_resv_t *resv_ptr)
 	resv_desc.features   = resv_ptr->features;
 	resv_desc.node_cnt   = xmalloc(sizeof(uint32_t) * 2);
 	resv_desc.node_cnt[0]= resv_ptr->node_cnt - i;
-	i = _select_nodes(&resv_desc, &resv_ptr->part_ptr, &tmp_bitmap, NULL);
+	i = _select_nodes(&resv_desc, &resv_ptr->part_ptr, &tmp_bitmap, &core_bitmap);
 	xfree(resv_desc.node_cnt);
 	xfree(resv_desc.node_list);
 	xfree(resv_desc.partition);
@@ -2691,6 +2696,7 @@ extern int validate_job_resv(struct job_record *job_ptr)
 static int  _resize_resv(slurmctld_resv_t *resv_ptr, uint32_t node_cnt)
 {
 	bitstr_t *tmp1_bitmap = NULL, *tmp2_bitmap = NULL;
+	bitstr_t *core_bitmap = NULL;
 	int delta_node_cnt, i;
 	resv_desc_msg_t resv_desc;
 
@@ -2746,7 +2752,7 @@ static int  _resize_resv(slurmctld_resv_t *resv_ptr, uint32_t node_cnt)
 	resv_desc.flags      = resv_ptr->flags;
 	resv_desc.node_cnt   = xmalloc(sizeof(uint32_t) * 2);
 	resv_desc.node_cnt[0]= 0 - delta_node_cnt;
-	i = _select_nodes(&resv_desc, &resv_ptr->part_ptr, &tmp1_bitmap, NULL);
+	i = _select_nodes(&resv_desc, &resv_ptr->part_ptr, &tmp1_bitmap, &core_bitmap);
 	xfree(resv_desc.node_cnt);
 	xfree(resv_desc.node_list);
 	xfree(resv_desc.partition);
@@ -3564,10 +3570,10 @@ extern int job_test_resv(struct job_record *job_ptr, time_t *when,
 			    (resv_ptr->start_time >= job_end_time) ||
 			    (resv_ptr->end_time   <= job_start_time))
 				continue;
-			if (job_ptr->details->req_node_bitmap && 
+			if (job_ptr->details->req_node_bitmap &&
 			    bit_overlap(job_ptr->details->req_node_bitmap,
-			    resv_ptr->node_bitmap) && 
-			    ((resv_ptr->cpu_cnt == 0) || 
+					resv_ptr->node_bitmap) &&
+			    ((resv_ptr->cpu_cnt == 0) ||
 			    (!job_ptr->details->shared))) {
 				*when = resv_ptr->end_time;
 				rc = ESLURM_NODES_BUSY;
@@ -3598,7 +3604,7 @@ extern int job_test_resv(struct job_record *job_ptr, time_t *when,
 						bit_copy(resv_ptr->core_bitmap);
 				else 
 					bit_or(*exc_core_bitmap,
-						resv_ptr->core_bitmap);
+					       resv_ptr->core_bitmap);
 			}
 		}
 		list_iterator_destroy(iter);
diff --git a/testsuite/expect/inc3.11.1 b/testsuite/expect/inc3.11.1
index 7d8e7d90093..c62798eb6bb 100644
--- a/testsuite/expect/inc3.11.1
+++ b/testsuite/expect/inc3.11.1
@@ -59,7 +59,6 @@ proc inc3_11_1 {} {
 	{StartTime=now   Duration=5   Nodes=$def_node   User=$user_name  Flags=badtype,ignore_jobs}
 	{StartTime=now+10minutes   EndTime=now   Nodes=$def_node   User=$user_name Flags=ignore_jobs}
 	{StartTime=now   Duration=5   Nodes=$def_node   User=$user_name Licenses=DUMMY_FOR_TESTING Flags=ignore_jobs}
-	#{StartTime=now   Duration=5   NodeCnt=2 CoreCnt=1  User=$user_name}
 	{StartTime=now   Duration=5   NodeCnt=1 CoreCnt=$core_res_num  User=$user_name}
 "
 	#{StartTime=now   Duration=5   Nodes=$def_node   Account=badaccountname}
diff --git a/testsuite/expect/inc3.11.8 b/testsuite/expect/inc3.11.8
index eef31ae8674..bb40c23f15f 100644
--- a/testsuite/expect/inc3.11.8
+++ b/testsuite/expect/inc3.11.8
@@ -41,7 +41,7 @@ proc inc3_11_8 {} {
 
 	# Make the job script
 	exec $bin_rm -f $file_in
-	make_bash_script $file_in "$bin_sleep 1000"
+	make_bash_script $file_in "$bin_sleep 100"
 
 	# Make a reservation, just to get node size infomation
 	set ret_code [create_res "StartTime=now Duration=1 NodeCnt=1 User=$user_name" 0]
-- 
GitLab