diff --git a/NEWS b/NEWS index cde7dbcd4a746cef0ef31d235ae6986fc00e3d21..72482e094b97559ee6f2ec3213177af0d0cc8adc 100644 --- a/NEWS +++ b/NEWS @@ -76,6 +76,8 @@ documents those changes that are of interest to users and administrators. -- Fix invalid reads of size 1 due to non null-terminated string reads. -- Add extra debug2 logs to identify why BadConstraints reason is set. -- cons_res/job_test - prevent a job from overallocating a node memory. + -- cons_res/job_test - fix to consider a node's current allocated memory when + testing a job's memory request. * Changes in Slurm 18.08.6-2 ============================ diff --git a/src/plugins/select/cons_res/job_test.c b/src/plugins/select/cons_res/job_test.c index e19c79a3b08e9da7db07f6e2de1636500aa1977a..304a2c1b220a30ee88b5f8caf755c6d1f73888dc 100644 --- a/src/plugins/select/cons_res/job_test.c +++ b/src/plugins/select/cons_res/job_test.c @@ -3910,9 +3910,32 @@ alloc_job: } else if (save_mem) /* Memory per node */ needed_mem = save_mem; else { /* Allocate all node memory */ + needed_mem = avail_mem; + if (!test_only && (node_usage[i].alloc_memory > 0)) { + if (select_debug_flags & DEBUG_FLAG_SELECT_TYPE) + info("%s: node %s has already alloc_memory=%"PRIu64". %pJ can't allocate all node memory", + __func__, + select_node_record[i]. + node_ptr->name, + node_usage[i].alloc_memory, + job_ptr); + error_code = SLURM_ERROR; + break; + } if ((j == 0) || (lowest_mem > avail_mem)) lowest_mem = avail_mem; - needed_mem = avail_mem; + } + if (!test_only && save_mem) { + if (node_usage[i].alloc_memory > avail_mem) { + error("%s: node %s memory is already overallocated (%"PRIu64" > %"PRIu64"). %pJ can't allocate any node memory", + __func__, + select_node_record[i].node_ptr->name, + node_usage[i].alloc_memory, avail_mem, + job_ptr); + error_code = SLURM_ERROR; + break; + } + avail_mem -= node_usage[i].alloc_memory; } if (needed_mem > avail_mem) { if (select_debug_flags & DEBUG_FLAG_SELECT_TYPE)