From b881e598d39fad44b7ecaae9b1ab3e41bd194e53 Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Fri, 8 Aug 2014 11:23:34 -0700
Subject: [PATCH] Fix MaxJobCount for job arrays

This part handles the decrement portion of logic.
---
 src/slurmctld/job_mgr.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index d42b25c2e92..686454ccdcb 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -3532,7 +3532,6 @@ static void _create_job_array(struct job_record *job_ptr,
 	job_specs->array_bitmap = NULL;
 	job_ptr->array_recs->task_cnt =
 		bit_set_count(job_ptr->array_recs->task_id_bitmap);
-
 }
 
 /*
@@ -6832,7 +6831,7 @@ static void _list_delete_job(void *job_entry)
 {
 	struct job_record *job_ptr = (struct job_record *) job_entry;
 	struct job_record **job_pptr, *tmp_ptr;
-	int i;
+	int job_array_size, i;
 
 	xassert(job_entry);
 	xassert (job_ptr->magic == JOB_MAGIC);
@@ -6850,6 +6849,12 @@ static void _list_delete_job(void *job_entry)
 	else
 		*job_pptr = job_ptr->job_next;
 
+	if (job_ptr->array_recs) {
+		job_array_size = MAX(1, job_ptr->array_recs->task_cnt);
+	} else {
+		job_array_size = 1;
+	}
+
 	/* Remove the record from job array hash tables, if applicable */
 	if (job_ptr->array_task_id != NO_VAL) {
 		job_pptr = &job_array_hash_j[
@@ -6921,7 +6926,12 @@ static void _list_delete_job(void *job_entry)
 	step_list_purge(job_ptr);
 	select_g_select_jobinfo_free(job_ptr->select_jobinfo);
 	xfree(job_ptr->wckey);
-	job_count--;
+	if (job_array_size > job_count) {
+		error("job_count underflow");
+		job_count = 0;
+	} else {
+		job_count -= job_array_size;
+	}
 	xfree(job_ptr);
 }
 
-- 
GitLab