From 55dbb044fc19defa926a03631a3c6180486a9f0d Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Fri, 28 Jul 2017 14:15:07 -0600
Subject: [PATCH] Fix some pack job related memory leaks as found by valgrind

---
 src/plugins/sched/backfill/backfill.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/plugins/sched/backfill/backfill.c b/src/plugins/sched/backfill/backfill.c
index a038c2d5891..7d430d49f3f 100644
--- a/src/plugins/sched/backfill/backfill.c
+++ b/src/plugins/sched/backfill/backfill.c
@@ -1063,6 +1063,8 @@ static int _attempt_backfill(void)
 	/* The Basil inventory can take a long time to complete. Process
 	 * pending RPCs before starting the backfill scheduling logic */
 	_yield_locks(1000000);
+	if (stop_backfill)
+		return SLURM_SUCCESS;
 #endif
 	(void) bb_g_load_state(false);
 
@@ -1202,6 +1204,8 @@ static int _attempt_backfill(void)
 				rc = 1;
 				break;
 			}
+			if (stop_backfill)
+				break;
 			/* Reset backfill scheduling timers, resume testing */
 			sched_start = time(NULL);
 			gettimeofday(&start_tv, NULL);
@@ -1679,6 +1683,8 @@ next_task:
 				rc = 1;
 				break;
 			}
+			if (stop_backfill)
+				break;
 
 			/* Reset backfill scheduling timers, resume testing */
 			sched_start = time(NULL);
@@ -2668,7 +2674,7 @@ static void _pack_start_clear(void)
 	iter = list_iterator_create(pack_job_list);
 	while ((map = (pack_job_map_t *) list_next(iter))) {
 		if (map->prev_start == 0) {
-			list_remove(iter);
+			list_delete_item(iter);
 		} else {
 			map->prev_start = 0;
 			(void) list_delete_all(map->pack_job_list,
@@ -2930,6 +2936,7 @@ static bool _pack_job_limit_check(pack_job_map_t *map, time_t now)
 			job_ptr->end_time_exp = now;
 			acct_policy_job_fini(job_ptr);
 			job_ptr->end_time_exp = end_time_exp;
+			xfree(job_ptr->tres_alloc_cnt);
 			job_ptr->tres_alloc_cnt = tres_alloc_save[fini_jobs++];
 		}
 	}
@@ -2971,6 +2978,7 @@ static int _pack_start_now(pack_job_map_t *map, node_space_map_t *node_space)
 			error("Pack job %u+%u (%u) failed to start due to reservation",
 			      job_ptr->pack_job_id, job_ptr->pack_job_offset,
 			      job_ptr->job_id);
+			FREE_NULL_BITMAP(avail_bitmap);
 			break;
 		}
 		bit_and(avail_bitmap, job_ptr->part_ptr->node_bitmap);
@@ -2982,17 +2990,20 @@ static int _pack_start_now(pack_job_map_t *map, node_space_map_t *node_space)
 			bit_and_not(avail_bitmap,
 				job_ptr->details->exc_node_bitmap);
 		}
-		resv_bitmap = bit_copy(avail_bitmap);
-		bit_not(resv_bitmap);
 
 		if (fed_mgr_job_lock(job_ptr)) {
 			error("Pack job %u+%u (%u) failed to start due to fed job lock",
 			      job_ptr->pack_job_id, job_ptr->pack_job_offset,
 			      job_ptr->job_id);
+			FREE_NULL_BITMAP(avail_bitmap);
 			continue;
 		}
 
+		resv_bitmap = avail_bitmap;
+		avail_bitmap = NULL;
+		bit_not(resv_bitmap);
 		rc = _start_job(job_ptr, resv_bitmap);
+		FREE_NULL_BITMAP(resv_bitmap);
 		if (rc == SLURM_SUCCESS) {
 			/* If the following fails because of network
 			 * connectivity, the origin cluster should ask
-- 
GitLab