From adbe584a4c4625b81b8172d271ae24821277c81a Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Jul 10 2025 15:49:54 +0000 Subject: PR#4413: Fix race handling in get_next_build Merges #4413 https://pagure.io/koji/pull-request/4413 Fixes: #4414 https://pagure.io/koji/issue/4414 Fix race handling in get_next_build --- diff --git a/kojihub/kojihub.py b/kojihub/kojihub.py index d48a549..f62949b 100644 --- a/kojihub/kojihub.py +++ b/kojihub/kojihub.py @@ -4859,9 +4859,12 @@ def get_next_build(build_info): return new_build(build_info) build_info['release'] = get_next_release(build_info) for try_no in range(2, 10): + savepoint = Savepoint('get_next_build_pre_insert') try: - return new_build(build_info) - except IntegrityError: + # using strict so we don't try to recycle + return new_build(build_info, strict=True) + except (IntegrityError, koji.GenericError): + savepoint.rollback() build_info['release'] = get_next_release(build_info, try_no) # otherwise raise koji.GenericError("Can't find available release") diff --git a/tests/test_hub/test_get_next_build.py b/tests/test_hub/test_get_next_build.py index ecbaa68..7661386 100644 --- a/tests/test_hub/test_get_next_build.py +++ b/tests/test_hub/test_get_next_build.py @@ -12,6 +12,7 @@ class TestGetNextBuild(unittest.TestCase): self.get_next_release = mock.patch('kojihub.kojihub.get_next_release').start() self.new_build = mock.patch('kojihub.kojihub.new_build').start() self._dml = mock.patch('kojihub.kojihub._dml').start() + self.Savepoint = mock.patch('kojihub.kojihub.Savepoint').start() self.binfo = {'name': 'name', 'version': 'version'} def tearDown(self):