From babc019ae2e7c5815875d8424735b499c5776351 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Wed, 29 Jan 2020 12:54:49 +0100 Subject: [PATCH] mxqd: Simplify start_user Historically, start_user was called with differenct values for the job_limit argument. Jobs were started round-robin from the groups with highest priority round-robin. If no more jobs could be started from that priority, jobs from lower priority were considered, too. The groups are ordered by priority. Currently, start_user is always called with a job_limit argument of 1 and just the first eligible jobs is started. Remove the job_limit argument and start a single job only. Remove the code complexity which is no longer needed. --- mxqd.c | 57 +++++++++++++-------------------------------------------- 1 file changed, 13 insertions(+), 44 deletions(-) diff --git a/mxqd.c b/mxqd.c index 012fdff1..412e43e3 100644 --- a/mxqd.c +++ b/mxqd.c @@ -1273,18 +1273,12 @@ unsigned long start_job(struct mxq_group_list *glist) /**********************************************************************/ -unsigned long start_user(struct mxq_user_list *ulist, int job_limit, long slots_to_start) +unsigned long start_user(struct mxq_user_list *ulist, long slots_to_start) { struct mxq_server *server; struct mxq_group_list *glist; - struct mxq_group_list *gnext = NULL; struct mxq_group *group; - unsigned int prio; - unsigned char started = 0; - unsigned long slots_started = 0; - int jobs_started = 0; - unsigned long df_scratch; assert(ulist); @@ -1295,67 +1289,42 @@ unsigned long start_user(struct mxq_user_list *ulist, int job_limit, long slots_ glist = ulist->groups; group = &glist->group; - prio = group->group_priority; - assert(slots_to_start <= server->slots - server->slots_running); - mx_log_debug(" user=%s(%d) slots_to_start=%ld job_limit=%d :: trying to start jobs for user.", - group->user_name, group->user_uid, slots_to_start, job_limit); + mx_log_debug(" user=%s(%d) slots_to_start=%ld :: trying to start jobs for user.", + group->user_name, group->user_uid, slots_to_start); df_scratch=mx_df(MXQ_JOB_TMPDIR_FS "/."); - for (glist = ulist->groups; glist && slots_to_start > 0 && (!job_limit || jobs_started < job_limit); glist = gnext) { + for (glist = ulist->groups; glist ; glist = glist->next) { group = &glist->group; - gnext = glist->next; - - assert(glist->jobs_running <= group->group_jobs); - assert(glist->jobs_running <= glist->jobs_max); if (glist->jobs_running == group->group_jobs) { - goto start_user_continue; + continue; } if (glist->jobs_running == glist->jobs_max) { - goto start_user_continue; + continue; } if (mxq_group_jobs_inq(group) == 0) { - goto start_user_continue; + continue; } if (glist->slots_per_job > slots_to_start) { - goto start_user_continue; + continue; } - if (df_scratch/1024/1024/1024 < group->job_tmpdir_size + 20) { - goto start_user_continue; + continue; } - if (group->group_priority < prio) { - if (started) { - goto start_user_rewind; - } - prio = group->group_priority; - } mx_log_info(" group=%s(%d):%lu slots_to_start=%ld slots_per_job=%lu :: trying to start job for group.", group->user_name, group->user_uid, group->group_id, slots_to_start, glist->slots_per_job); if (start_job(glist)) { - slots_to_start -= glist->slots_per_job; - jobs_started++; - slots_started += glist->slots_per_job; - - started = 1; + int slots_started = glist->slots_per_job; + return slots_started; } - -start_user_continue: - if (gnext || !started) - continue; - -start_user_rewind: - gnext = ulist->groups; - started = 0; - continue; } - return slots_started; + return 0; } /**********************************************************************/ @@ -1390,7 +1359,7 @@ long start_user_with_least_running_global_slot_count(struct mxq_server *server) if (waiting && ulist->global_slots_running > global_slots_per_user) return -1; - slots_started = start_user(ulist, 1, slots_free); + slots_started = start_user(ulist, slots_free); if (slots_started) return slots_started;