From 38f15b0666346618c550b10d443b3c0e289ed7d1 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 7 Nov 2008 21:50:51 +0000
Subject: [PATCH] Fix logic in setting default job priority, was resetting base
 priority to 1 after "scontrol reconfig" if there was a job in the system with
 a priority of 1.

---
 src/plugins/priority/basic/priority_basic.c |  8 +++-----
 src/slurmctld/job_mgr.c                     | 14 +++++++++-----
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/plugins/priority/basic/priority_basic.c b/src/plugins/priority/basic/priority_basic.c
index fe471ade8a4..fee48b2057b 100644
--- a/src/plugins/priority/basic/priority_basic.c
+++ b/src/plugins/priority/basic/priority_basic.c
@@ -110,13 +110,11 @@ extern uint32_t priority_p_set(uint32_t last_prio, struct job_record *job_ptr)
 	if(job_ptr->direct_set_prio)
 		return job_ptr->priority;
 
-	if (last_prio >= 2)
+	if(last_prio >= 2)
 		new_prio = (last_prio - 1);
 
-	if(!job_ptr->details)
-		return new_prio;
-
-	new_prio -= (job_ptr->details->nice - NICE_OFFSET);
+	if(job_ptr->details)
+		new_prio -= (job_ptr->details->nice - NICE_OFFSET);
 
 	if(new_prio < 1)
 		new_prio = 1;
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 43ab8238e84..ed65f7578fc 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -3918,9 +3918,11 @@ static void _set_job_prio(struct job_record *job_ptr)
 {
 	xassert(job_ptr);
 	xassert (job_ptr->magic == JOB_MAGIC);
+	if (IS_JOB_FINISHED(job_ptr))
+		return;
 	job_ptr->priority = slurm_sched_initial_priority(maximum_prio,
 							 job_ptr);
-	if (job_ptr->priority > 0)
+	if ((job_ptr->priority > 1) && (job_ptr->direct_set_prio == 0))
 		maximum_prio = MIN(job_ptr->priority, maximum_prio);
 }
 
@@ -3935,7 +3937,7 @@ void reset_job_priority(void)
 
 	job_iterator = list_iterator_create(job_list);
 	while ((job_ptr = (struct job_record *) list_next(job_iterator))) {
-		if (job_ptr->priority == 1) {
+		if ((job_ptr->priority == 1) && (!IS_JOB_FINISHED(job_ptr))) {
 			_set_job_prio(job_ptr);
 			count++;
 		}
@@ -4086,8 +4088,10 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid)
 	}
 
 	if (job_specs->priority != NO_VAL) {
-		if (super_user
-		    ||  (job_ptr->priority > job_specs->priority)) {
+		if (IS_JOB_FINISHED(job_ptr))
+			error_code = ESLURM_DISABLED;
+		else if (super_user ||
+		         (job_ptr->priority > job_specs->priority)) {
 			if(job_specs->priority == INFINITE) {
 				job_ptr->direct_set_prio = 0;
 				_set_job_prio(job_ptr);
@@ -4106,7 +4110,7 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid)
 	}
 
 	if (job_specs->nice != NICE_OFFSET) {
-		if (!IS_JOB_PENDING(job_ptr)) 
+		if (IS_JOB_FINISHED(job_ptr)) 
 			error_code = ESLURM_DISABLED;
 		else if (super_user || (job_specs->nice < NICE_OFFSET)) {
 			job_ptr->details->nice = job_specs->nice;
-- 
GitLab