From ea0077dce7e5c3e130be0f0528010861bff293bc Mon Sep 17 00:00:00 2001 From: Mathieu Dubois-Briand Date: Fri, 7 Mar 2025 15:02:15 +0100 Subject: [PATCH] builders: Rework least loaded worker finding in nextWorker() Signed-off-by: Mathieu Dubois-Briand --- builders.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/builders.py b/builders.py index 667e491..e4763d5 100644 --- a/builders.py +++ b/builders.py @@ -178,25 +178,16 @@ def nextWorker(bldr, workers, buildrequest): [resultspec.Filter('complete', 'eq', [False])], ) - active = {} - maxbuilds = 0 + active = {worker.worker.workerid: 0 for worker in possible_workers} for build in builds: - if build['workerid'] not in active: - active[build['workerid']] = 1 - else: + if build['workerid'] in active: active[build['workerid']] += 1 - if maxbuilds > active[build['workerid']]: - maxbuilds = active[build['workerid']] + least_actives = [k for k, v in active.items() if v == min(active.values())] - random.shuffle(possible_workers) - - for worker in possible_workers: - if worker.worker.workerid not in active: - return worker - for i in range(maxbuilds): - for worker in possible_workers: - if active[worker.worker.workerid] == i: - return worker + possible_workers = [worker for worker in possible_workers + if worker.worker.workerid in least_actives] + if possible_workers: + return random.choice(possible_workers) return None for w in possible_workers: