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