diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c index bd33a9dffccc26794bda57b5060a77703febf604..28af47a8e6bf8e9772e30e6f60a43aa6c5f750f3 100644 --- a/src/slurmctld/node_scheduler.c +++ b/src/slurmctld/node_scheduler.c @@ -975,6 +975,29 @@ extern void filter_by_node_mcs(struct job_record *job_ptr, int mcs_select, } } +/* Remove nodes from the "avail_node_bitmap" which need to be rebooted in order + * to be used if the job's "delay_boot" time has not yet been reached. */ +static void _filter_by_node_feature(struct job_record *job_ptr, + struct node_set *node_set_ptr, + int node_set_size) +{ + int i; + + if ((job_ptr->details == NULL) || + ((job_ptr->details->begin_time != 0) && + ((job_ptr->details->begin_time + job_ptr->delay_boot) <= + time(NULL)))) + return; + + for (i = 0; i < node_set_size; i++) { + if (node_set_ptr[i].weight != INFINITE) + continue; + bit_not(node_set_ptr[i].my_bitmap); + bit_and(avail_node_bitmap, node_set_ptr[i].my_bitmap); + bit_not(node_set_ptr[i].my_bitmap); + } +} + /* * If the job has required feature counts, then accumulate those * required resources using multiple calls to _pick_best_nodes() @@ -1053,6 +1076,8 @@ _get_req_features(struct node_set *node_set_ptr, int node_set_size, if (!save_avail_node_bitmap) save_avail_node_bitmap = bit_copy(avail_node_bitmap); filter_by_node_owner(job_ptr, avail_node_bitmap); + if (can_reboot && !test_only) + _filter_by_node_feature(job_ptr, node_set_ptr, node_set_size); /* get mcs_select */ mcs_select = slurm_mcs_get_select(job_ptr);