Skip to content
This repository has been archived by the owner on May 24, 2018. It is now read-only.

Commit

Permalink
Handle the case where a builder is removed during reconfiguration whi…
Browse files Browse the repository at this point in the history
…le running a build
  • Loading branch information
mariangemarcano committed Apr 21, 2017
1 parent 655847a commit 11f809e
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 16 deletions.
14 changes: 12 additions & 2 deletions master/buildbot/process/botmaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from buildbot.process import metrics
from buildbot.process.buildrequest import BuildRequest, BuildRequestControl
from buildbot.process.buildrequestdistributor import KatanaBuildRequestDistributor
from buildbot.status.results import INTERRUPTED

class BotMaster(config.ReconfigurableServiceMixin, service.MultiService):

Expand Down Expand Up @@ -245,6 +246,15 @@ def removeQueuedBuilds(self, removed_builders):
brc = BuildRequestControl(None, br)
yield brc.cancel()

@defer.inlineCallbacks
def stopAllBuilds(self, builder):
if not builder.builder_status:
return

reason = "Builder %s has been removed" % builder.name
for build_status in builder.builder_status.currentBuilds:
yield build_status.stopBuild(reason=reason, result=INTERRUPTED)

@defer.inlineCallbacks
def reconfigServiceBuilders(self, new_config):

Expand All @@ -270,9 +280,9 @@ def reconfigServiceBuilders(self, new_config):
for n in removed_names:
builder = old_by_name[n]

yield self.stopAllBuilds(builder)

del self.builders[n]
builder.master = None
builder.botmaster = None

yield defer.maybeDeferred(lambda :
builder.disownServiceParent())
Expand Down
2 changes: 1 addition & 1 deletion master/buildbot/process/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ def stopService(self):
d = defer.maybeDeferred(lambda:
service.MultiService.stopService(self))

if self.building:
if self.building and self.master.status.getBuilder(self.name):
for b in self.building:
d.addCallback(self._resubmit_buildreqs, b.requests)
d.addErrback(log.err)
Expand Down
5 changes: 3 additions & 2 deletions master/buildbot/status/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,9 @@ def checkLogfiles(self):

@defer.inlineCallbacks
def stopBuild(self, reason, result=None):
if self.isFinished():
return

c = interfaces.IControl(self.master)
buildername = self.getBuilder().getName()
bldrc = c.getBuilder(buildername)
Expand All @@ -530,8 +533,6 @@ def stopBuild(self, reason, result=None):
if bldc:
yield bldc.stopBuild(reason=reason, result=result)

defer.succeed(None)

def cancelYourself(self):
self.results = CANCELED
self.started = util.now() if self.started is None else self.started
Expand Down
14 changes: 7 additions & 7 deletions master/buildbot/status/master.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,10 +314,9 @@ def getBuilder(self, name):
"""
@rtype: L{BuilderStatus}
"""
if name in self.botmaster.builders:
return self.botmaster.builders[name].builder_status
builder = self.botmaster.builders.get(name)

return None
return builder.builder_status if builder else None

def getSlaveNames(self):
return self.botmaster.slaves.keys()
Expand Down Expand Up @@ -371,10 +370,11 @@ def generateFinishedBuildsAsync(self, num_builds=15, results=None, slavename=Non

all_builds = []
for bn in builder_names:
b = self.getBuilder(bn)
finished_builds = yield b.getFinishedBuildsByNumbers(buildnumbers=lastBuilds[bn],
results=results)
all_builds.extend(finished_builds)
builder = self.getBuilder(bn)
if builder:
finished_builds = yield builder.getFinishedBuildsByNumbers(buildnumbers=lastBuilds[bn],
results=results)
all_builds.extend(finished_builds)

sorted_builds = sorted(all_builds, key=lambda build: build.finished, reverse=True)
defer.returnValue(sorted_builds)
Expand Down
8 changes: 4 additions & 4 deletions master/buildbot/test/unit/test_process_botmaster_BotMaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,21 +210,21 @@ def test_reconfigServiceSlaves_class_changes(self):
def test_reconfigServiceBuilders_add_remove(self):
bc = config.BuilderConfig(name='bldr', factory=factory.BuildFactory(),
slavename='f', project="project")
self.new_config.builders = [ bc ]
self.new_config.builders = [bc]

yield self.botmaster.reconfigServiceBuilders(self.new_config)

bldr = self.botmaster.builders['bldr']
self.assertIdentical(bldr.parent, self.botmaster)
self.assertIdentical(bldr.master, self.master)
self.assertEqual(self.botmaster.builderNames, [ 'bldr' ])
self.assertEqual(self.botmaster.builderNames, ['bldr'])

self.new_config.builders = [ ]
self.new_config.builders = []

yield self.botmaster.reconfigServiceBuilders(self.new_config)

self.assertIdentical(bldr.parent, None)
self.assertIdentical(bldr.master, None)
self.assertTrue(bldr.master is not None)
self.assertEqual(self.botmaster.builders, {})
self.assertEqual(self.botmaster.builderNames, [])

Expand Down

0 comments on commit 11f809e

Please sign in to comment.