extern List find_preemptable_jobs(struct job_record *job_ptr) { ListIterator job_iterator; struct job_record *job_p; List preemptee_job_list = NULL; /* Validate the preemptor job */ if (job_ptr == NULL) { error("find_preemptable_jobs: job_ptr is NULL"); return preemptee_job_list; } if (!IS_JOB_PENDING(job_ptr)) { error("%s: %pJ not pending", __func__, job_ptr); return preemptee_job_list; } if (job_ptr->part_ptr == NULL) { error("%s: %pJ has NULL partition ptr", __func__, job_ptr); return preemptee_job_list; } if (job_ptr->part_ptr->node_bitmap == NULL) { error("find_preemptable_jobs: partition %s node_bitmap=NULL", job_ptr->part_ptr->name); return preemptee_job_list; } /* Build an array of pointers to preemption candidates */ job_iterator = list_iterator_create(job_list); while ((job_p = (struct job_record *) list_next(job_iterator))) { if (!IS_JOB_RUNNING(job_p) && !IS_JOB_SUSPENDED(job_p)) continue; if (!_qos_preemptable(job_p, job_ptr)) continue; if ((job_p->node_bitmap == NULL) || (bit_overlap(job_p->node_bitmap, job_ptr->part_ptr->node_bitmap) == 0)) continue; if (job_ptr->details && (job_ptr->details->expanding_jobid == job_p->job_id)) continue; if (acct_policy_is_job_preempt_exempt(job_p)) continue; /* This job is a preemption candidate */ if (preemptee_job_list == NULL) { preemptee_job_list = list_create(NULL); } list_append(preemptee_job_list, job_p); } list_iterator_destroy(job_iterator); if (preemptee_job_list && youngest_order) list_sort(preemptee_job_list, _sort_by_youngest); else if (preemptee_job_list) list_sort(preemptee_job_list, _sort_by_prio); return preemptee_job_list; }
extern bool job_preempt_check(job_queue_rec_t *preemptor, job_queue_rec_t *preemptee) { return _qos_preemptable(preemptee->job_ptr, preemptor->job_ptr); }