Projet

Général

Profil

0001-mitigate-race-condition-while-get-or-creating-reccur.patch

Paul Marillonnet, 08 juillet 2021 10:40

Télécharger (2,26 ko)

Voir les différences:

Subject: [PATCH] mitigate race condition while get-or-creating reccurent event
 (#55393)

    inspired from django's behavior on get_or_create, e.g.
    https://github.com/django/django/blob/stable/-
    2.2.x/django/db/models/query.py#L567
 chrono/agendas/models.py | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)
chrono/agendas/models.py
33 33
from django.contrib.postgres.fields import ArrayField, JSONField
34 34
from django.core.exceptions import FieldDoesNotExist, ValidationError
35 35
from django.core.validators import MaxValueValidator, MinValueValidator
36
from django.db import connection, models, transaction
36
from django.db import IntegrityError, connection, models, transaction
37 37
from django.db.models import Count, IntegerField, Max, OuterRef, Q, Subquery, Value
38 38
from django.db.models.functions import Coalesce
39 39
from django.template import Context, Template, TemplateSyntaxError, VariableDoesNotExist, engines
......
1570 1570
            raise ValueError('Multiple events found for specified datetime.')
1571 1571

  
1572 1572
        event = events[0]
1573
        with transaction.atomic():
1573
        try:
1574
            return Event.objects.get(agenda=self.agenda, slug=event.slug)
1575
        except Event.DoesNotExist:
1574 1576
            try:
1575
                return Event.objects.get(agenda=self.agenda, slug=event.slug)
1576
            except Event.DoesNotExist:
1577
                event.save()
1578
                return event
1577
                with transaction.atomic():
1578
                    event.save()
1579
                    return event
1580
            except IntegrityError as e:
1581
                try:
1582
                    return Event.objects.get(agenda=self.agenda, slug=event.slug)
1583
                except Event.DoesNotExist:
1584
                    pass
1585
                raise e
1579 1586

  
1580 1587
    def get_recurrences(
1581 1588
        self, min_datetime, max_datetime, excluded_datetimes=None, exceptions=None, slug_separator='--'
1582
-