[buildinfo.debian.net] 01/01: Avoid a race condition between check-and-creation of Buildinfo instances.

Chris Lamb chris at chris-lamb.co.uk
Sun Jul 9 09:15:34 UTC 2017


This is an automated email from the git hooks/post-receive script.

lamby pushed a commit to branch master
in repository buildinfo.debian.net.

commit fa6942611814c98e306f00582fdef4c83039e812
Author: Chris Lamb <lamby at debian.org>
Date:   Sun Jul 9 10:15:10 2017 +0100

    Avoid a race condition between check-and-creation of Buildinfo instances.
    
    Signed-off-by: Chris Lamb <lamby at debian.org>
---
 bidb/api/utils.py | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/bidb/api/utils.py b/bidb/api/utils.py
index 07058e4..7a65657 100644
--- a/bidb/api/utils.py
+++ b/bidb/api/utils.py
@@ -4,7 +4,7 @@ import hashlib
 from debian import deb822
 from dateutil.parser import parse
 
-from django.db import transaction
+from django.db import transaction, IntegrityError
 from django.core.files.base import ContentFile
 from django.core.files.storage import default_storage
 
@@ -62,13 +62,6 @@ def parse_submission(request):
 
         return submission
 
-    sha1 = hashlib.sha1(raw_text_gpg_stripped.encode('utf-8')).hexdigest()
-    try:
-        # Already exists; just attach a new Submission instance
-        return create_submission(Buildinfo.objects.get(sha1=sha1)), False
-    except Buildinfo.DoesNotExist:
-        pass
-
     ## Parse new .buildinfo ###################################################
 
     def get_or_create(model, field):
@@ -84,20 +77,27 @@ def parse_submission(request):
             )
         )
 
-    buildinfo = Buildinfo.objects.create(
-        sha1=sha1,
+    sha1 = hashlib.sha1(raw_text_gpg_stripped.encode('utf-8')).hexdigest()
+
+    try:
+        with transaction.atomic():
+            buildinfo = Buildinfo.objects.create(
+                sha1=sha1,
 
-        source=get_or_create(Source, 'Source'),
-        architecture=get_or_create(Architecture, 'Architecture'),
-        version=data['version'],
+                source=get_or_create(Source, 'Source'),
+                architecture=get_or_create(Architecture, 'Architecture'),
+                version=data['version'],
 
-        build_path=data.get('Build-Path', ''),
-        build_date=parse(data.get('Build-Date', '')),
-        build_origin=get_or_create(Origin, 'Build-Origin'),
-        build_architecture=get_or_create(Architecture, 'Build-Architecture'),
+                build_path=data.get('Build-Path', ''),
+                build_date=parse(data.get('Build-Date', '')),
+                build_origin=get_or_create(Origin, 'Build-Origin'),
+                build_architecture=get_or_create(Architecture, 'Build-Architecture'),
 
-        environment=data.get('Environment', ''),
-    )
+                environment=data.get('Environment', ''),
+            )
+    except IntegrityError:
+        # Already exists; just attach a new Submission instance
+        return create_submission(Buildinfo.objects.get(sha1=sha1)), False
 
     default_storage.save(
         buildinfo.get_storage_name(),

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/buildinfo.debian.net.git



More information about the Reproducible-commits mailing list