diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c index b7388813ec21b7ea87d831f9e937e473d30c3dc6..1513c7c2d5cb2c226f1ff13343bf1612694265ad 100644 --- a/src/slurmctld/node_scheduler.c +++ b/src/slurmctld/node_scheduler.c @@ -525,6 +525,7 @@ _pick_best_nodes(struct node_set *node_set_ptr, int node_set_size, for (j = min_feature; j <= max_feature; j++) { for (i = 0; i < node_set_size; i++) { + bool pick_light_load = false; if (node_set_ptr[i].feature != j) continue; if (!runable_ever) { @@ -542,10 +543,27 @@ _pick_best_nodes(struct node_set *node_set_ptr, int node_set_size, } } bit_and(node_set_ptr[i].my_bitmap, avail_node_bitmap); - if (shared) + if (shared) { +#ifdef HAVE_BGL + /* Exclude nodes which have jobs in COMPLETING + * state in order to insure Epilog completes + * before possibly scheduling another job to + * the same bglblock. */ + int ni; + bit_and(node_set_ptr[i].my_bitmap, + share_node_bitmap); + for (ni = 0; ni < node_record_count; ni++) { + if (node_record_table_ptr[ni].node_state + == NODE_STATE_COMPLETING) + bit_clear(node_set_ptr[i].my_bitmap, ni); + } + /* pick_light_load = false; Non-overlapping blocks */ +#else bit_and(node_set_ptr[i].my_bitmap, share_node_bitmap); - else if (cr_enabled) + pick_light_load = true; +#endif + } else if (cr_enabled) bit_and(node_set_ptr[i].my_bitmap, partially_idle_node_bitmap); else @@ -575,20 +593,16 @@ _pick_best_nodes(struct node_set *node_set_ptr, int node_set_size, if (slurmctld_conf.fast_schedule && (avail_cpus < job_ptr->num_procs)) continue; /* Keep accumulating CPUs */ - -#ifndef HAVE_BGL - if (shared) { + if (pick_light_load) { pick_code = _pick_best_load(job_ptr, avail_bitmap, min_nodes, max_nodes); } else -#else pick_code = select_g_job_test(job_ptr, avail_bitmap, min_nodes, max_nodes); -#endif if (pick_code == SLURM_SUCCESS) { if ((node_lim != INFINITE) &&