From 4831cb131b1c1c3fa5ecb125154b6b419c058a3d Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Tue, 17 Dec 2002 23:43:22 +0000
Subject: [PATCH] No changes to logic, just broke code into separate functions.

---
 src/slurmctld/job_mgr.c | 113 +++++++++++++++++++++++-----------------
 1 file changed, 64 insertions(+), 49 deletions(-)

diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index f73c1f7295b..f2705de0b5b 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -117,6 +117,7 @@ static int  _job_create(job_desc_msg_t * job_specs, uint32_t * new_job_id,
 		        struct job_record **job_rec_ptr, uid_t submit_uid);
 static void _list_delete_job(void *job_entry);
 static int  _list_find_job_old(void *job_entry, void *key);
+static void _pack_job_details(struct job_details *detail_ptr, Buf buffer);
 static void _read_data_array_from_file(char *file_name, char ***data,
 				       uint16_t * size);
 static void _read_data_from_file(char *file_name, char **data);
@@ -126,6 +127,7 @@ static void _signal_job_on_node(uint32_t job_id, uint16_t step_id,
 				int signum, struct node_record *node_ptr);
 static void _spawn_signal_agent(agent_arg_t *agent_info);
 static bool _top_priority(struct job_record *job_ptr);
+static int  _unload_step_state(struct job_record *job_ptr, Buf buffer);
 static int  _validate_job_desc(job_desc_msg_t * job_desc_msg, int allocate);
 static int  _validate_job_create_req(job_desc_msg_t * job_desc);
 static int  _write_data_to_file(char *file_name, char *data);
@@ -697,51 +699,8 @@ int load_job_state(void)
 
 		safe_unpack16(&step_flag, buffer);
 		while (step_flag == STEP_FLAG) {
-			struct step_record *step_ptr;
-			uint16_t step_id, cyclic_alloc;
-			uint32_t num_tasks;
-			time_t start_time;
-			char *node_list;
-
-			safe_unpack16(&step_id, buffer);
-			safe_unpack16(&cyclic_alloc, buffer);
-			safe_unpack32(&num_tasks, buffer);
-			safe_unpack_time(&start_time, buffer);
-			safe_unpackstr_xmalloc(&node_list, &name_len,
-					       buffer);
-
-			/* validity test as possible */
-			if (cyclic_alloc > 1) {
-				error
-				    ("Invalid data for job %u.%u: cyclic_alloc=%u",
-				     job_id, step_id, cyclic_alloc);
-				error
-				    ("No more job data will be processed from the checkpoint file");
-				error_code = EINVAL;
-				break;
-			}
-
-			step_ptr = create_step_record(job_ptr);
-			if (step_ptr == NULL)
-				break;
-			step_ptr->step_id = step_id;
-			step_ptr->cyclic_alloc = cyclic_alloc;
-			step_ptr->num_tasks = num_tasks;
-			step_ptr->start_time = start_time;
-			info("recovered job step %u.%u", job_id, step_id);
-			if (node_list) {
-				(void) node_name2bitmap(node_list,
-							&(step_ptr->
-							  node_bitmap));
-				xfree(node_list);
-			}
-#ifdef HAVE_LIBELAN3
-			qsw_alloc_jobinfo(&step_ptr->qsw_job);
-			if (qsw_unpack_jobinfo(step_ptr->qsw_job, buffer)) {
-				qsw_free_jobinfo(step_ptr->qsw_job);
+			if ((error_code = _unload_step_state(job_ptr, buffer)))
 				goto unpack_error;
-			}
-#endif
 			safe_unpack16(&step_flag, buffer);
 		}
 		if (error_code)
@@ -781,6 +740,54 @@ int load_job_state(void)
 	return EFAULT;
 }
 
+/* Unpack a job step state information from a buffer */
+static int _unload_step_state(struct job_record *job_ptr, Buf buffer)
+{
+	struct step_record *step_ptr;
+	uint16_t step_id, cyclic_alloc, name_len;
+	uint32_t num_tasks;
+	time_t start_time;
+	char *node_list = NULL;
+
+	safe_unpack16(&step_id, buffer);
+	safe_unpack16(&cyclic_alloc, buffer);
+	safe_unpack32(&num_tasks, buffer);
+	safe_unpack_time(&start_time, buffer);
+	safe_unpackstr_xmalloc(&node_list, &name_len, buffer);
+
+	/* validity test as possible */
+	if (cyclic_alloc > 1) {
+		error("Invalid data for job %u.%u: cyclic_alloc=%u",
+		      job_ptr->job_id, step_id, cyclic_alloc);
+		return SLURM_FAILURE;
+	}
+
+	step_ptr = create_step_record(job_ptr);
+	if (step_ptr == NULL)
+		return SLURM_FAILURE;
+	step_ptr->step_id = step_id;
+	step_ptr->cyclic_alloc = cyclic_alloc;
+	step_ptr->num_tasks = num_tasks;
+	step_ptr->start_time = start_time;
+	info("recovered job step %u.%u", job_ptr->job_id, step_id);
+	if (node_list) {
+		(void) node_name2bitmap(node_list, &(step_ptr->node_bitmap));
+		FREE_NULL(node_list);
+	}
+#ifdef HAVE_LIBELAN3
+	qsw_alloc_jobinfo(&step_ptr->qsw_job);
+	if (qsw_unpack_jobinfo(step_ptr->qsw_job, buffer)) {
+		qsw_free_jobinfo(step_ptr->qsw_job);
+		return SLURM_FAILURE;
+	}
+#endif
+	return SLURM_SUCCESS;
+
+      unpack_error:
+	FREE_NULL(node_list);
+	return SLURM_FAILURE;
+}
+
 /* _add_job_hash - add a job hash entry for given job record, job_id must  
  *	already be set
  * IN job_ptr - pointer to job record
@@ -2057,9 +2064,16 @@ void pack_job(struct job_record *dump_job_ptr, Buf buffer)
 		packstr(NULL, buffer);
 
 	detail_ptr = dump_job_ptr->details;
-	if (detail_ptr && dump_job_ptr->job_state == JOB_PENDING) {
-		if (detail_ptr->magic != DETAILS_MAGIC)
-			fatal("dump_all_job: job detail integrity is bad");
+	if (detail_ptr && dump_job_ptr->job_state == JOB_PENDING)
+		_pack_job_details(detail_ptr, buffer);
+	else
+		_pack_job_details(NULL, buffer);
+}
+
+static void _pack_job_details(struct job_details *detail_ptr, Buf buffer)
+{
+	if (detail_ptr) {
+		char tmp_str[MAX_STR_PACK];
 		pack32((uint32_t) detail_ptr->num_procs, buffer);
 		pack32((uint32_t) detail_ptr->num_nodes, buffer);
 		pack16((uint16_t) detail_ptr->shared, buffer);
@@ -2095,7 +2109,9 @@ void pack_job(struct job_record *dump_job_ptr, Buf buffer)
 			tmp_str[MAX_STR_PACK - 1] = (char) NULL;
 			packstr(tmp_str, buffer);
 		}
-	} else {
+	} 
+
+	else {
 		pack32((uint32_t) 0, buffer);
 		pack32((uint32_t) 0, buffer);
 		pack16((uint16_t) 0, buffer);
@@ -2110,7 +2126,6 @@ void pack_job(struct job_record *dump_job_ptr, Buf buffer)
 		packstr(NULL, buffer);
 	}
 }
-
 /*
  * purge_old_job - purge old job records. 
  *	the jobs must have completed at least MIN_JOB_AGE minutes ago
-- 
GitLab