I've noticed that the distribution of Builds between workers is sub-optimal, 80% of the time Builds are running on busy workers.
If you have a look at the image, tmp_worker1
can process triggered_build_1
, but instead, it's idle!!! For some reason, triggered_build_1
is in acquiring a locked state and is assigned to the busy example-worker
I have the next setup:
- 3 workers
- 1 main builder
- 3 triggerable builders (with locks)
Main source code below
# triggerable scheduler
c['schedulers'].append(schedulers.Triggerable(name="trigger_from_main",
builderNames=['triggered_build_0', 'triggered_build_1', 'triggered_build_2']))
# main builder factory
factory_main = util.BuildFactory()
# trigger
factory_main.addStep(steps.Trigger(
schedulerNames=['trigger_from_main'],
waitForFinish=True,
haltOnFailure=True,
name='trigger'
))
# main builder
c['builders'].append(
util.BuilderConfig(name="test_main",
workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
factory=factory_main,
)
)
# lock
worker_lock = [util.WorkerLock("worker_builds", maxCount=1).access('counting')]
# 1st of 3 sub-builder
c['builders'].append(
util.BuilderConfig(name="triggered_build_0",
workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
factory=factory_subbuild,
locks=worker_lock,
)
)
# 2nd of 3 sub-builder
...
# 3rd of 3 sub-builder
...