diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 0f161ae1871d651b9d92ee6cead05c683c99c29d..01421b10ab3df11253fe3c7752f0ff4dbfdc525a 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -109,6 +109,7 @@ Changed the following enums and #defines Added the following API's ========================= +Added slurm_kill_job_msg: to send prepared job_step_kill_msg_t. Changed the following API's ============================ diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in index c18011c1d68182dd9f70b675c5bc80c172dfd07e..10ce8d3b84c075f57e12e84ead9c2d89f77b01ec 100644 --- a/slurm/slurm.h.in +++ b/slurm/slurm.h.in @@ -3309,6 +3309,15 @@ extern int slurm_kill_job_step(uint32_t job_id, */ extern int slurm_kill_job2(const char *job_id, uint16_t signal, uint16_t flags); +/* + * slurm_kill_job_msg - send kill msg to and existing job or step. + * + * IN msg_type - msg_type to send + * IN kill_msg - job_step_kill_msg_t parameters. + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_kill_job_msg(uint16_t msg_type, job_step_kill_msg_t *kill_msg); + /* * slurm_signal_job - send the specified signal to all steps of an existing job * IN job_id - the job's id diff --git a/src/api/cancel.c b/src/api/cancel.c index a0e472023df604cbf26905e3ea3a9047d7fba01b..6af2166b262f3611fc37f10a076f3551daaab3e6 100644 --- a/src/api/cancel.c +++ b/src/api/cancel.c @@ -151,3 +151,28 @@ slurm_kill_job2(const char *job_id, uint16_t signal, uint16_t flags) return SLURM_SUCCESS; } + +/* + * slurm_kill_job_msg - send kill msg to and existing job or step. + * + * IN msg_type - msg_type to send + * IN kill_msg - job_step_kill_msg_t parameters. + * RET 0 on success, otherwise return -1 and set errno to indicate the error + */ +extern int slurm_kill_job_msg(uint16_t msg_type, job_step_kill_msg_t *kill_msg) +{ + int cc; + slurm_msg_t msg; + slurm_msg_t_init(&msg); + + msg.msg_type = msg_type; + msg.data = kill_msg; + + if (slurm_send_recv_controller_rc_msg(&msg, &cc, working_cluster_rec)<0) + return SLURM_FAILURE; + + if (cc) + slurm_seterrno_ret(cc); + + return SLURM_SUCCESS; +} diff --git a/src/scancel/scancel.c b/src/scancel/scancel.c index ea504ca6311bf173be11a2ad9b8143b85012c325..5e0125378f0c068a9afbad645021071f7794a3cd 100644 --- a/src/scancel/scancel.c +++ b/src/scancel/scancel.c @@ -746,10 +746,20 @@ _cancel_job_id (void *ci) } for (i = 0; i < MAX_CANCEL_RETRY; i++) { + job_step_kill_msg_t kill_msg; + _add_delay(); START_TIMER; - error_code = slurm_kill_job2(cancel_info->job_id_str, - cancel_info->sig, flags); + + memset(&kill_msg, 0, sizeof(job_step_kill_msg_t)); + kill_msg.flags = flags; + kill_msg.job_id = NO_VAL; + kill_msg.job_step_id = NO_VAL; + kill_msg.signal = cancel_info->sig; + kill_msg.sjob_id = cancel_info->job_id_str; + + error_code = slurm_kill_job_msg(REQUEST_KILL_JOB, &kill_msg); + END_TIMER; slurm_mutex_lock(&max_delay_lock); max_resp_time = MAX(max_resp_time, DELTA_TIMER);