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