diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c index 69c76a5e0dab8a007813149d4c7367272b5f06c9..58e252ed7e33f3a5d38ff29331921cdd626d50e4 100644 --- a/src/slurmctld/node_scheduler.c +++ b/src/slurmctld/node_scheduler.c @@ -1786,17 +1786,43 @@ extern int select_nodes(struct job_record *job_ptr, bool test_only, /* Non-fatal errors for job below */ } else if (error_code == ESLURM_NODE_NOT_AVAIL) { /* Required nodes are down or drained */ + char *node_str = NULL, *unavail_node = NULL; debug3("JobId=%u required nodes not avail", job_ptr->job_id); job_ptr->state_reason = WAIT_NODE_NOT_AVAIL; xfree(job_ptr->state_desc); - xstrfmtcat(job_ptr->state_desc, - "ReqNodeNotAvail, May be reserved for other job"); - if (unavail_node_str) { + if (unavail_node_str) { /* Set in few cases */ + node_str = unavail_node_str; + } else { + bitstr_t *unavail_bitmap; + unavail_bitmap = bit_copy(avail_node_bitmap); + bit_not(unavail_bitmap); + if (job_ptr->details && + job_ptr->details->req_node_bitmap && + bit_overlap(unavail_bitmap, + job_ptr->details->req_node_bitmap)) { + bit_and(unavail_bitmap, + job_ptr->details-> + req_node_bitmap); + } + if (bit_ffs(unavail_bitmap) != -1) { + unavail_node = bitmap2node_name( + unavail_bitmap); + node_str = unavail_node; + } + FREE_NULL_BITMAP(unavail_bitmap); + } + if (node_str) { + xstrfmtcat(job_ptr->state_desc, + "ReqNodeNotAvail, " + "UnavailableNodes:%s", + node_str); + } else { xstrfmtcat(job_ptr->state_desc, - ", UnavailableNodes:%s", - unavail_node_str); + "ReqNodeNotAvail, May be reserved " + "for other job"); } + xfree(unavail_node); last_job_update = now; } else if ((error_code == ESLURM_RESERVATION_NOT_USABLE) || (error_code == ESLURM_RESERVATION_BUSY)) {