Skip to content

🐛 [BUG] - Réconciliation Nexus non idempotente : 7 chemins de création sans tolérance 409 #2619

Closed

Description

@shikanime

Description

Les créations Nexus dans le chemin de synchronisation projet ne tolèrent pas le conflit « existe déjà » (409) : chaque wrapper create* fait un POST brut qui lève sur collision. Sous exécution concurrente (gestionnaire d'événement + cron qui se chevauchent, ou événements projet parallèles), deux runs peuvent tous deux passer la lecture get*() puis l'un des POST échoue — la sync échoue.

Les 7 chemins concernés partagent la même forme (lecture get*() → create*() POST sans tolérance 409 dans nexus-client.service.ts) :

  • createSecurityUsers (:274) — appelé par ensureUser (nexus.service.ts:455)
  • createSecurityRoles (:238) — ensureRole (:419) et ensureSecurityRole (:475)
  • createRepositoriesMavenHosted (:123) — ensureMavenHostedRepo (:197)
  • createRepositoriesMavenGroup (:133) — ensureMavenGroupRepo (:320)
  • createRepositoriesNpmHosted (:165) — ensureNpmHostedRepo (:216)
  • postRepositoriesNpmGroup (:186) — ensureNpmGroupRepo (:236)
  • createSecurityPrivilegesRepositoryView (:207) — upsertPrivilege (:173)

En séquentiel, la ré-synchronisation est idempotente (la lecture rattrape l'existant). Le gap n'apparaît qu'en concurrence.

Etapes de reproduction

  1. Déclencher une réconciliation concurrente du même projet (cron + événement project.upsert simultanés).
  2. Deux runs passent la lecture get*() puis l'un des create*() POST lève un conflit (409) non toléré.
  3. Voir la sync marquée en échec.

Version de la console impactée

server-nestjs (module Nexus)

Définition du fini

  • Les 7 chemins de création tolèrent le 409 « existe déjà » et basculent vers la mise à jour / relisent l'existant
  • Le correctif est aligné sur l'idiome 409 déjà présent ailleurs dans le codebase (gitlab-client, sous-groupes keycloak)
  • 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

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions