Fix tracking race condition

This commit is contained in:
Tanner Collin 2021-04-15 22:38:46 +00:00
parent 677b4086e5
commit 9a3a9db4ee

View File

@ -5,6 +5,7 @@ from django.contrib.auth.models import User, Group
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
from django.db import transaction from django.db import transaction
from django.db.models import Max from django.db.models import Max
from django.db.utils import OperationalError
from django.http import HttpResponse, Http404, FileResponse from django.http import HttpResponse, Http404, FileResponse
from django.core.files.base import File from django.core.files.base import File
from django.core.cache import cache from django.core.cache import cache
@ -502,9 +503,10 @@ class StatsViewSet(viewsets.ViewSet, List):
except KeyError: except KeyError:
raise exceptions.ValidationError(dict(data='This field is required.')) raise exceptions.ValidationError(dict(data='This field is required.'))
@transaction.atomic
@action(detail=False, methods=['post']) @action(detail=False, methods=['post'])
def track(self, request): def track(self, request):
try:
with transaction.atomic():
if 'name' not in request.data: if 'name' not in request.data:
raise exceptions.ValidationError(dict(name='This field is required.')) raise exceptions.ValidationError(dict(name='This field is required.'))
@ -542,6 +544,10 @@ class StatsViewSet(viewsets.ViewSet, List):
return Response(200) return Response(200)
# keep trying if we hit a "database locked" error
except OperationalError:
return self.track(request)
class MemberCountViewSet(Base, List): class MemberCountViewSet(Base, List):
pagination_class = None pagination_class = None