From 1595d7de75211eb53b96602c76af47cded5bbdbd Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: May 19 2020 09:06:52 +0000 Subject: improve race condition for getNextRelease / images Fixes: https://pagure.io/koji/issue/2138 --- diff --git a/builder/kojid b/builder/kojid index 63467ac..90b612b 100755 --- a/builder/kojid +++ b/builder/kojid @@ -2441,10 +2441,6 @@ class BuildImageTask(MultiPlatformTask): dict(name=name, version=version, release=release, epoch=0)) - def getRelease(self, name, ver): - """return the next available release number for an N-V""" - return self.session.getNextRelease(dict(name=name, version=ver)) - class BuildBaseImageTask(BuildImageTask): Methods = ['image'] @@ -2476,15 +2472,14 @@ class BuildBaseImageTask(BuildImageTask): bld_info = None try: release = opts.get('release') - if not release: - release = self.getRelease(name, version) if '-' in version: raise koji.ApplianceError('The Version may not have a hyphen') - if '-' in release: + if release and '-' in release: raise koji.ApplianceError('The Release may not have a hyphen') if not opts.get('scratch'): bld_info = self.initImageBuild(name, version, release, target_info, opts) + release = bld_info['release'] subtasks = {} self.logger.debug("Spawning jobs for image arches: %r" % (arches)) @@ -2616,11 +2611,10 @@ class BuildApplianceTask(BuildImageTask): bld_info = None try: release = opts.get('release') - if not release: - release = self.getRelease(name, version) if not opts.get('scratch'): bld_info = self.initImageBuild(name, version, release, target_info, opts) + release = bld_info['release'] create_task_id = self.session.host.subtask(method='createAppliance', arglist=[name, version, release, arch, target_info, build_tag, @@ -2704,11 +2698,10 @@ class BuildLiveCDTask(BuildImageTask): bld_info = None try: release = opts.get('release') - if not release: - release = self.getRelease(name, version) if not opts.get('scratch'): bld_info = self.initImageBuild(name, version, release, target_info, opts) + release = bld_info['release'] create_task_id = self.session.host.subtask(method='createLiveCD', arglist=[name, version, release, arch, target_info, build_tag, @@ -2797,16 +2790,16 @@ class BuildLiveMediaTask(BuildImageTask): bld_info = None try: release = opts.get('release') - if not release: - release = self.getRelease(name, version) if not opts.get('scratch'): bld_info = self.initImageBuild(name, version, release, target_info, opts) + release = bld_info['release'] subtasks = {} canfail = [] for arch in arches: subtasks[arch] = self.subtask('createLiveMedia', - [name, version, release, arch, target_info, + [name, version, release, + arch, target_info, build_tag, repo_info, ksfile, opts], label='livemedia %s' % arch, arch=arch) if arch in opts.get('optional_arches', []): @@ -4469,11 +4462,6 @@ class BuildIndirectionImageTask(OzImageTask): return self.session.host.initImageBuild(self.id, dict(name=name, version=version, release=release, epoch=0)) - - def getRelease(self, name, ver): - """return the next available release number for an N-V""" - return self.session.getNextRelease(dict(name=name, version=ver)) - # END inefficient base image task method copies def fetchHubOrSCM(self, filepath, fileurl, build_tag): @@ -4652,11 +4640,9 @@ class BuildIndirectionImageTask(OzImageTask): release = opts['release'] # TODO: Another mostly copy-paste - if not release: - release = self.getRelease(name, version) if '-' in version: raise koji.ApplianceError('The Version may not have a hyphen') - if '-' in release: + if release and '-' in release: raise koji.ApplianceError('The Release may not have a hyphen') indirection_template = self.fetchHubOrSCM(opts.get('indirection_template'), diff --git a/hub/kojihub.py b/hub/kojihub.py index 690bd24..6fb475b 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -13972,6 +13972,8 @@ class HostExports(object): data['owner'] = task.getOwner() data['state'] = koji.BUILD_STATES['BUILDING'] data['completion_time'] = None + if data.get('release') is None: + data['release'] = get_next_release(build_info) build_id = new_build(data) data['id'] = build_id new_image_build(data)