diff --git a/doc/html/jobacctplugins.shtml b/doc/html/jobacctplugins.shtml index 8aa51658cbc6a0ce6374ba348aad41fd2bc1d6f8..9c4b7154f5e9ea9c36f2d04e6be031939b103764 100644 --- a/doc/html/jobacctplugins.shtml +++ b/doc/html/jobacctplugins.shtml @@ -90,21 +90,23 @@ jobacct_p_add_task() used to add a task to the poller. <p class="commandline">jobacctinfo_t *jobacct_p_stat_task(pid_t pid) <p style="margin-left:.2in"><b>Description</b>: jobacct_p_stat_task() used to get most recent information about task. -DO NOT FREE the information returned by this function! +You need to FREE the information returned by this function! <p style="margin-left:.2in"><b>Arguments</b>: <span class="commandline"> pid</span> (input) Process id <p style="margin-left:.2in"><b>Returns</b>: <span class="commandline">jobacctinfo structure pointer</span> on success, or <span class="commandline">NULL</span> on failure. -<p class="commandline">int jobacct_p_remove_task(pid_t pid) +<p class="commandline">jobacctinfo_t *jobacct_p_remove_task(pid_t pid) <p style="margin-left:.2in"><b>Description</b>: jobacct_p_remove_task() used to remove a task from the poller. +You need to FREE the information returned by this function! <p style="margin-left:.2in"><b>Arguments</b>: <span class="commandline"> pid</span> (input) Process id <p style="margin-left:.2in"><b>Returns</b>: -<span class="commandline">SLURM_SUCCESS</span> on success, or -<span class="commandline">SLURM_FAILURE</span> on failure. +<span class="commandline">Pointer to removed jobacctinfo_t structure</span> +on success, or +<span class="commandline">NULL</span> on failure. <p class="footer"><a href="#top">top</a> @@ -279,6 +281,19 @@ different jobacctinfo structures. <p style="margin-left:.2in"><b>Returns</b>: <span class="commandline">none</span> +<p class="commandline"> +void jobacct_p_2_sacct(sacct_t *sacct, jobacctinfo_t *jobacct) +<p style="margin-left:.2in"><b>Description</b>: +jobacct_p_2_sacct() is called to transfer information from data structure +jobacct to structure sacct. +<p style="margin-left:.2in"><b>Arguments</b>: +<span class="commandline">sacct</span> +(input/output) initial structure to be applied to. +<span class="commandline">jobacct</span> +(input) jobacctinfo_t structure containing information to apply to sacct. +<p style="margin-left:.2in"><b>Returns</b>: +<span class="commandline">none</span> + <p class="commandline"> void jobacct_p_pack(jobacctinfo_t *jobacct, Buf buffer) <p style="margin-left:.2in"><b>Description</b>: diff --git a/doc/man/man1/sacct.1 b/doc/man/man1/sacct.1 index b3c5ad28f70558574feaf47446c5b2839c620e78..47effd83fa92dae62de29bc5383f5d90d51b76eb 100644 --- a/doc/man/man1/sacct.1 +++ b/doc/man/man1/sacct.1 @@ -20,7 +20,7 @@ command displays job accounting data stored in the job accounting log file in a variety of forms for your analysis. The .BR "sacct " -command displays information on jobs, job steps, status, and errors by +command displays information on jobs, job steps, status, and exitcodes by default. You can tailor the output with the use of the \f3--fields=\fP @@ -64,13 +64,13 @@ Displays a brief listing, which includes the following data: .RS .TP "3" \(bu -\f3jobstep\fP +\f3jobid\fP .TP "3" \(bu \f3status\fP .TP "3" \(bu -\f3error\fP +\f3exitcode\fP .RE .IP This option has no effect when the @@ -130,8 +130,8 @@ Thus, the following two commands display the same data but in different order: .PP .nf .ft 3 -# sacct --fields=jobstep,status -Jobstep Status +# sacct --fields=jobid,status +Jobid Status ---------- ---------- 3 COMPLETED 3.0 COMPLETED @@ -143,8 +143,8 @@ Jobstep Status .PP .nf .ft 3 -# sacct --fields=status,jobstep -Status Jobstep +# sacct --fields=status,jobid +Status Jobid ---------- ---------- COMPLETED 3 COMPLETED 3.0 @@ -156,7 +156,7 @@ COMPLETED 3.0 The default value for the \f2field_list\fP operand is -\f3"jobstep,partition,process,ncpus,status,error"\fP\c +\f3"jobid,partition,process,ncpus,status,exitcode"\fP\c \&. .IP This option has no effect when the @@ -198,15 +198,16 @@ option. .nf .ft 3 Fields available: - cpu elapsed error finished + cpu elapsed exitcode blockid gid group idrss inblocks isrss ixrss job jobname - jobstep majflt minflt msgrcv + jobid majflt minflt msgrcv msgsnd ncpus nivcsw nodes - nprocs nsignals nswap ntasks + nprocs ntasks nsignals nswap nvcsw outblocks partition psize rss status submitted systemcpu uid user usercpu vsize + cputime .ft 1 .fi @@ -214,17 +215,17 @@ Fields available: .IP The section titled "Job Accounting Fields" describes these fields. .TP -\f3\-j \fP\f2job_list\fP \f3,\fP \f3--jobs\fP\f3=\fP\f2job_list\fP -Displays information about the specified job or list of jobs. +\f3\-j \fP\f2job(.step)\fP \f3,\fP \f3--jobs\fP\f3=\fP\f2job(.step)\fP +Displays information about the specified job(.step) or list of job(.step)s. .IP The -\f2job_list\fP +\f2job(.step)\fP parameter is a comma-separated list of jobs. Space characters are not permitted in this list. .IP The default is to display information on all jobs. .TP -\f3\-J \fP\f2job.step\fP \f3,\fP \f3--jobstep\fP\f3=\fP\f2job.step\fP +\f3\-J \fP\f2job.step\fP \f3,\fP \f3--jobid\fP\f3=\fP\f2job.step\fP Displays data only for the job steps specified by the \f2job.step\fP operand, which is a comma-separated list. @@ -240,19 +241,25 @@ Displays a long listing, which includes the following data: \f3jobstep\fP .TP "3" \(bu -\f3usercpu\fP +\f3jobname\fP .TP "3" \(bu -\f3systemcpu\fP +\f3partition\fP .TP "3" \(bu -\f3minflt\fP +\f3vsize\fP .TP "3" \(bu -\f3majflt\fP +\f3rss\fP .TP "3" \(bu -\f3nprocs\fP +\f3pages\fP +.TP "3" +\(bu +\f3cputime\fP +.TP "3" +\(bu +\f3ntasks\fP .TP "3" \(bu \f3ncpus\fP @@ -264,7 +271,7 @@ Displays a long listing, which includes the following data: \f3status\fP .TP "3" \(bu -\f3error\fP +\f3exitcode\fP .RE .TP \f3--noheader\fP @@ -379,7 +386,7 @@ seconds hundredths of seconds .RE .TP -\f3error\fP +\f3exitcode\fP The first non-zero error code returned by any job step. .TP \f3finished\fP @@ -715,7 +722,7 @@ Timed out .RE .TP 13 -\f3error\fP +\f3exitcode\fP .TP 14 \f3nprocs\fP @@ -876,7 +883,7 @@ Timed out .RE .TP 13 -\f3error\fP +\f3exitcode\fP .TP 14 \f3nprocs\fP @@ -965,7 +972,7 @@ command: .nf .ft 3 # sacct -Jobstep Jobname Partition Ncpus Status Error +Jobstep Jobname Partition Ncpus Status Exitcode ---------- ---------- ---------- ------- ---------- ----- 2 script01 srun 1 RUNNING 0 3 script02 srun 1 RUNNING 0 @@ -984,7 +991,7 @@ option. .nf .ft 3 # sacct --brief -Jobstep Status Error +Jobstep Status Exitcode ---------- ---------- ----- 2 RUNNING 0 3 RUNNING 0 @@ -999,7 +1006,7 @@ Jobstep Status Error .nf .ft 3 # sacct --total -Jobstep Jobname Partition Ncpus Status Error +Jobstep Jobname Partition Ncpus Status Exitcode ---------- ---------- ---------- ------- ---------- ----- 3 sja_init andy 1 COMPLETED 0 4 sjaload andy 2 COMPLETED 0 diff --git a/src/common/forward.c b/src/common/forward.c index cc58f267120d248c35cfbee1deda7308cca84db4..ff76698387aaa8d11d3f7303e24362c6d38bf358 100644 --- a/src/common/forward.c +++ b/src/common/forward.c @@ -150,9 +150,10 @@ nothing_sent: while((returned_type = list_pop(ret_list)) != NULL) { itr = list_iterator_create(fwd_msg->ret_list); while((type = (ret_types_t *) list_next(itr)) != NULL) { - if(type->msg_rc == returned_type->msg_rc) { + if(type->msg_rc == returned_type->msg_rc){ while((ret_data_info = - list_pop(returned_type->ret_data_list))) { + list_pop(returned_type-> + ret_data_list))) { list_push(type->ret_data_list, ret_data_info); } @@ -467,9 +468,12 @@ void destroy_data_info(void *object) ret_data_info_t *ret_data_info = (ret_data_info_t *)object; if(ret_data_info) { xfree(ret_data_info->node_name); - /*FIXME: needs to probably be something for all - types or messages */ - xfree(ret_data_info->data); + /* + FIXME: needs to probably be something for all + types or messages -- + Handle deletion of data inside of call not here + xfree(ret_data_info->data); + */ xfree(ret_data_info); } } diff --git a/src/common/slurm_protocol_api.c b/src/common/slurm_protocol_api.c index 6cf3bc0a255925007bcb8afbee33001507be6e09..595c057378a4b9c1efd769f5ee84e698c2d26247 100644 --- a/src/common/slurm_protocol_api.c +++ b/src/common/slurm_protocol_api.c @@ -1005,7 +1005,7 @@ int slurm_send_node_msg(slurm_fd fd, slurm_msg_t * msg) slurm_mutex_unlock(&msg->forward_struct->forward_mutex); destroy_forward_struct(msg->forward_struct); } - + init_header(&header, msg, SLURM_PROTOCOL_NO_FLAGS); /* @@ -1800,7 +1800,7 @@ int slurm_send_recv_controller_rc_msg(slurm_msg_t *req, int *rc) extern int *set_span(int total, uint16_t tree_width) { - int *span; + int *span = NULL; int left = total; int i = 0; diff --git a/src/sacct/options.c b/src/sacct/options.c index ea30561b78fb92636d9970ff403b529143ee5441..f6bcc7aa58bcf2110d25a1dffd6ebc693a8a4d76 100644 --- a/src/sacct/options.c +++ b/src/sacct/options.c @@ -743,6 +743,13 @@ void parse_command_line(int argc, char **argv) break; case 'S': + params.opt_field_list = + xrealloc(params.opt_field_list, + (params.opt_field_list==NULL? 0 : + sizeof(params.opt_field_list)) + + sizeof(STAT_FIELDS)+1); + strcat(params.opt_field_list, STAT_FIELDS); + strcat(params.opt_field_list, ","); params.opt_stat = 1; break; diff --git a/src/sacct/print.c b/src/sacct/print.c index 4605b349f2c9f08a144d4ccf8e9977b3fb886dc2..48c29fd8f4ed80d8a22b43f3506281368d4be993 100644 --- a/src/sacct/print.c +++ b/src/sacct/print.c @@ -336,7 +336,7 @@ void print_name(type_t type, void *object) } } -void print_step(type_t type, void *object) +void print_jobid(type_t type, void *object) { job_rec_t *job = (job_rec_t *)object; step_rec_t *step = (step_rec_t *)object; diff --git a/src/sacct/process.c b/src/sacct/process.c index 75ca5cdcc5cbe6e7dcdf470d5ff01fad054c2b60..78f8476f4f8cebb427a1254924a2af202a544c2f 100644 --- a/src/sacct/process.c +++ b/src/sacct/process.c @@ -87,7 +87,7 @@ job_rec_t *_init_job_rec(acct_header_t header) memcpy(&job->header, &header, sizeof(acct_header_t)); memset(&job->rusage, 0, sizeof(struct rusage)); memset(&job->sacct, 0, sizeof(sacct_t)); - job->sacct.min_cpu = NO_VAL; + job->sacct.min_cpu = (float)NO_VAL; job->job_start_seen = 0; job->job_step_seen = 0; job->job_terminated_seen = 0; @@ -467,9 +467,9 @@ void aggregate_sacct(sacct_t *dest, sacct_t *from) dest->max_pages_task = from->max_pages_task; } dest->ave_pages += from->ave_pages; - - if((dest->min_cpu > from->min_cpu) - || (dest->min_cpu == NO_VAL)) { + + if((dest->min_cpu > from->min_cpu) + || (dest->min_cpu == (float)NO_VAL)) { dest->min_cpu = from->min_cpu; dest->min_cpu_task = from->min_cpu_task; } diff --git a/src/sacct/sacct.c b/src/sacct/sacct.c index 40ce4ac8c8e0df91525d94f1dac722a1297c0bb0..b06800c4a8e7caaaf1e440eb789f996ec5e00b04 100644 --- a/src/sacct/sacct.c +++ b/src/sacct/sacct.c @@ -150,7 +150,7 @@ fields_t fields[] = {{"cpu", print_cpu}, {"ixrss", print_ixrss}, {"job", print_job}, {"jobname", print_name}, - {"jobstep", print_step}, + {"jobid", print_jobid}, {"majflt", print_majflt}, {"minflt", print_minflt}, {"msgrcv", print_msgrcv}, diff --git a/src/sacct/sacct.h b/src/sacct/sacct.h index 9ee59b0ef48b95157c437a8e2e8ff0864b56a4d9..711f49cb31071629f5e948c74e7e1a5cace371c5 100644 --- a/src/sacct/sacct.h +++ b/src/sacct/sacct.h @@ -54,9 +54,10 @@ * which have no logical jobsteps. */ #define BATCH_JOB_TIMESTAMP 0 -#define BRIEF_FIELDS "jobstep,status,exitcode" -#define DEFAULT_FIELDS "jobstep,jobname,partition,ncpus,status,exitcode" -#define LONG_FIELDS "jobstep,jobname,partition,vsize,rss,pages,cputime,ntasks,ncpus,elapsed,status,exitcode" +#define BRIEF_FIELDS "jobid,status,exitcode" +#define DEFAULT_FIELDS "jobid,jobname,partition,ncpus,status,exitcode" +#define STAT_FIELDS "jobid,vsize,rss,pages,cputime,ntasks,status" +#define LONG_FIELDS "jobid,jobname,partition,vsize,rss,pages,cputime,ntasks,ncpus,elapsed,status,exitcode" #define BUFFER_SIZE 4096 #define STATUS_COUNT 10 @@ -281,7 +282,7 @@ void print_isrss(type_t type, void *object); void print_ixrss(type_t type, void *object); void print_job(type_t type, void *object); void print_name(type_t type, void *object); -void print_step(type_t type, void *object); +void print_jobid(type_t type, void *object); void print_majflt(type_t type, void *object); void print_minflt(type_t type, void *object); void print_msgrcv(type_t type, void *object); diff --git a/src/sacct/sacct_stat.c b/src/sacct/sacct_stat.c index b405bc71c2ea8d580dd4eada5101bb7519abc6e9..f5d68bccca33b13edb03270d28461024183b847c 100644 --- a/src/sacct/sacct_stat.c +++ b/src/sacct/sacct_stat.c @@ -57,9 +57,9 @@ void *_stat_thread(void *args) int ntasks = 0; memset(&temp_sacct, 0, sizeof(sacct_t)); - temp_sacct.min_cpu = NO_VAL; + temp_sacct.min_cpu = (float)NO_VAL; memset(&temp_sacct2, 0, sizeof(sacct_t)); - temp_sacct2.min_cpu = NO_VAL; + temp_sacct2.min_cpu = (float)NO_VAL; ret_list = slurm_send_recv_node_msg(msg, &resp_msg, @@ -73,45 +73,66 @@ void *_stat_thread(void *args) switch (resp_msg.msg_type) { case MESSAGE_STAT_JOBACCT: jobacct_msg = (stat_jobacct_msg_t *)resp_msg.data; + if(jobacct_msg) { + debug2("got it back for job %d %d tasks", + jobacct_msg->job_id, + jobacct_msg->num_tasks); + jobacct_g_2_sacct(&temp_sacct, jobacct_msg->jobacct); + ntasks = jobacct_msg->num_tasks; + slurm_free_stat_jobacct_msg(jobacct_msg); + } else { + error("No Jobacct message returned!"); + } break; case RESPONSE_SLURM_RC: rc = ((return_code_msg_t *) resp_msg.data)->return_code; slurm_free_return_code_msg(resp_msg.data); - error("there was an error with the request rc = %d", rc); - goto cleanup; + error("there was an error with the request rc = %s", + slurm_strerror(rc)); break; default: rc = SLURM_UNEXPECTED_MSG_ERROR; break; } - if(jobacct_msg) { - info("got it back for job %d %d tasks", jobacct_msg->job_id, - jobacct_msg->num_tasks); - jobacct_g_2_sacct(&temp_sacct, jobacct_msg->jobacct); - ntasks = jobacct_msg->num_tasks; - slurm_free_stat_jobacct_msg(jobacct_msg); - } else { - error("2 there was an error with the request rc = %d", rc); - goto cleanup; - } itr = list_iterator_create(ret_list); while((ret_type = list_next(itr)) != NULL) { - data_itr = list_iterator_create(ret_type->ret_data_list); - while((ret_data_info = list_next(data_itr)) != NULL) { - jobacct_msg = - (stat_jobacct_msg_t *)ret_data_info->data; - if(jobacct_msg) { - info("got it back for job %d", - jobacct_msg->job_id); - jobacct_g_2_sacct(&temp_sacct2, - jobacct_msg->jobacct); - ntasks += jobacct_msg->num_tasks; - slurm_free_stat_jobacct_msg(jobacct_msg); - aggregate_sacct(&temp_sacct, &temp_sacct2); - } + switch (ret_type->type) { + case MESSAGE_STAT_JOBACCT: + data_itr = + list_iterator_create(ret_type->ret_data_list); + while((ret_data_info = list_next(data_itr)) != NULL) { + jobacct_msg = (stat_jobacct_msg_t *) + ret_data_info->data; + if(jobacct_msg) { + debug2("got it back for job %d", + jobacct_msg->job_id); + jobacct_g_2_sacct( + &temp_sacct2, + jobacct_msg->jobacct); + ntasks += jobacct_msg->num_tasks; + slurm_free_stat_jobacct_msg( + jobacct_msg); + aggregate_sacct(&temp_sacct, + &temp_sacct2); + } + } + break; + case RESPONSE_SLURM_RC: + rc = ret_type->msg_rc; + error("there was an error with the request rc = %s", + slurm_strerror(rc)); + break; + default: + rc = ret_type->msg_rc; + error("unknown return given %d rc = %s", + ret_type->type, slurm_strerror(rc)); + break; } } + list_iterator_destroy(itr); + list_destroy(ret_list); + pthread_mutex_lock(&stat_mutex); aggregate_sacct(&step.sacct, &temp_sacct); step.ntasks += ntasks; @@ -130,15 +151,16 @@ int _sacct_query(resource_allocation_response_msg_t *job, uint32_t step_id) slurm_msg_t *msg_array_ptr; stat_jobacct_msg_t r; int i; - int *span = set_span(job->node_cnt, 4000); + int *span = set_span(job->node_cnt, 0); forward_t forward; int thr_count = 0; float tempf = 0; - debug("getting the stat of job %d", job->job_id); + debug("getting the stat of job %d on %d nodes", + job->job_id, job->node_cnt); memset(&step.sacct, 0, sizeof(sacct_t)); - step.sacct.min_cpu = NO_VAL; + step.sacct.min_cpu = (float)NO_VAL; step.header.jobnum = job->job_id; step.header.partition = NULL; step.header.blockid = NULL; @@ -154,7 +176,6 @@ int _sacct_query(resource_allocation_response_msg_t *job, uint32_t step_id) r.step_id = step_id; r.jobacct = jobacct_g_alloc((uint16_t)NO_VAL); - thr_count = 0; forward.cnt = job->node_cnt; /* we need this for forwarding, but not really anything else, so this can be set to any sting as long as there are the same @@ -166,13 +187,14 @@ int _sacct_query(resource_allocation_response_msg_t *job, uint32_t step_id) forward.addr = job->node_addr; forward.node_id = NULL; forward.timeout = 5000; - + + thr_count = 0; for (i = 0; i < job->node_cnt; i++) { pthread_attr_t attr; pthread_t threadid; - slurm_msg_t *m = &msg_array_ptr[i]; + slurm_msg_t *m = &msg_array_ptr[thr_count]; - m->srun_node_id = (uint32_t)i; + m->srun_node_id = 0; m->msg_type = MESSAGE_STAT_JOBACCT; m->data = &r; m->ret_list = NULL; @@ -183,7 +205,7 @@ int _sacct_query(resource_allocation_response_msg_t *job, uint32_t step_id) sizeof(slurm_addr)); forward_set(&m->forward, - span[i], + span[thr_count], &i, &forward); @@ -210,7 +232,6 @@ int _sacct_query(resource_allocation_response_msg_t *job, uint32_t step_id) slurm_mutex_lock(&stat_mutex); while(thr_count > thr_finished) { pthread_cond_wait(&stat_cond, &stat_mutex); - info("got %d", thr_finished); } slurm_mutex_unlock(&stat_mutex); @@ -226,7 +247,6 @@ int _sacct_query(resource_allocation_response_msg_t *job, uint32_t step_id) tempf = step.sacct.ave_pages/step.ntasks; step.sacct.ave_pages = (uint32_t)tempf; } - info(" done"); xfree(msg_array_ptr); jobacct_g_free(r.jobacct); return SLURM_SUCCESS; @@ -276,7 +296,7 @@ int sacct_stat(uint32_t jobid, uint32_t stepid) } if(!job) { - error("didn't get the job record rc = %d", rc); + error("didn't get the job record rc = %s", slurm_strerror(rc)); return rc; } diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index 6aafb07a519a7dc9b5d4a32ce18b60d09fa22780..ed75ee3e46b3ccce1351b17f98521cc802dfd5fc 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -1539,7 +1539,8 @@ static void _slurm_rpc_step_complete(slurm_msg_t *msg) * represent the termination of an entire job */ static void _slurm_rpc_stat_jobacct(slurm_msg_t * msg) { - int error_code = SLURM_SUCCESS, i=0; + int error_code = SLURM_SUCCESS, i = 0, i2 = 0, i3 = 0; + int count = 0, count2 = 0; slurm_msg_t response_msg; DEF_TIMERS; stat_jobacct_msg_t *req = (stat_jobacct_msg_t *)msg->data; @@ -1584,15 +1585,33 @@ static void _slurm_rpc_stat_jobacct(slurm_msg_t * msg) bit_fmt(bitstring, BUFFER_SIZE, step_ptr->step_node_bitmap); node_pos = bitfmt2int(bitstring); - - for(i=0; i < node_cnt; i++) { - if(node_pos[i] == -1) { - error("error with bitfmt2int"); - break; + count = 0; + count2 = 0; + i = node_pos[count++]; + i2 = node_pos[count++]; + while(i != -1) { + if(i2 == -1) { + memcpy(&resp.node_addr[count2++], + &node_record_table_ptr[i].slurm_addr, + sizeof(slurm_addr)); + + + } else { + for(i3=i; i3 <= i2; i3++) { + if(i3 == -1) { + error("error with bitfmt2int " + "on the %d one", + i3); + break; + } + memcpy(&resp.node_addr[count2++], + &node_record_table_ptr[i3]. + slurm_addr, + sizeof(slurm_addr)); + } } - memcpy(&resp.node_addr[i], - &job_ptr->node_addr[node_pos[i]], - sizeof(slurm_addr)); + i = node_pos[count++]; + i2 = node_pos[count++]; } resp.node_list = xstrdup(step_ptr->step_node_list); resp.node_cnt = node_cnt; diff --git a/src/slurmd/slurmd/req.c b/src/slurmd/slurmd/req.c index 0c234bc6960518f9e8c08d8db39637f75d99728d..35b285b2a836a2365e92ad507987b250c28349e4 100644 --- a/src/slurmd/slurmd/req.c +++ b/src/slurmd/slurmd/req.c @@ -1189,6 +1189,8 @@ _rpc_stat_jobacct(slurm_msg_t *msg, slurm_addr *cli_addr) resp_msg.data = resp; resp_msg.forward = msg->forward; resp_msg.ret_list = msg->ret_list; + resp_msg.forward_struct_init = msg->forward_struct_init; + resp_msg.forward_struct = msg->forward_struct; slurm_send_node_msg(msg->conn_fd, &resp_msg); slurm_free_stat_jobacct_msg(resp); @@ -1269,7 +1271,9 @@ static void _rpc_pid2jid(slurm_msg_t *msg, slurm_addr *cli) resp_msg.data = &resp; resp_msg.forward = msg->forward; resp_msg.ret_list = msg->ret_list; - + resp_msg.forward_struct_init = msg->forward_struct_init; + resp_msg.forward_struct = msg->forward_struct; + slurm_send_node_msg(msg->conn_fd, &resp_msg); } else { debug3("_rpc_pid2jid: pid(%u) not found", req->job_pid);