diff --git a/src/slurmd/mgr.c b/src/slurmd/mgr.c index 7346f3a5518dab789ec7b0e3ccf94a42aaf8b92a..6a0737cc02006a7142f76d5b6a9407cea92be10f 100644 --- a/src/slurmd/mgr.c +++ b/src/slurmd/mgr.c @@ -73,6 +73,7 @@ static int _unblock_all_signals(void); static int _block_most_signals(void); static int _send_exit_msg(int rc, task_info_t *t); static int _complete_job(slurmd_job_t *job, int rc, int status); +static void _send_batch_launch_resp(slurmd_job_t *job); static void _send_launch_resp(slurmd_job_t *job, int rc); static void _wait_for_all_tasks(slurmd_job_t *job); static void _slurmd_job_log_init(slurmd_job_t *job); @@ -348,7 +349,9 @@ _run_job(slurmd_job_t *job) } rc = _exec_all_tasks(job); - if (!job->batch) + if (job->batch) + _send_batch_launch_resp(job); + else _send_launch_resp(job, rc); _wait_for_all_tasks(job); @@ -747,6 +750,37 @@ _block_most_signals(void) return SLURM_SUCCESS; } +static void +_send_batch_launch_resp(slurmd_job_t *job) +{ + slurm_msg_t resp_msg; + batch_launch_response_msg_t resp; + List steps = shm_get_steps(); + ListIterator i = list_iterator_create(steps); + job_step_t *s = NULL; + bool found = false; + + while ((s = list_next(i))) { + if (s->jobid == job->jobid) { + resp.sid = s->sid; + found = true; + break; + } + } + list_destroy(steps); + if (!found) + error("failed to find jobid %u in shared memory", job->jobid); + else { + debug("Sending batch launch resp"); + resp_msg.data = &resp; + resp_msg.msg_type = RESPONSE_BATCH_JOB_LAUNCH; + + /* resp.sid = s->sid; set above */ + resp.job_id = job->jobid; + slurm_send_only_controller_msg(&resp_msg); + } +} + static void _send_launch_resp(slurmd_job_t *job, int rc) { diff --git a/src/slurmd/req.c b/src/slurmd/req.c index 7133ada854f5b902d03c191f639b063ee00ecd18..e93fd54e67f1e3cddd00552d0726fd073aa33f05 100644 --- a/src/slurmd/req.c +++ b/src/slurmd/req.c @@ -32,6 +32,7 @@ #include <signal.h> #include <string.h> #include <sys/param.h> +#include <unistd.h> #include "src/common/credential_utils.h" #include "src/common/log.h" @@ -315,10 +316,11 @@ static void _rpc_pid2jid(slurm_msg_t *msg, slurm_addr *cli) List steps = shm_get_steps(); ListIterator i = list_iterator_create(steps); job_step_t *s = NULL; - bool found = false; + bool found = false; + pid_t mysid = getsid(req->job_pid); - while ((s = list_next(i))) { - if (s->sid == req->job_pid) { + while ((mysid != -1) && (s = list_next(i))) { + if (s->sid == mysid) { resp.job_id = s->jobid; found = true; break; diff --git a/src/slurmd/slurmd.h b/src/slurmd/slurmd.h index 1b0b3ef1d14451568570fc780e0f9c075bc0c5e3..82cfb17e896d535d63c7a965946a0e94b24bb6a4 100644 --- a/src/slurmd/slurmd.h +++ b/src/slurmd/slurmd.h @@ -47,6 +47,9 @@ #include "src/common/slurm_protocol_api.h" #include "src/common/signature_utils.h" +#ifndef __USE_XOPEN_EXTENDED +extern pid_t getsid(pid_t pid); /* missing from <unistd.h> */ +#endif /* * Global config type */