From 635c0da5900163c9e545203da2d3cbad43b798e7 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Tue, 20 Jul 2010 20:01:09 +0000
Subject: [PATCH] prevent scontrol hold/release commands for non-pending jobs

---
 src/scontrol/update_job.c | 20 ++++++++++----------
 src/slurmctld/job_mgr.c   | 21 ++++++++-------------
 2 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/src/scontrol/update_job.c b/src/scontrol/update_job.c
index 8c76f99c476..d210192f9fb 100644
--- a/src/scontrol/update_job.c
+++ b/src/scontrol/update_job.c
@@ -207,6 +207,7 @@ scontrol_hold(char *op, char *job_id_str)
 	int rc = SLURM_SUCCESS;
 	char *next_str;
 	job_desc_msg_t job_msg;
+	uint16_t job_state;
 
 	slurm_init_job_desc_msg (&job_msg);
 
@@ -223,19 +224,18 @@ scontrol_hold(char *op, char *job_id_str)
 		return 0;
 	}
 
+	job_state = scontrol_get_job_state(job_msg.job_id);
+	if (job_state == (uint16_t) NO_VAL)
+		return SLURM_ERROR;
+	if ((job_state & JOB_STATE_BASE) != JOB_PENDING) {
+		slurm_seterrno(ESLURM_JOB_NOT_PENDING);
+		return ESLURM_JOB_NOT_PENDING;
+	}
+
 	if (strncasecmp(op, "hold", MAX(strlen(op), 4)) == 0)
 		job_msg.priority = 0;
-	else {
-		uint16_t job_state = scontrol_get_job_state(job_msg.job_id);
-		if (job_state == (uint16_t) NO_VAL)
-			return SLURM_ERROR;
-		if ((job_state & JOB_STATE_BASE) != JOB_PENDING) {
-			slurm_seterrno(ESLURM_JOB_NOT_PENDING);
-			return ESLURM_JOB_NOT_PENDING;
-		}
+	else
 		job_msg.priority = 1;
-	}
-
 	if (slurm_update_job(&job_msg))
 		return slurm_get_errno();
 	return rc;
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 8f476cdfc15..8b1962b90ed 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -6041,10 +6041,12 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid)
 		*/
 		if (IS_JOB_FINISHED(job_ptr) || (detail_ptr == NULL))
 			error_code = ESLURM_DISABLED;
+		else if (job_ptr->priority == job_specs->priority)
+			debug("update_job: setting priority to current value");
 		else if (super_user ||
 			 (job_ptr->priority > job_specs->priority)) {
 			job_ptr->details->nice = NICE_OFFSET;
-			if(job_specs->priority == INFINITE) {
+			if (job_specs->priority == INFINITE) {
 				job_ptr->direct_set_prio = 0;
 				_set_job_prio(job_ptr);
 			} else {
@@ -6056,18 +6058,11 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid)
 			     job_specs->job_id);
 			update_accounting = true;
 			if (job_ptr->priority == 0) {
-				if (!IS_JOB_PENDING(job_ptr)) {
-					error_code = ESLURM_JOB_NOT_PENDING;
-				} else {
-					if (super_user) {
-						job_ptr->state_reason =
-							WAIT_HELD;
-					} else {
-						job_ptr->state_reason =
-							WAIT_HELD_USER;
-					}
-					xfree(job_ptr->state_desc);
-				}
+				if (super_user)
+					job_ptr->state_reason = WAIT_HELD;
+				else
+					job_ptr->state_reason = WAIT_HELD_USER;
+				xfree(job_ptr->state_desc);
 			}
 		} else if ((job_ptr->priority == 0) &&
 			   (job_ptr->state_reason == WAIT_HELD_USER)) {
-- 
GitLab