From c6f1ce6d3e188c330531d298d0385922ca1eee39 Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Fri, 14 Nov 2003 19:59:32 +0000 Subject: [PATCH] Add logic to propogate a batch script's argc & argv. Save and restore batch script's argc & argv across slurmctld restarts. --- src/slurmctld/job_mgr.c | 21 ++++++++++++++++++++- src/slurmctld/job_scheduler.c | 21 +++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index 7d2ecf37013..84abb7347b4 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -187,11 +187,15 @@ struct job_record *create_job_record(int *error_code) */ void delete_job_details(struct job_record *job_entry) { + int i; + if (job_entry->details == NULL) return; _delete_job_desc_files(job_entry->job_id); xassert (job_entry->details->magic == DETAILS_MAGIC); + for (i=0; i<job_entry->details->argc; i++) + xfree(job_entry->details->argv[i]); xfree(job_entry->details->argv); xfree(job_entry->details->req_nodes); xfree(job_entry->details->exc_nodes); @@ -594,6 +598,8 @@ void _dump_job_details(struct job_details *detail_ptr, Buf buffer) packstr(detail_ptr->in, buffer); packstr(detail_ptr->out, buffer); packstr(detail_ptr->work_dir, buffer); + + packstr_array(detail_ptr->argv, detail_ptr->argc, buffer); } /* _load_job_details - Unpack a job details information from buffer */ @@ -601,11 +607,13 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer) { char *req_nodes = NULL, *exc_nodes = NULL, *features = NULL; char *err = NULL, *in = NULL, *out = NULL, *work_dir = NULL; + char **argv = (char **) NULL; bitstr_t *req_node_bitmap = NULL, *exc_node_bitmap = NULL; uint32_t num_procs, min_nodes, max_nodes, min_procs; - uint16_t shared, contiguous, name_len; + uint16_t argc = 0, shared, contiguous, name_len; uint32_t min_memory, min_tmp_disk, total_procs; time_t submit_time; + int i; /* unpack the job's details from the buffer */ safe_unpack32(&num_procs, buffer); @@ -630,6 +638,8 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer) safe_unpackstr_xmalloc(&out, &name_len, buffer); safe_unpackstr_xmalloc(&work_dir, &name_len, buffer); + safe_unpackstr_array(&argv, &argc, buffer); + /* validity test as possible */ if ((shared > 1) || (contiguous > 1)) { error("Invalid data for job %u: shared=%u contiguous=%u", @@ -647,6 +657,7 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer) goto unpack_error; } + /* free any left-over detail data */ xfree(job_ptr->details->req_nodes); FREE_NULL_BITMAP(job_ptr->details->req_node_bitmap); @@ -657,6 +668,9 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer) xfree(job_ptr->details->in); xfree(job_ptr->details->out); xfree(job_ptr->details->work_dir); + for (i=0; i<job_ptr->details->argc; i++) + xfree(job_ptr->details->argv[i]); + xfree(job_ptr->details->argv); /* now put the details into the job record */ job_ptr->details->num_procs = num_procs; @@ -678,6 +692,8 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer) job_ptr->details->in = in; job_ptr->details->out = out; job_ptr->details->work_dir = work_dir; + job_ptr->details->argc = argc; + job_ptr->details->argv = argv; return SLURM_SUCCESS; @@ -691,6 +707,9 @@ static int _load_job_details(struct job_record *job_ptr, Buf buffer) xfree(in); xfree(out); xfree(work_dir); +/* for (i=0; i<argc; i++) + xfree(argv[i]); Don't trust this on unpack error */ + xfree(argv); return SLURM_FAILURE; } diff --git a/src/slurmctld/job_scheduler.c b/src/slurmctld/job_scheduler.c index 48ba563a0a9..70cdf28cec3 100644 --- a/src/slurmctld/job_scheduler.c +++ b/src/slurmctld/job_scheduler.c @@ -54,6 +54,7 @@ static int _build_job_queue(struct job_queue **job_queue); static void _launch_job(struct job_record *job_ptr); static void _sort_job_queue(struct job_queue *job_queue, int job_queue_size); +static char **_xduparray(uint16_t size, char ** array); /* * _build_job_queue - build (non-priority ordered) list of pending jobs @@ -264,8 +265,9 @@ static void _launch_job(struct job_record *job_ptr) launch_msg_ptr->in = xstrdup(job_ptr->details->in); launch_msg_ptr->out = xstrdup(job_ptr->details->out); launch_msg_ptr->work_dir = xstrdup(job_ptr->details->work_dir); - launch_msg_ptr->argc = 0; /* FIXME */ - launch_msg_ptr->argv = NULL; /* FIXME */ + launch_msg_ptr->argc = job_ptr->details->argc; + launch_msg_ptr->argv = _xduparray(job_ptr->details->argc, + job_ptr->details->argv); launch_msg_ptr->script = get_job_script(job_ptr); launch_msg_ptr->environment = get_job_env(job_ptr, &launch_msg_ptr->envc); @@ -299,3 +301,18 @@ static void _launch_job(struct job_record *job_ptr) sleep(1); /* sleep and try again */ } } + +static char ** +_xduparray(uint16_t size, char ** array) +{ + int i; + char ** result; + + if (size == 0) + return (char **)NULL; + + result = (char **) xmalloc(sizeof(char *) * size); + for (i=0; i<size; i++) + result[i] = xstrdup(array[i]); + return result; +} -- GitLab