From 66f332ed9063c425d2c06eb4d7cdaf16f4d506ad Mon Sep 17 00:00:00 2001 From: Morris Jette <jette@schedmd.com> Date: Tue, 29 Apr 2014 15:51:47 -0700 Subject: [PATCH] Always clear JOB_SPECIAL_EXIT on job prio set If a job's priority is set non-zero then always clear the JOB_SPECIAL_EXIT job state flag, not only when the prior state is HELD_USER or HELD. I'm not sure how the job could have cleared the HELD state and changed to NO_REASON, but this would fix the problem. bug 760 --- src/slurmctld/acct_policy.c | 4 +++- src/slurmctld/job_mgr.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/slurmctld/acct_policy.c b/src/slurmctld/acct_policy.c index c46e8c26bc0..b5c50df7c8f 100644 --- a/src/slurmctld/acct_policy.c +++ b/src/slurmctld/acct_policy.c @@ -1272,8 +1272,10 @@ extern bool acct_policy_job_runnable_post_select( safe_limits = true; /* clear old state reason */ - if (!acct_policy_job_runnable_state(job_ptr)) + if (!acct_policy_job_runnable_state(job_ptr)) { + xfree(job_ptr->state_desc); job_ptr->state_reason = WAIT_NO_REASON; + } job_cpu_time_limit = (uint64_t)job_ptr->time_limit * (uint64_t)cpu_cnt; diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index 31e024730e1..092622c908a 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -8442,8 +8442,10 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid) xfree(job_ptr->state_desc); } else if (authorized || (job_ptr->priority > job_specs->priority)) { - if (job_specs->priority != 0) + if (job_specs->priority != 0) { job_ptr->details->nice = NICE_OFFSET; + job_ptr->job_state &= ~JOB_SPECIAL_EXIT; + } if (job_specs->priority == INFINITE) { job_ptr->direct_set_prio = 0; set_job_prio(job_ptr); @@ -8466,7 +8468,6 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid) } else if ((job_ptr->state_reason == WAIT_HELD) || (job_ptr->state_reason == WAIT_HELD_USER)) { job_ptr->state_reason = WAIT_NO_REASON; - job_ptr->job_state &= ~JOB_SPECIAL_EXIT; xfree(job_ptr->state_desc); } } else if (job_specs->priority == INFINITE @@ -9009,8 +9010,11 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid) error_code = SLURM_SUCCESS; else error_code = ESLURM_REQUESTED_PART_CONFIG_UNAVAILABLE; - job_ptr->state_reason = fail_reason; - xfree(job_ptr->state_desc); + if ((job_ptr->state_reason != WAIT_HELD) && + (job_ptr->state_reason != WAIT_HELD_USER)) { + job_ptr->state_reason = fail_reason; + xfree(job_ptr->state_desc); + } return error_code; } else if ((job_ptr->state_reason != WAIT_HELD) && (job_ptr->state_reason != WAIT_HELD_USER)) { -- GitLab