diff --git a/src/plugins/sched/backfill/backfill.c b/src/plugins/sched/backfill/backfill.c index 3f370c050f84a0c4d85cadcbdd8904c66c6c7ed4..8cdd052db63fb485c6afee90c2561e26ca5510f0 100644 --- a/src/plugins/sched/backfill/backfill.c +++ b/src/plugins/sched/backfill/backfill.c @@ -2213,6 +2213,7 @@ static bool _more_work (time_t last_backfill_time) rc = true; } slurm_mutex_unlock( &thread_flag_mutex ); + return rc; } diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index e4c05d56fc1df1738220578bd9c8e065a99dd3d5..1cb4e1606bb01d29d068e4e4881e4d3715d86f92 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -98,6 +98,9 @@ #include "src/plugins/select/bluegene/bg_enums.h" +/* Delay start of pack job until all components are recorded */ +#define PACK_DELAY 2 + static pthread_mutex_t rpc_mutex = PTHREAD_MUTEX_INITIALIZER; static int rpc_type_size = 0; /* Size of rpc_type_* arrays */ static uint16_t *rpc_type_id = NULL; @@ -1130,6 +1133,28 @@ static void _del_alloc_pack_msg(void *x) slurm_free_resource_allocation_response_msg_members(alloc_msg); } +static void *_trigger_backfill_thread(void *args) +{ + sleep(PACK_DELAY); + last_job_update = time(NULL); + return (void *) NULL; +} + +/* Set last_job_update after the job's begin_time is reached so the + * backfill scheduler can run immediately thereafter */ +static void _trigger_backfill(void) +{ + pthread_attr_t trigger_attr; + pthread_t trigger_thread; + + slurm_attr_init(&trigger_attr); + if (pthread_attr_setdetachstate(&trigger_attr, PTHREAD_CREATE_DETACHED)) + error("pthread_attr_setdetachstate error %m"); + (void) pthread_create(&trigger_thread, &trigger_attr, + _trigger_backfill_thread, NULL); + slurm_attr_destroy(&trigger_attr); +} + /* _slurm_rpc_allocate_pack: process RPC to allocate a pack job resources */ static void _slurm_rpc_allocate_pack(slurm_msg_t * msg) { @@ -1147,7 +1172,7 @@ static void _slurm_rpc_allocate_pack(slurm_msg_t * msg) char *err_msg = NULL; ListIterator iter; bool priv_user; - time_t min_begin = time(NULL) + 3; /* Do not start immediately */ + time_t min_begin = time(NULL) + PACK_DELAY; /* Delay start */ List submit_job_list = NULL; uint32_t pack_job_id = 0, pack_job_offset = 0; hostset_t jobid_hostset = NULL; @@ -1301,6 +1326,7 @@ static void _slurm_rpc_allocate_pack(slurm_msg_t * msg) } list_iterator_destroy(iter); xfree(tmp_str); + _trigger_backfill(); } unlock_slurmctld(job_write_lock); _throttle_fini(&active_rpc_cnt);