static int _job_signal(uint32_t jobid, uint16_t sig_num) { struct job_record *job_ptr; int rc = SLURM_SUCCESS; job_ptr = find_job_record(jobid); if (job_ptr == NULL) return ESLURM_INVALID_JOB_ID; if (IS_JOB_FINISHED(job_ptr)) return ESLURM_ALREADY_DONE; if (job_ptr->batch_flag) rc = job_signal(jobid, sig_num, 1, 0, false); if (rc == SLURM_SUCCESS) rc = job_signal(jobid, sig_num, 0, 0, false); return rc; }
static void _preempt_job_dequeue(void) { struct job_record *job_ptr; uint32_t job_id, *tmp_id; uint16_t preempt_mode; xassert(preempt_job_list); while ((tmp_id = list_pop(preempt_job_list))) { int rc = SLURM_ERROR; job_id = *tmp_id; xfree(tmp_id); if ((job_ptr = find_job_record(job_id)) == NULL) { error("_preempt_job_dequeue could not find job %u", job_id); continue; } preempt_mode = slurm_job_preempt_mode(job_ptr); if (preempt_mode == PREEMPT_MODE_SUSPEND) { if ((rc = _suspend_job(job_id)) == ESLURM_DISABLED) rc = SLURM_SUCCESS; } else if (preempt_mode == PREEMPT_MODE_CANCEL) { rc = job_signal(job_ptr->job_id, SIGKILL, 0, 0, true); if (rc == SLURM_SUCCESS) { info("preempted job %u has been killed", job_ptr->job_id); } } else if (preempt_mode == PREEMPT_MODE_CHECKPOINT) { checkpoint_msg_t ckpt_msg; memset(&ckpt_msg, 0, sizeof(checkpoint_msg_t)); ckpt_msg.op = CHECK_REQUEUE; ckpt_msg.job_id = job_ptr->job_id; rc = job_checkpoint(&ckpt_msg, 0, -1, (uint16_t)NO_VAL); if (rc == ESLURM_NOT_SUPPORTED) { memset(&ckpt_msg, 0, sizeof(checkpoint_msg_t)); ckpt_msg.op = CHECK_VACATE; ckpt_msg.job_id = job_ptr->job_id; rc = job_checkpoint(&ckpt_msg, 0, -1, (uint16_t)NO_VAL); } if (rc == SLURM_SUCCESS) { info("preempted job %u has been checkpointed", job_ptr->job_id); } else error("preempted job %u could not be " "checkpointed: %s", job_ptr->job_id, slurm_strerror(rc)); } else if ((preempt_mode == PREEMPT_MODE_REQUEUE) && job_ptr->batch_flag && job_ptr->details && (job_ptr->details->requeue > 0)) { rc = job_requeue(0, job_ptr->job_id, -1, (uint16_t)NO_VAL, true, 0); if (rc == SLURM_SUCCESS) { info("preempted job %u has been requeued", job_ptr->job_id); } else error("preempted job %u could not be " "requeued: %s", job_ptr->job_id, slurm_strerror(rc)); } if (rc != SLURM_SUCCESS) { rc = job_signal(job_ptr->job_id, SIGKILL, 0, 0, true); if (rc == SLURM_SUCCESS) info("preempted job %u had to be killed", job_ptr->job_id); else { info("preempted job %u kill failure %s", job_ptr->job_id, slurm_strerror(rc)); } } } return; }