diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index d8c40965263ac8b33408f245c7c45de9dc8b1b8a..e175a7cf47a9a1eca03389312a389ffefc1231ab 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -59,6 +59,7 @@ #include "src/slurmctld/slurmctld.h" #define DETAILS_FLAG 0xdddd +#define MAX_NODE_FRAGMENTS 8 #define MAX_RETRIES 10 #define SLURM_CREATE_JOB_FLAG_NO_ALLOCATE_0 0 #define STEP_FLAG 0xbbbb @@ -122,6 +123,7 @@ static void _reset_step_bitmaps(struct job_record *job_ptr); static void _set_job_id(struct job_record *job_ptr); static void _set_job_prio(struct job_record *job_ptr); static bool _slurm_picks_nodes(job_desc_msg_t * job_specs); +static bool _too_many_fragments(bitstr_t *req_bitmap); static bool _top_priority(struct job_record *job_ptr); static int _validate_job_create_req(job_desc_msg_t * job_desc); static int _validate_job_desc(job_desc_msg_t * job_desc_msg, int allocate, @@ -1414,6 +1416,10 @@ static int _job_create(job_desc_msg_t * job_desc, uint32_t * new_job_id, error_code = ESLURM_REQUESTED_NODES_NOT_IN_PARTITION; goto cleanup; } + if (_too_many_fragments(req_bitmap)) { + error_code = ESLURM_TOO_MANY_REQUESTED_NODES; + goto cleanup; + } i = count_cpus(req_bitmap); if (i > job_desc->num_procs) job_desc->num_procs = i; @@ -3186,3 +3192,21 @@ void job_fini (void) xfree(job_hash); xfree(job_hash_over); } + +static bool _too_many_fragments(bitstr_t *req_bitmap) +{ +#ifdef MAX_NODE_FRAGMENTS + int i, frags=0; + int last_bit = 0, next_bit; + + for (i = 0; i < node_record_count; i++) { + next_bit = bit_test(req_bitmap, i); + if (next_bit == last_bit) + continue; + last_bit = next_bit; + if (next_bit && (++frags > MAX_NODE_FRAGMENTS)) + return true; + } +#endif + return false; +}