From 94bebf38bb3c76b8971ff2ce3ecf49a96045e050 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@schedmd.com>
Date: Thu, 25 Oct 2012 16:43:41 -0700
Subject: [PATCH] Accounting - if jobacct_gather/none is used don't start
 polling thread and alloc and such jobacctinfo.

---
 src/common/slurm_jobacct_gather.c | 56 +++++++++++++++++++++++++------
 1 file changed, 46 insertions(+), 10 deletions(-)

diff --git a/src/common/slurm_jobacct_gather.c b/src/common/slurm_jobacct_gather.c
index 88e0e33a81a..d5b1c4ef405 100644
--- a/src/common/slurm_jobacct_gather.c
+++ b/src/common/slurm_jobacct_gather.c
@@ -106,6 +106,7 @@ static pthread_mutex_t task_list_lock = PTHREAD_MUTEX_INITIALIZER;
 
 static bool jobacct_shutdown = true;
 static bool jobacct_suspended = 0;
+static bool plugin_polling = true;
 
 static uint32_t jobacct_job_id     = 0;
 static uint32_t jobacct_step_id    = 0;
@@ -226,8 +227,10 @@ extern int jobacct_gather_init(void)
 		goto done;
 	}
 
-	if (!strcasecmp(type, "jobacct_gather/none"))
+	if (!strcasecmp(type, "jobacct_gather/none")) {
+		plugin_polling = false;
 		goto done;
+	}
 
 	plugin_type = type;
 	type = slurm_get_proctrack_type();
@@ -277,6 +280,9 @@ extern int jobacct_gather_startpoll(uint16_t frequency)
 	pthread_attr_t attr;
 	pthread_t _watch_tasks_thread_id;
 
+	if (!plugin_polling)
+		return SLURM_SUCCESS;
+
 	if (jobacct_gather_init() < 0)
 		return SLURM_ERROR;
 
@@ -291,7 +297,7 @@ extern int jobacct_gather_startpoll(uint16_t frequency)
 
 	task_list = list_create(jobacctinfo_destroy);
 	if (frequency == 0) {	/* don't want dynamic monitoring? */
-		debug2("jobacct AIX dynamic logging disabled");
+		debug2("jobacct_gather dynamic logging disabled");
 		return retval;
 	}
 
