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