[Mineur] Demandes d'ami croisées simultanées : 500 (deadlock Postgres) #134

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

Gravité : Mineur
Rapports QA d'origine : FRIENDS-08

Détails des rapports

[FRIENDS-08] Demandes d'ami croisées / simultanées : 500 (deadlock Postgres) au lieu d'une acceptation ou d'un 409 — Gravité : Mineur
  • Où : POST /api/me/relationships/{userId}
  • Étapes : 1. A et C sans relation. 2. A->C et C->A envoyés en même temps (2 threads). Répété 12 fois. 3. Idem : 4 POST A->C simultanés (double clic / double soumission).
  • Attendu : une des deux requêtes devient une acceptation (A et C amis) ou renvoie 409 ; jamais de 500.
  • Obtenu : 12/12 fois, l'une des deux requêtes répond 500 (40P01: deadlock detected), l'autre 200 ; l'état final est "demande en attente" (A->C ou C->A) et pas "amis". 4 requêtes simultanées A->C : [200, 500, 500, 500]. La réponse 500 contient la stack trace complète .NET + détail SQL (fuite d'informations internes).
  • Preuve : sortie de scripts/friends/race.py et race2.py (corps 500 : "Npgsql.PostgresException (0x80004005): 40P01: deadlock detected ...").
  • Cause probable : backend/API/Users/Me/Relationships/Create/CreateRelationshipCommand.cs insère 2 lignes (mine/theirs) sans transaction sérialisable ni retry ; deux inserts croisés se bloquent mutuellement (index unique). Même risque dans Block/Delete. L'UI désactive le bouton pendant isPending, donc surtout atteignable via 2 onglets / API.

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é :** Mineur **Rapports QA d'origine :** FRIENDS-08 ## Détails des rapports <details><summary>[FRIENDS-08] Demandes d'ami croisées / simultanées : 500 (deadlock Postgres) au lieu d'une acceptation ou d'un 409 — Gravité : Mineur</summary> - Où : `POST /api/me/relationships/{userId}` - Étapes : 1. A et C sans relation. 2. A->C et C->A envoyés en même temps (2 threads). Répété 12 fois. 3. Idem : 4 POST A->C simultanés (double clic / double soumission). - Attendu : une des deux requêtes devient une acceptation (A et C amis) ou renvoie 409 ; jamais de 500. - Obtenu : 12/12 fois, l'une des deux requêtes répond 500 (`40P01: deadlock detected`), l'autre 200 ; l'état final est "demande en attente" (A->C ou C->A) et pas "amis". 4 requêtes simultanées A->C : `[200, 500, 500, 500]`. La réponse 500 contient la stack trace complète .NET + détail SQL (fuite d'informations internes). - Preuve : sortie de `scripts/friends/race.py` et `race2.py` (corps 500 : "Npgsql.PostgresException (0x80004005): 40P01: deadlock detected ..."). - Cause probable : `backend/API/Users/Me/Relationships/Create/CreateRelationshipCommand.cs` insère 2 lignes (mine/theirs) sans transaction sérialisable ni retry ; deux inserts croisés se bloquent mutuellement (index unique). Même risque dans Block/Delete. L'UI désactive le bouton pendant `isPending`, donc surtout atteignable via 2 onglets / API. </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._
Equoo self-assigned this 2026-10-28 10:53:34 +00:00
Equoo closed this issue 2026-11-01 20:12:14 +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#134
No description provided.