From 431d62cdae6beb965e317fc6b7325da63ca8ca41 Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Wed, 4 Jun 2008 23:59:41 +0000 Subject: [PATCH] Add full logic for support of association's MaxJobs --- src/common/assoc_mgr.c | 18 ++++++++++++++++++ src/common/assoc_mgr.h | 6 ++++++ src/slurmctld/acct_policy.c | 7 ++++++- src/slurmctld/read_config.c | 11 ++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/common/assoc_mgr.c b/src/common/assoc_mgr.c index 1a35ca43221..97783e883de 100644 --- a/src/common/assoc_mgr.c +++ b/src/common/assoc_mgr.c @@ -673,3 +673,21 @@ extern int assoc_mgr_validate_assoc_id(void *db_conn, return SLURM_ERROR; } +extern void assoc_mgr_clear_used_info(void) +{ + ListIterator itr = NULL; + acct_association_rec_t * found_assoc = NULL; + + if (!local_association_list) + return; + + slurm_mutex_lock(&local_association_lock); + itr = list_iterator_create(local_association_list); + while((found_assoc = list_next(itr))) { + found_assoc->used_jobs = 0; + found_assoc->used_share = 0; + } + list_iterator_destroy(itr); + slurm_mutex_unlock(&local_association_lock); +} + diff --git a/src/common/assoc_mgr.h b/src/common/assoc_mgr.h index d0d1826c53e..baec27dc783 100644 --- a/src/common/assoc_mgr.h +++ b/src/common/assoc_mgr.h @@ -120,4 +120,10 @@ extern int assoc_mgr_validate_assoc_id(void *db_conn, uint32_t assoc_id, int enforce); +/* + * clear the used_* fields from every assocation, + * used on reconfiguration + */ +extern void assoc_mgr_clear_used_info(void); + #endif /* _SLURM_ASSOC_MGR_H */ diff --git a/src/slurmctld/acct_policy.c b/src/slurmctld/acct_policy.c index b0cb78b006a..10daf04456c 100644 --- a/src/slurmctld/acct_policy.c +++ b/src/slurmctld/acct_policy.c @@ -46,6 +46,8 @@ #include "src/slurmctld/slurmctld.h" +#define _DEBUG 0 + static bool _valid_job_assoc(struct job_record *job_ptr) { acct_association_rec_t assoc_rec, *assoc_ptr; @@ -61,7 +63,8 @@ static bool _valid_job_assoc(struct job_record *job_ptr) assoc_rec.acct = job_ptr->account; if (assoc_mgr_fill_in_assoc(acct_db_conn, &assoc_rec, accounting_enforce, &assoc_ptr)) { - info("_validate_job_assoc: invalid account or " "partition for uid=%u jobid=%u", + info("_validate_job_assoc: invalid account or " + "partition for uid=%u jobid=%u", job_ptr->user_id, job_ptr->job_id); return false; } @@ -119,8 +122,10 @@ extern bool acct_policy_job_runnable(struct job_record *job_ptr) return false; assoc_ptr = job_ptr->assoc_ptr; +#if _DEBUG info("acct_job_limits: %u of %u", assoc_ptr->used_jobs, assoc_ptr->max_jobs); +#endif if ((assoc_ptr->max_jobs != NO_VAL) && (assoc_ptr->max_jobs != INFINITE) && diff --git a/src/slurmctld/read_config.c b/src/slurmctld/read_config.c index bf839eb66c2..97512805581 100644 --- a/src/slurmctld/read_config.c +++ b/src/slurmctld/read_config.c @@ -55,6 +55,7 @@ #include <time.h> #include <unistd.h> +#include "src/common/assoc_mgr.h" #include "src/common/hostlist.h" #include "src/common/list.h" #include "src/common/macros.h" @@ -66,6 +67,7 @@ #include "src/common/switch.h" #include "src/common/xstring.h" +#include "src/slurmctld/acct_policy.h" #include "src/slurmctld/job_scheduler.h" #include "src/slurmctld/licenses.h" #include "src/slurmctld/locks.h" @@ -816,7 +818,7 @@ int read_slurm_conf(int recover) _purge_old_node_state(old_node_table_ptr, old_node_record_count); if ((rc = _build_bitmaps())) - return rc; /* fatal error */ + fatal("_build_bitmaps failure"); license_free(); if (license_init(slurmctld_conf.licenses) != SLURM_SUCCESS) @@ -1175,6 +1177,7 @@ static void _validate_node_proc_count(void) /* * _restore_job_dependencies - Build depend_list and license_list for every job + * also reset the runing job count for scheduling policy */ static int _restore_job_dependencies(void) { @@ -1185,8 +1188,14 @@ static int _restore_job_dependencies(void) bool valid; List license_list; + assoc_mgr_clear_used_info(); job_iterator = list_iterator_create(job_list); while ((job_ptr = (struct job_record *) list_next(job_iterator))) { + if (accounting_enforce && + ((job_ptr->job_state == JOB_RUNNING) || + (job_ptr->job_state == JOB_SUSPENDED))) + acct_policy_job_begin(job_ptr); + license_list = license_job_validate(job_ptr->licenses, &valid); if (job_ptr->license_list) list_destroy(job_ptr->license_list); -- GitLab