Skip to content

Commit

Permalink
Try_Jobdir: fix a race condition
Browse files Browse the repository at this point in the history
Wait for the sourcestamp to be written in the database before adding a buildset
that refers to it.
  • Loading branch information
delroth committed Mar 24, 2014
1 parent 7b69e8a commit 919f8ce
Showing 1 changed file with 31 additions and 33 deletions.
64 changes: 31 additions & 33 deletions master/buildbot/schedulers/trysched.py
Expand Up @@ -159,21 +159,24 @@ def postprocess_parsed_job():
raise BadJobfile("unknown version '%s'" % ver)
return parsed_job

@defer.inlineCallbacks
def handleJobFile(self, filename, f):
try:
parsed_job = self.parseJob(f)
builderNames = parsed_job['builderNames']
except BadJobfile:
log.msg("%s reports a bad jobfile in %s" % (self, filename))
log.err()
return defer.succeed(None)
defer.returnValue(None)
return

# Validate/fixup the builder names.
builderNames = self.filterBuilderList(builderNames)
if not builderNames:
log.msg(
"incoming Try job did not specify any allowed builder names")
return defer.succeed(None)
defer.returnValue(None)
return

who = ""
if parsed_job['who']:
Expand All @@ -183,37 +186,32 @@ def handleJobFile(self, filename, f):
if parsed_job['comment']:
comment = parsed_job['comment']

d = self.master.db.sourcestampsets.addSourceStampSet()

def addsourcestamp(setid):
self.master.db.sourcestamps.addSourceStamp(
sourcestampsetid=setid,
branch=parsed_job['branch'],
revision=parsed_job['baserev'],
patch_body=parsed_job['patch_body'],
patch_level=parsed_job['patch_level'],
patch_author=who,
patch_comment=comment,
patch_subdir='', # TODO: can't set this remotely - #1769
project=parsed_job['project'],
repository=parsed_job['repository'])
return setid

d.addCallback(addsourcestamp)

def create_buildset(setid):
reason = "'try' job"
if parsed_job['who']:
reason += " by user %s" % parsed_job['who']
properties = parsed_job['properties']
requested_props = Properties()
requested_props.update(properties, "try build")
return self.addBuildsetForSourceStamp(
ssid=None, setid=setid,
reason=reason, external_idstring=parsed_job['jobid'],
builderNames=builderNames, properties=requested_props)
d.addCallback(create_buildset)
return d
setid = yield self.master.db.sourcestampsets.addSourceStampSet()
yield self.master.db.sourcestamps.addSourceStamp(
sourcestampsetid=setid,
branch=parsed_job['branch'],
revision=parsed_job['baserev'],
patch_body=parsed_job['patch_body'],
patch_level=parsed_job['patch_level'],
patch_author=who,
patch_comment=comment,
patch_subdir='', # TODO: can't set this remotely - #1769
project=parsed_job['project'],
repository=parsed_job['repository'])

reason = "'try' job"
if parsed_job['who']:
reason += " by user %s" % parsed_job['who']
properties = parsed_job['properties']
requested_props = Properties()
requested_props.update(properties, "try build")
bsid, brids = yield self.addBuildsetForSourceStamp(
ssid=None, setid=setid,
reason=reason,
external_idstring=parsed_job['jobid'],
builderNames=builderNames,
properties=requested_props)
defer.returnValue((bsid, brids))


class Try_Userpass_Perspective(pbutil.NewCredPerspective):
Expand Down

0 comments on commit 919f8ce

Please sign in to comment.