From c2d255ec37b539c35963e222d307642ed3815896 Mon Sep 17 00:00:00 2001 From: Michael Simacek Date: Dec 09 2014 08:54:16 +0000 Subject: Handle receiving real builds we already have --- diff --git a/koschei/backend.py b/koschei/backend.py index 65d9b86..d95da40 100644 --- a/koschei/backend.py +++ b/koschei/backend.py @@ -94,23 +94,28 @@ class Backend(object): build.release), (info['epoch'], info['version'], - info['release'])) < 0)): + info['release'])) < 0) + and self.db.query(Build).filter_by(task_id=info['task_id']) + .count() == 0): return info def register_real_build(self, package, build_info): - state_map = {koji.BUILD_STATES['COMPLETE']: Build.COMPLETE, - koji.BUILD_STATES['FAILED']: Build.FAILED} - build = Build(task_id=build_info['task_id'], real=True, - version=build_info['version'], epoch=build_info['epoch'], - release=build_info['release'], package_id=package.id, - state=state_map[build_info['state']]) - self.db.add(build) - self.log.info('Registering real build for {}, task_id {}.' - .format(package, build.task_id)) - self.db.flush() - self.build_completed(build) - self.attach_depchanges(build) - return build + # we may alrady have that build + # (this function may be run in parallel with the same data) + with util.skip_on_integrity_violation(self.db): + state_map = {koji.BUILD_STATES['COMPLETE']: Build.COMPLETE, + koji.BUILD_STATES['FAILED']: Build.FAILED} + build = Build(task_id=build_info['task_id'], real=True, + version=build_info['version'], epoch=build_info['epoch'], + release=build_info['release'], package_id=package.id, + state=state_map[build_info['state']]) + self.db.add(build) + self.log.info('Registering real build for {}, task_id {}.' + .format(package, build.task_id)) + self.db.flush() + self.build_completed(build) + self.attach_depchanges(build) + return build def update_build_state(self, build, state): if state in Build.KOJI_STATE_MAP: