diff --git a/NEWS b/NEWS index 795569747101524a323eb91ea107e8045e53783f..5a5f6ac6afdae7113e7441eef160f5184c8e0a15 100644 --- a/NEWS +++ b/NEWS @@ -58,6 +58,8 @@ documents those changes that are of interest to users and admins. -- Fixed issue where if a job ended with ESLURMD_UID_NOT_FOUND and ESLURMD_GID_NOT_FOUND where slurm would be a little over zealous in treating missing a GID or UID as a fatal error. + -- If job time limit exceeds partition maximum, but job's minimum time limit + does not, set job's time limit to partition maximum at allocation time. * Changes in SLURM 2.3.1 ======================== diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index dadcbb77c5c4166dfd57793abcab3d27c412d4f6..5cbd88fdd8bb4c945890c51a7918af67192b8a16 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -3745,6 +3745,7 @@ extern int job_limits_check(struct job_record **job_pptr) fail_reason = WAIT_PART_INACTIVE; } else if ((job_ptr->time_limit != NO_VAL) && ((job_ptr->time_limit > part_ptr->max_time) && + (job_ptr->time_min > part_ptr->max_time) && (!qos_ptr || (qos_ptr && !(qos_ptr->flags & QOS_FLAG_PART_TIME_LIMIT))))) { info("Job %u exceeds partition time limit", job_ptr->job_id); diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c index 29c74a6aa2c341b26397ae8428b612b91439c592..66fb6f86bbc3f2713094269c4dd404679403365c 100644 --- a/src/slurmctld/node_scheduler.c +++ b/src/slurmctld/node_scheduler.c @@ -1205,6 +1205,7 @@ extern int select_nodes(struct job_record *job_ptr, bool test_only, fail_reason = WAIT_HELD; else if ((job_ptr->time_limit != NO_VAL) && ((job_ptr->time_limit > part_ptr->max_time) && + (job_ptr->time_min > part_ptr->max_time) && (!qos_ptr || (qos_ptr && !(qos_ptr->flags & QOS_FLAG_PART_TIME_LIMIT))))) fail_reason = WAIT_PART_TIME_LIMIT; @@ -1376,7 +1377,10 @@ extern int select_nodes(struct job_record *job_ptr, bool test_only, * is for the job when we place it */ job_ptr->start_time = job_ptr->time_last_active = now; - if (job_ptr->time_limit == NO_VAL) { + if ((job_ptr->time_limit == NO_VAL) || + ((job_ptr->time_limit > part_ptr->max_time) && + (!qos_ptr || (qos_ptr && !(qos_ptr->flags + & QOS_FLAG_PART_TIME_LIMIT))))) { if (part_ptr->default_time != NO_VAL) job_ptr->time_limit = part_ptr->default_time; else