diff --git a/src/slurmctld/acct_policy.c b/src/slurmctld/acct_policy.c index 2d8cd7d4823be4f61642913cfe58731295f85c5e..59e15c205dd0a7546cdfbe35ab3a185362a6ec18 100644 --- a/src/slurmctld/acct_policy.c +++ b/src/slurmctld/acct_policy.c @@ -358,6 +358,38 @@ static int _find_used_limits_for_acct(void *x, void *key) return 0; } +/* Checks for record in *user_limit_list of user_id if + * *user_limit_list doesn't exist it will create it, if the user_id + * record doesn't exist it will add it to the list. + * In all cases the user record is returned. + */ +static slurmdb_used_limits_t *_get_acct_used_limits( + List *acct_limit_list, char *acct) +{ + slurmdb_used_limits_t *used_limits; + + xassert(acct_limit_list); + + if (!*acct_limit_list) + *acct_limit_list = list_create(slurmdb_destroy_used_limits); + + if (!(used_limits = list_find_first(*acct_limit_list, + _find_used_limits_for_acct, + acct))) { + int i = sizeof(uint64_t) * slurmctld_tres_cnt; + + used_limits = xmalloc(sizeof(slurmdb_used_limits_t)); + used_limits->acct = xstrdup(acct); + + used_limits->tres = xmalloc(i); + used_limits->tres_run_mins = xmalloc(i); + + list_append(*acct_limit_list, used_limits); + } + + return used_limits; +} + static int _find_used_limits_for_user(void *x, void *key) { slurmdb_used_limits_t *used_limits = (slurmdb_used_limits_t *)x; @@ -1437,21 +1469,15 @@ static int _qos_policy_validate(job_desc_msg_t *job_desc, if ((qos_out_ptr->max_submit_jobs_pa == INFINITE) && (qos_ptr->max_submit_jobs_pa != INFINITE)) { - slurmdb_used_limits_t *used_limits = NULL; - - if (qos_ptr->usage->user_limit_list) - used_limits = list_find_first( - qos_ptr->usage->acct_limit_list, - _find_used_limits_for_acct, + slurmdb_used_limits_t *used_limits = + _get_acct_used_limits( + &qos_ptr->usage->acct_limit_list, assoc_ptr->acct); qos_out_ptr->max_submit_jobs_pa = qos_ptr->max_submit_jobs_pa; - if ((!used_limits && - qos_ptr->max_submit_jobs_pa == 0) || - (used_limits && - ((used_limits->submit_jobs + job_cnt) > - qos_ptr->max_submit_jobs_pa))) { + if ((used_limits->submit_jobs + job_cnt) > + qos_ptr->max_submit_jobs_pa) { if (reason) *reason = WAIT_QOS_MAX_SUB_JOB_PER_ACCT; debug2("job submit for account %s: "