【问题标题】:Buildbot: worker is idleBuildbot:工人空闲
【发布时间】:2021-02-15 03:07:22
【问题描述】:

我注意到,构建在工作人员之间的分配是次优的,80% 的时间构建在繁忙的工作人员上运行。

如果你看一下图片,tmp_worker1 可以处理triggered_build_1,但是,它是空闲的!由于某种原因,triggered_build_1 处于锁定状态并被分配给忙碌的example-worker

我有下一个设置:

  • 3 名工人
  • 1 个主要建设者
  • 3 个可触发的构建器(带锁)

下面的主要源代码

# 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
...

【问题讨论】:

  • 我认为您需要提供更多代码,这样我们就可以创建一个工作副本并尝试解决您的问题

标签: python python-3.x triggers buildbot


【解决方案1】:

这种行为是由于锁和主服务器分发构建的方式而触发的。

当需要运行构建时,master 执行以下步骤 (link to the source code):

  • 随机选择一个工人
  • 检查工人和构建是否匹配
  • 检查构建是否可以获取工作人员所需的锁定
  • 将构建分配给主节点

当构建在 worker 上开始时,它会获取锁。

因此,如果主节点在获取锁之前检查下一个构建的调度要求,它可以在同一个工作人员上分派一个新的构建(即使他们需要相同的锁)。

如果您将分配构建的工作人员隔离起来,以便给工作人员足够的时间来获取锁定,则可以解决此问题。 您可以使用 canStartBuild 函数来执行此操作,该函数在将构建分配给工作人员 (docs) 之前运行。

def canStartBuildLockQuarantine(builder, wfb, request):
    # Put the worker in quarantine for 5 seconds
    wfb.worker.quarantine_timeout = 5
    wfb.worker.putInQuarantine()
    # Reset wfb.worker.quarantine_timeout
    wfb.worker.resetQuarantine()
    return True

然后交给负责锁的工人。

c['builders'].append(
    util.BuilderConfig(name="triggered_build_0",
        workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
        factory=factory_subbuild,
        canStartBuild=canStartBuildLockQuarantine,
        locks=worker_lock,
    )
)

【讨论】:

  • 哇!这很完美。非常感谢你。甚至 github 的 buildbot 社区也没有帮助解决这个问题
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多