[Majeur] Inscription aux events : overbooking et 500 sur requêtes simultanées #105

Closed
opened 2026-10-28 10:32:02 +00:00 by asventi · 0 comments
Owner

Gravité : Majeur
Rapports QA d'origine : EVENTS-10, EVENTS-21

Race condition : 5 inscrits sur un event de taille 2 ; doubles inscriptions/désinscriptions simultanées (double-clic) donnent 500.

Détails des rapports

[EVENTS-10] Race condition à l'inscription : dépassement de la capacité (overbooking) — Gravité : Majeur
  • Où : POST /api/events/{id}/registration
  • Étapes : 1. event de taille 2 (ou 1 ou 3). 2. 5 users s'inscrivent simultanément (5 requêtes en parallèle).
  • Attendu : exactement size réponses 201, les autres 409 EVENT_FULL.
  • Obtenu : taille 2 -> 5 x 201, registeredCount = 5 ; taille 1 -> 2 x 201 (count 2) ; taille 3 -> 5 x 201 (count 5). En séquentiel le contrôle fonctionne (409 EVENT_FULL).
  • Cause probable : CreateRegistrationCommand.cs:42-55 : check-then-insert sur ev.Registrations.Count sans verrou/transaction sérialisable ni contrainte en base.
  • Conséquence : l'UI affiche 5/2 (le bouton passe en "Full" mais l'event est sur-réservé) ; PUT avec Size < registrations refuse alors de baisser (409).
[EVENTS-21] Doubles requêtes simultanées d'inscription/désinscription -> 500 au lieu de 409/404 — Gravité : Mineur
  • Où : POST /api/events/{id}/registration et DELETE /api/events/{id}/registration
  • Étapes : 4 requêtes simultanées du même user. Inscription : [201, 500, 500, 500] ; désinscription : [500, 204, 500, 500] (DbUpdateConcurrencyException). Reproductible en UI par double-clic sur le bouton "Registered" (une des deux requêtes DELETE renvoie 500, vu dans failed_requests).
  • Attendu : 409 ALREADY_REGISTERED / 404 NOT_REGISTERED (idempotent).
  • Cause probable : CreateRegistrationCommand.cs:37-55, DeleteRegistrationCommand.cs:25-32 (check-then-act, exceptions de concurrence EF non gérées, mêmes causes que EVENTS-10).

Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes.

**Gravité :** Majeur **Rapports QA d'origine :** EVENTS-10, EVENTS-21 Race condition : 5 inscrits sur un event de taille 2 ; doubles inscriptions/désinscriptions simultanées (double-clic) donnent 500. ## Détails des rapports <details><summary>[EVENTS-10] Race condition à l'inscription : dépassement de la capacité (overbooking) — Gravité : Majeur</summary> - Où : `POST /api/events/{id}/registration` - Étapes : 1. event de taille 2 (ou 1 ou 3). 2. 5 users s'inscrivent simultanément (5 requêtes en parallèle). - Attendu : exactement `size` réponses 201, les autres 409 EVENT_FULL. - Obtenu : taille 2 -> 5 x 201, `registeredCount = 5` ; taille 1 -> 2 x 201 (count 2) ; taille 3 -> 5 x 201 (count 5). En séquentiel le contrôle fonctionne (409 `EVENT_FULL`). - Cause probable : `CreateRegistrationCommand.cs:42-55` : check-then-insert sur `ev.Registrations.Count` sans verrou/transaction sérialisable ni contrainte en base. - Conséquence : l'UI affiche `5/2` (le bouton passe en "Full" mais l'event est sur-réservé) ; `PUT` avec Size < registrations refuse alors de baisser (409). </details> <details><summary>[EVENTS-21] Doubles requêtes simultanées d'inscription/désinscription -> 500 au lieu de 409/404 — Gravité : Mineur</summary> - Où : `POST /api/events/{id}/registration` et `DELETE /api/events/{id}/registration` - Étapes : 4 requêtes simultanées du même user. Inscription : `[201, 500, 500, 500]` ; désinscription : `[500, 204, 500, 500]` (`DbUpdateConcurrencyException`). Reproductible en UI par double-clic sur le bouton "Registered" (une des deux requêtes DELETE renvoie 500, vu dans `failed_requests`). - Attendu : 409 `ALREADY_REGISTERED` / 404 `NOT_REGISTERED` (idempotent). - Cause probable : `CreateRegistrationCommand.cs:37-55`, `DeleteRegistrationCommand.cs:25-32` (check-then-act, exceptions de concurrence EF non gérées, mêmes causes que EVENTS-10). </details> --- _Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes._
asventi self-assigned this 2026-10-28 13:49:13 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transcendence/backend#105
No description provided.