[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