diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index d42b25c2e926ff6cce9fd3dfe924e94a1e45eeb5..686454ccdcb0ae037ee27321a04f69e0aa63b92e 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); }