From 5571c0a61a404e88c5c859ce81567cc8d5b4940a Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Wed, 17 Sep 2003 17:09:03 +0000 Subject: [PATCH] Raise the priority of a pending job when a node it was waiting for is returned to service. The priority is changed from 1 to value which would be set for the job if submitted at that time. (gnats:279) --- src/slurmctld/job_mgr.c | 20 ++++++++++++++++++++ src/slurmctld/node_mgr.c | 2 ++ src/slurmctld/proc_req.c | 4 ++-- src/slurmctld/slurmctld.h | 4 ++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index 143d1afd0fe..e162f884fad 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -2450,6 +2450,26 @@ static void _set_job_prio(struct job_record *job_ptr) } +/* After a node is returned to service, reset the priority of jobs + * which may have been held due to that node being unavailable */ +void reset_job_priority(void) +{ + ListIterator job_iterator; + struct job_record *job_ptr; + int count = 0; + + job_iterator = list_iterator_create(job_list); + while ((job_ptr = (struct job_record *) list_next(job_iterator))) { + if (job_ptr->priority == 1) { + _set_job_prio(job_ptr); + count++; + } + } + list_iterator_destroy(job_iterator); + if (count) + last_job_update = time(NULL); +} + /* * _top_priority - determine if any other job for this partition has a * higher priority than specified job diff --git a/src/slurmctld/node_mgr.c b/src/slurmctld/node_mgr.c index 48e6731e39c..4232091c11d 100644 --- a/src/slurmctld/node_mgr.c +++ b/src/slurmctld/node_mgr.c @@ -970,6 +970,7 @@ int update_node ( update_node_msg_t * update_node_msg ) else if (state_val == NODE_STATE_IDLE) { bit_set (avail_node_bitmap, node_inx); bit_set (idle_node_bitmap, node_inx); + reset_job_priority(); } else if (state_val == NODE_STATE_ALLOCATED) { bit_set (avail_node_bitmap, node_inx); @@ -1157,6 +1158,7 @@ validate_node_specs (char *node_name, uint32_t cpus, node_name); xfree(node_ptr->reason); resp_state = 1; /* just started responding */ + reset_job_priority(); } else if ((node_ptr->node_state == NODE_STATE_ALLOCATED) && (job_count == 0)) { /* job vanished */ node_ptr->node_state = NODE_STATE_IDLE; diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index 2122a5d231e..94a5adef868 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -1410,9 +1410,9 @@ static void _slurm_rpc_update_node(slurm_msg_t * msg) DEF_TIMERS; update_node_msg_t *update_node_msg_ptr = (update_node_msg_t *) msg->data; - /* Locks: Write node */ + /* Locks: Write job and write node */ slurmctld_lock_t node_write_lock = { - NO_LOCK, NO_LOCK, WRITE_LOCK, NO_LOCK }; + NO_LOCK, WRITE_LOCK, WRITE_LOCK, NO_LOCK }; uid_t uid; START_TIMER; diff --git a/src/slurmctld/slurmctld.h b/src/slurmctld/slurmctld.h index 675a565a732..0fafe72fafa 100644 --- a/src/slurmctld/slurmctld.h +++ b/src/slurmctld/slurmctld.h @@ -913,6 +913,10 @@ extern void reset_first_job_id(void); */ extern void reset_job_bitmaps (void); +/* After a node is returned to service, reset the priority of jobs + * which may have been held due to that node being unavailable */ +extern void reset_job_priority(void); + /* run_backup - this is the backup controller, it should run in standby * mode, assuming control when the primary controller stops responding */ extern void run_backup(void); -- GitLab