Description
Deux trous d'idempotence résident dans gitlab-client.service.ts, partagés par les modules Observability et ArgoCD.
1. createGroupRepo sans tolĂ©rance au conflit (gitlab-client.service.ts:297-307) â appelĂ© par getOrCreateValuesRepo (observability-client.service.ts:38) sur chaque upsert projet (observability.service.ts:129) et chaque suppression (:147). C'est un Projects.create brut sans traitement du has already been taken. Deux synchronisations concurrentes qui voient toutes deux le dĂ©pĂŽt absent appellent toutes deux createGroupRepo ; la seconde lĂšve le 409 GitLab. Pattern identique Ă celui dĂ©jĂ corrigĂ© pour les sous-groupes keycloak (keycloak-client.service.ts:212-220) et les dĂ©pĂŽts systĂšme (gitlab-client.service.ts:274-279, qui relit sur has already been taken).
2. Course lecture-Ă©criture sur le commit (maybeCreateCommit, gitlab-client.service.ts:321 + generateCreateOrUpdateAction :336-348) â l'action lit le fichier puis un Commits.create sĂ©parĂ© Ă©crit (:332). Deux syncs qui se chevauchent peuvent voir le fichier absent, Ă©mettre toutes deux action: 'create', et la seconde frappe le « already exists » GitLab avec 400 sans tolĂ©rance â la sync Ă©choue. MĂȘme schĂ©ma pour les delete concurrents.
Etapes de reproduction
- DĂ©clencher une synchronisation concurrente du mĂȘme projet.
- Pour le cas 1 : deux runs voient le dépÎt de valeurs absent et l'un des
createGroupRepo lĂšve has already been taken.
- Pour le cas 2 : deux runs voient le fichier absent, les deux émettent
action: 'create', le second Commits.create lĂšve un 400.
Version de la console impactée
server-nestjs (gitlab-client â modules Observability et ArgoCD)
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
Deux trous d'idempotence résident dans
gitlab-client.service.ts, partagés par les modules Observability et ArgoCD.1.
createGroupReposans tolĂ©rance au conflit (gitlab-client.service.ts:297-307) â appelĂ© pargetOrCreateValuesRepo(observability-client.service.ts:38) sur chaque upsert projet (observability.service.ts:129) et chaque suppression (:147). C'est unProjects.createbrut sans traitement duhas already been taken. Deux synchronisations concurrentes qui voient toutes deux le dĂ©pĂŽt absent appellent toutes deuxcreateGroupRepo; la seconde lĂšve le 409 GitLab. Pattern identique Ă celui dĂ©jĂ corrigĂ© pour les sous-groupes keycloak (keycloak-client.service.ts:212-220) et les dĂ©pĂŽts systĂšme (gitlab-client.service.ts:274-279, qui relit surhas already been taken).2. Course lecture-Ă©criture sur le commit (
maybeCreateCommit,gitlab-client.service.ts:321+generateCreateOrUpdateAction:336-348) â l'action lit le fichier puis unCommits.createsĂ©parĂ© Ă©crit (:332). Deux syncs qui se chevauchent peuvent voir le fichier absent, Ă©mettre toutes deuxaction: 'create', et la seconde frappe le « already exists » GitLab avec 400 sans tolĂ©rance â la sync Ă©choue. MĂȘme schĂ©ma pour lesdeleteconcurrents.Etapes de reproduction
createGroupRepolÚvehas already been taken.action: 'create', le secondCommits.createlÚve un 400.Version de la console impactée
server-nestjs (gitlab-client â modules Observability et ArgoCD)
Définition du fini
createGroupRepotolÚrehas already been takenet relit le dépÎt existant (idiomegitlab-client.service.ts:274-279)Issues liees
Relie a #2087 : migration des plugins vers une approche declarative (moteur Alchemy.run), dont cette idempotence est un prerequis.