Skip to content

Commit 54f70d0

Browse files
gerrod3jobselko
authored andcommitted
Fix race condition inside SingleArtifactContentUploadSerializer
Assisted by: cursor-composer-2.5 (cherry picked from commit 94f63c3)
1 parent 9ef572f commit 54f70d0

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed a race condition when creating content with `file_url` or `upload` that could result in a duplicate artifact error.

pulpcore/plugin/serializers/content.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tempfile import NamedTemporaryFile
44
from urllib.parse import urlparse
55

6-
from django.db import DatabaseError
6+
from django.db import DatabaseError, IntegrityError
77
from rest_framework.serializers import (
88
CharField,
99
FileField,
@@ -14,7 +14,6 @@
1414
from pulpcore.app.files import PulpTemporaryUploadedFile
1515
from pulpcore.app.models import Artifact, PulpTemporaryFile, Remote, Upload, UploadChunk
1616
from pulpcore.app.serializers import (
17-
ArtifactSerializer,
1817
NoArtifactContentSerializer,
1918
RelatedField,
2019
SingleArtifactContentSerializer,
@@ -259,19 +258,21 @@ def deferred_validate(self, data):
259258
# if artifact already exists, let's use it
260259
try:
261260
artifact = Artifact.objects.get(
262-
sha256=file.hashers["sha256"].hexdigest(),
263-
pulp_domain=get_domain_pk(),
261+
sha256=file.hashers["sha256"].hexdigest(), pulp_domain=get_domain_pk()
264262
)
265263
if not artifact.pulp_domain.get_storage().exists(artifact.file.name):
266264
artifact.file = file
267265
artifact.save()
268266
else:
269267
artifact.touch()
270268
except (Artifact.DoesNotExist, DatabaseError):
271-
artifact_data = {"file": file}
272-
serializer = ArtifactSerializer(data=artifact_data)
273-
serializer.is_valid(raise_exception=True)
274-
artifact = serializer.save()
269+
artifact = Artifact.init_and_validate(file)
270+
try:
271+
artifact.save()
272+
except IntegrityError:
273+
artifact = Artifact.objects.get(
274+
sha256=artifact.sha256, pulp_domain=get_domain_pk()
275+
)
275276
data["artifact"] = artifact
276277
return data
277278

0 commit comments

Comments
 (0)