Skip to content

🐛 [BUG] - Réconciliation Keycloak non idempotente : course 409 sur la création du groupe racine #2618

Description

@shikanime

Description

La réconciliation Keycloak n'est pas totalement idempotente : la création du groupe racine d'un chemin est soumise à une course (TOCTOU) lors d'une synchronisation concurrente.

createGroup (keycloak-client.service.ts:128-136) appelle client.groups.create({ name }) sans vérification d'existence ni tolérance au 409. Le chemin racine de getOrCreateGroupByPath (keycloak-client.service.ts:187) fait getRootGroupByName(rootName) ?? await this.createGroup(rootName) : deux réconciliations concurrentes (cron + événement project.upsert, ou deux upserts) peuvent toutes deux passer la lecture puis se disputer la création — l'une reçoit un 409 et lève.

Le chemin des sous-groupes est déjà corrigé : getOrCreateSubGroupByName (keycloak-client.service.ts:197-221) traite le 409 comme « existe déjà » et relit le groupe. Seul le groupe racine échappe à cette protection.

Etapes de reproduction

  1. Déclencher une synchronisation concurrente du même projet (cron de réconciliation + événement project.upsert simultanés, ou deux upserts).
  2. Observer l'échec d'un des deux chemins par un 409 Keycloak lors de la création du groupe racine.
  3. Voir la sync marquée en échec via capturePluginResult.

Version de la console impactée

server-nestjs (réconciliation Keycloak)

Définition du fini

  • La création du groupe racine tolère le 409 « groupe déjà existant » et relit le groupe existant
  • Le correctif est aligné sur l'idiome déjà présent dans getOrCreateSubGroupByName
  • Les tests liés à ce correctif ont été ajoutés

Issues liees

Relie a #2087 : migration des plugins vers une approche declarative (moteur Alchemy.run), dont cette idempotence est un prerequis.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions