Bug #104623
non-déterminisme sur une erreur de non-disponibilité de guichets multiples dans l’endpoint fillslot pour un agenda de type rdv (?)
0%
Description
Sur une prise de rdv simple¹ pour un agenda de type rdv disposant de plusieurs guichets², des erreurs surviennent par intermittence quant à la disponibilité des guichets³.
Je ne parviens pas à reproduire l’erreur par mimétisme du code de cet endpoint, dans un shell django sur l’instance concernée.
À éplucher le code je vois d’ailleurs que cette erreur est levée à deux endroits, dont le deuxième, relatif à une race-condition, semble être de fait exclu par la faible fréquence de cet appel à cet endpoint fillslot sur cette instance⁴ :
except IntegrityError as e:
if 'tstzrange_constraint' in str(e):
# "optimistic concurrency control", between our availability
# check with get_all_slots() and now, new event can have been
# created and conflict with the events we want to create, and
# so we get an IntegrityError exception. In this case we
# restart the fillslot() from the begginning to redo the
# availability check and return a proper error to the client.
#
# To prevent looping, we raise an APIError during the second run
# of fillslot().
Sans pouvoir reproduire à coup sûr l’erreur mentionnée dans le ticket client, on en déduit que soit l’erreur survient :
· à la première des deux levées de cette erreur “no more desk available” : https://git.entrouvert.org/entrouvert/chrono/src/branch/main/chrono/api/views.py#L1707
auquel cas on a affaire à un souci de récupération du guichet.
· à la seconde des deux levées de cette erreur : https://git.entrouvert.org/entrouvert/chrono/src/branch/main/chrono/api/views.py#L1782
auquel cas on a un souci dans la tentative de détection des erreurs d’intégrité / race-conditions à la création en base du rdv.
Bref dans les deux cas c’est embêtant, difficilement reproductible et je veux bien l’avis d’un·e développeur·se chrono sur le sujet.
Je ne sais pas si par exemple, des ralentissements sur la recette au moment où est tentée cette transaction de création du rdv sont susceptibles de créer cette IntegrityError que chrono interprète ensuite à tort comme une race-condition (?)
Related issues
History
Updated by Benjamin Dauvergne about 1 month ago
C'est toujours une race condition, il y a un décalage de temps entre la récupération des plages libres et le moment de la réservation, donc si deux fillslots choisissent de réserver le même guichet au même moment parce que les deux le voient libre, poum IntegrityError.
Il faut surtout regarder les logs haproxy de chrono pour voir s'il y a plusieurs fillslot au même moment pour la même date, sinon c'est bizarre.
Updated by Benjamin Dauvergne about 1 month ago
Est-ce que la pré-réservation est utilisée ? C'est aussi un des moyens d'éviter ce problème au moment du statut initial.
Updated by Valentin Deniaud about 1 month ago
- Related to Développement #104677: prise de rdv BO, ajouter un lien vers la doc dans le formulaire de configuration added