Skip to content

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

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

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions