From 873c8eb133f40f1715d566e71087021c6a3ebe7a Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Thu, 19 Feb 2009 00:55:16 +0000 Subject: [PATCH] svn merge -r16584:16594 https://eris.llnl.gov/svn/slurm/branches/slurm-1.3 --- NEWS | 2 ++ src/plugins/select/linear/select_linear.c | 33 ++++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index 10156aa5c42..32cc70e7279 100644 --- a/NEWS +++ b/NEWS @@ -178,6 +178,8 @@ documents those changes that are of interest to users and admins. -- Fix bug in logic to remove a job's dependency, could result in abort. -- Add new error message to sched/wiki and sched/wiki2 (Maui and Moab) for STARTJOB request: "TASKLIST includes non-responsive nodes". + -- Fix bug in select/linear when used with sched/gang that can result in a + job's required or excluded node specification being ignored. * Changes in SLURM 1.3.13 ========================= diff --git a/src/plugins/select/linear/select_linear.c b/src/plugins/select/linear/select_linear.c index 5fea9e42949..5ff87bace46 100644 --- a/src/plugins/select/linear/select_linear.c +++ b/src/plugins/select/linear/select_linear.c @@ -815,21 +815,34 @@ static int _find_job_mate(struct job_record *job_ptr, bitstr_t *bitmap, { ListIterator job_iterator; struct job_record *job_scan_ptr; + int rc = EINVAL; job_iterator = list_iterator_create(job_list); while ((job_scan_ptr = (struct job_record *) list_next(job_iterator))) { - if ((job_scan_ptr->part_ptr == job_ptr->part_ptr) && - (job_scan_ptr->job_state == JOB_RUNNING) && - (job_scan_ptr->node_cnt == req_nodes) && - (job_scan_ptr->total_procs >= job_ptr->num_procs) && - bit_super_set(job_scan_ptr->node_bitmap, bitmap)) { - bit_and(bitmap, job_scan_ptr->node_bitmap); - job_ptr->total_procs = job_scan_ptr->total_procs; - return SLURM_SUCCESS; - } + if ((job_scan_ptr->part_ptr != job_ptr->part_ptr) || + (job_scan_ptr->job_state != JOB_RUNNING) || + (job_scan_ptr->node_cnt != req_nodes) || + (job_scan_ptr->total_procs < job_ptr->num_procs) || + (!bit_super_set(job_scan_ptr->node_bitmap, bitmap))) + continue; + + if (job_ptr->details->req_node_bitmap && + (!bit_super_set(job_ptr->details->req_node_bitmap, + job_scan_ptr->node_bitmap))) + continue; /* Required nodes missing from job */ + + if (job_ptr->details->exc_node_bitmap && + (bit_overlap(job_ptr->details->exc_node_bitmap, + job_scan_ptr->node_bitmap) != 0)) + continue; /* Excluded nodes in this job */ + + bit_and(bitmap, job_scan_ptr->node_bitmap); + job_ptr->total_procs = job_scan_ptr->total_procs; + rc = SLURM_SUCCESS; + break; } list_iterator_destroy(job_iterator); - return EINVAL; + return rc; } /* _job_test - does most of the real work for select_p_job_test(), which -- GitLab