Description
Les créations du module Registry ne tolèrent pas le conflit « existe déjà » (409) : chaque création lève sur un statut >= 300. Sous exécution concurrente (cron + gestionnaire d'événement, ou événements projet parallèles), deux runs peuvent tous deux passer la vérification d'existence puis l'un des POST échoue.
Les 4 chemins concernés (registry.service.ts) :
createProject (:232) — gardé par getProjectByName (:216), mais lève sur 409 (l.233-235)
addGroupMember (:176) — gardé par le snapshot membersByName (:157), mais lève sur 409 (l.177-179)
createRobot (:83) — gardé par getRobot (:127) + retour Vault précoce (:122-125), mais lève sur 409 (l.86-88)
createRetention (:260) — gardé par getRetentionId (:256), mais lève sur 409 (l.261-263)
En séquentiel, la ré-synchronisation est idempotente (chaque création a une garde d'existence, les suppressions tolèrent 404). Le gap n'apparaît qu'en concurrence.
Etapes de reproduction
- Déclencher une réconciliation concurrente du même projet.
- Deux runs passent la garde d'existence puis l'un des POST lève un 409 non toléré.
- Voir la sync marquée en échec.
Version de la console impactée
server-nestjs (module Registry)
Définition du fini
Issues liees
Relie a #2087 : migration des plugins vers une approche declarative (moteur Alchemy.run), dont cette idempotence est un prerequis.
Description
Les créations du module Registry ne tolèrent pas le conflit « existe déjà » (409) : chaque création lève sur un statut
>= 300. Sous exécution concurrente (cron + gestionnaire d'événement, ou événements projet parallèles), deux runs peuvent tous deux passer la vérification d'existence puis l'un des POST échoue.Les 4 chemins concernés (registry.service.ts) :
createProject(:232) — gardé pargetProjectByName(:216), mais lève sur 409 (l.233-235)addGroupMember(:176) — gardé par le snapshotmembersByName(:157), mais lève sur 409 (l.177-179)createRobot(:83) — gardé pargetRobot(:127) + retour Vault précoce (:122-125), mais lève sur 409 (l.86-88)createRetention(:260) — gardé pargetRetentionId(:256), mais lève sur 409 (l.261-263)En séquentiel, la ré-synchronisation est idempotente (chaque création a une garde d'existence, les suppressions tolèrent 404). Le gap n'apparaît qu'en concurrence.
Etapes de reproduction
Version de la console impactée
server-nestjs (module Registry)
Définition du fini
Issues liees
Relie a #2087 : migration des plugins vers une approche declarative (moteur Alchemy.run), dont cette idempotence est un prerequis.