@@ -302,11 +308,11 @@ extern int jobacct_gather_startpoll(uint16_t frequency)
 
 	if  (pthread_create(&_watch_tasks_thread_id, &attr,
 			    &_watch_tasks, NULL)) {
-		debug("jobacct-gather failed to create _watch_tasks "
+		debug("jobacct_gather failed to create _watch_tasks "
 		      "thread: %m");
 		frequency = 0;
 	} else
-		debug3("jobacct-gather AIX dynamic logging enabled");
+		debug3("jobacct_gather dynamic logging enabled");
 	slurm_attr_destroy(&attr);
 
 	return retval;
@@ -336,7 +342,7 @@ extern void jobacct_gather_change_poll(uint16_t frequency)
 	if (jobacct_gather_init() < 0)
 		return;
 
-	if (freq == 0 && frequency != 0) {
+	if (plugin_polling && freq == 0 && frequency != 0) {
 		pthread_attr_t attr;
 		pthread_t _watch_tasks_thread_id;
 		/* create polling thread */
@@ -381,6 +387,9 @@ extern int jobacct_gather_add_task(pid_t pid, jobacct_id_t *jobacct_id)
 	if (jobacct_gather_init() < 0)
 		return SLURM_ERROR;
 
+	if (!plugin_polling)
+		return SLURM_SUCCESS;
+
 	if (jobacct_shutdown)
 		return SLURM_ERROR;
 
@@ -413,7 +422,7 @@ error:
 
 extern jobacctinfo_t *jobacct_gather_stat_task(pid_t pid)
 {
-	if (jobacct_shutdown)
+	if (!plugin_polling || jobacct_shutdown)
 		return NULL;
 	else if (pid) {
 		struct jobacctinfo *jobacct = NULL;
@@ -460,7 +469,7 @@ extern jobacctinfo_t *jobacct_gather_remove_task(pid_t pid)
 	struct jobacctinfo *jobacct = NULL;
 	ListIterator itr = NULL;
 
-	if (jobacct_shutdown)
+	if (!plugin_polling || jobacct_shutdown)
 		return NULL;
 
 	slurm_mutex_lock(&task_list_lock);
@@ -490,7 +499,7 @@ error:
 
 extern int jobacct_gather_set_proctrack_container_id(uint64_t id)
 {
-	if (pgid_plugin)
+	if (!plugin_polling || pgid_plugin)
 		return SLURM_SUCCESS;
 
 	if (cont_id != (uint64_t)NO_VAL)
@@ -511,6 +520,9 @@ extern int jobacct_gather_set_proctrack_container_id(uint64_t id)
 extern int jobacct_gather_set_mem_limit(uint32_t job_id, uint32_t step_id,
 					uint32_t mem_limit)
 {
+	if (!plugin_polling)
+		return SLURM_SUCCESS;
+
 	if ((job_id == 0) || (mem_limit == 0)) {
 		error("jobacct_gather_set_mem_limit: jobid:%u mem_limit:%u",
 		      job_id, mem_limit);
@@ -528,6 +540,9 @@ extern int jobacct_gather_set_mem_limit(uint32_t job_id, uint32_t step_id,
 extern void jobacct_gather_handle_mem_limit(
 	uint32_t total_job_mem, uint32_t total_job_vsize)
 {
+	if (!plugin_polling)
+		return;
+
 	if (jobacct_mem_limit) {
 		if (jobacct_step_id == NO_VAL) {
 			debug("Job %u memory used:%u limit:%u KB",
@@ -568,7 +583,12 @@ extern void jobacct_gather_handle_mem_limit(
 
 extern jobacctinfo_t *jobacctinfo_create(jobacct_id_t *jobacct_id)
 {
-	struct jobacctinfo *jobacct = xmalloc(sizeof(struct jobacctinfo));
+	struct jobacctinfo *jobacct;
+
+	if (!plugin_polling)
+		return NULL;
+
+	jobacct = xmalloc(sizeof(struct jobacctinfo));
 
 	if (!jobacct_id) {
 		jobacct_id_t temp_id;
@@ -614,6 +634,9 @@ extern int jobacctinfo_setinfo(jobacctinfo_t *jobacct,
 	jobacct_id_t *jobacct_id = (jobacct_id_t *) data;
 	struct jobacctinfo *send = (struct jobacctinfo *) data;
 
+	if (!plugin_polling)
+		return SLURM_SUCCESS;
+
 	switch (type) {
 	case JOBACCT_DATA_TOTAL:
 		memcpy(jobacct, send, sizeof(struct jobacctinfo));
@@ -682,6 +705,9 @@ extern int jobacctinfo_getinfo(
 	struct rusage *rusage = (struct rusage *)data;
 	struct jobacctinfo *send = (struct jobacctinfo *) data;
 
+	if (!plugin_polling)
+		return SLURM_SUCCESS;
+
 	switch (type) {
 	case JOBACCT_DATA_TOTAL:
 		memcpy(send, jobacct, sizeof(struct jobacctinfo));
@@ -746,6 +772,9 @@ extern void jobacctinfo_pack(jobacctinfo_t *jobacct,
 {
 	int i = 0;
 
+	if (!plugin_polling && (protocol_type != PROTOCOL_TYPE_DBD))
+		return;
+
 	/* The function can take calls from both DBD and from regular
 	 * SLURM functions.  We choose to standardize on using the
 	 * SLURM_PROTOCOL_VERSION here so if PROTOCOL_TYPE_DBD comes
@@ -759,7 +788,8 @@ extern void jobacctinfo_pack(jobacctinfo_t *jobacct,
 	if (protocol_type == PROTOCOL_TYPE_DBD)
 		rpc_version = slurmdbd_translate_rpc(rpc_version);
 
-	if (!jobacct) {
+	/* pack an empty record */
+	if (!jobacct || (jobacct->min_cpu == NO_VAL)) {
 		for (i = 0; i < 12; i++)
 			pack32((uint32_t)NO_VAL, buffer);
 		for (i = 0; i < 4; i++)
@@ -792,6 +822,9 @@ extern int jobacctinfo_unpack(jobacctinfo_t **jobacct,
 {
 	uint32_t uint32_tmp;
 
+	if (!plugin_polling && (protocol_type != PROTOCOL_TYPE_DBD))
+		return SLURM_SUCCESS;
+
 	/* The function can take calls from both DBD and from regular
 	 * SLURM functions.  We choose to standardize on using the
 	 * SLURM_PROTOCOL_VERSION here so if PROTOCOL_TYPE_DBD comes
@@ -847,6 +880,9 @@ unpack_error:
 
 extern void jobacctinfo_aggregate(jobacctinfo_t *dest, jobacctinfo_t *from)
 {
+	if (!plugin_polling)
+		return;
+
 	xassert(dest);
 
 	if (!from || (from->min_cpu == (uint32_t)NO_VAL))
-- 
GitLab