# HG changeset patch # User wbell # Date 1185227987 0 # Node ID 446092a2d2fe68bac779e8e29dd6d0dd25256083 # Parent b81c67778df7a8b69a2d7de5944d6b4dd488a2e1 Don't accept build results from a slave if the build has been invalidated or it's being built by another slave. Closes #100. diff --git a/bitten/master.py b/bitten/master.py --- a/bitten/master.py +++ b/bitten/master.py @@ -164,8 +164,7 @@ self.channel.send_rpy(msgno, beep.Payload(xml)) def send_initiation(self, queue, build): - log.info('Initiating build of "%s" on slave %s', build.config, - self.name) + log.info('Initiating build of %d ("%s" as of [%s]) on slave %s', build.id, build.config, build.rev, self.name) build.slave = self.name build.slave_info.update(self.info) @@ -246,6 +245,16 @@ if payload.content_type != beep.BEEP_XML: raise beep.ProtocolError(500) elem = xmlio.parse(payload.body) + + # verify that the build hasn't been modified out from + # under us-- we don't want to accept any build information + # from builds that have been invalidated or claimed by + # other slaves. + current_build = Build.fetch(queue.env, build.id) + if current_build.status != Build.IN_PROGRESS or current_build.slave != self.name: + raise beep.ProtocolError(550, 'Build %s has been invalidated, will not accept completed steps from slave %s' % (build.id, self.name)) + + if elem.name == 'started': self._build_started(queue, build, elem, timestamp_delta) elif elem.name == 'step': @@ -293,7 +302,7 @@ step.started -= timestamp_delta step.stopped -= timestamp_delta if elem.attr['result'] == 'failure': - log.warning('Step failed') + log.warning('Build %s Step %s failed', build.id, elem.attr['id']) step.status = BuildStep.FAILURE else: step.status = BuildStep.SUCCESS