Projet

Général

Profil

Bug #82951

race condition sur la création d'un rôle

Ajouté par Thomas Noël il y a 6 mois. Mis à jour il y a 6 mois.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
30 octobre 2023
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Dans wcs/sql.py sur le role.store, quand le rôle a déjà un id on fait ceci :

   3076             sql_statement = '''UPDATE %s SET %s WHERE id = %%(id)s RETURNING id''' % (
   3077                 self._table_name,
   3078                 ', '.join(['%s = %%(%s)s' % (x, x) for x in column_names]),
   3079             )
   3080             cur.execute(sql_statement, sql_dict)
   3081             if cur.fetchone() is None:
   3082                 sql_statement = '''INSERT INTO %s (%s) VALUES (%s)''' % (
   3083                     self._table_name,
   3084                     ', '.join(column_names),
   3085                     ', '.join(['%%(%s)s' % x for x in column_names]),
   3086                 )
   3087                 cur.execute(sql_statement, sql_dict)

Mais on vient de voir un crash sur la dernière ligne :

oct. 30 10:29:16 publik-test uwsgi[2592664]:   File "/usr/lib/python3/dist-packages/wcs/sql.py", line 3087, in store
oct. 30 10:29:16 publik-test uwsgi[2592664]:     cur.execute(sql_statement, sql_dict)
oct. 30 10:29:16 publik-test uwsgi[2592664]: psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "roles_pkey" 
oct. 30 10:29:16 publik-test uwsgi[2592664]: DETAIL:  Key (id)=(a43b22d323d74f0ca2783f14d9ec4792) already exists.

Il me semble que, bien qu'on soit dans une transaction, ce cas soit effectivement possible, ie que le rôle ait été créé entre temps (par un provisioning en cours), et paf conflit sur id qui est la clé primaire.

Je crois qu'on devrait avoir un try/except sur ce dernier cur.execute et faire juste un rollback en cas de psycopg2.errors.UniqueViolation (ou psycopg2.IntegrityError ?)

Révisions associées

Révision 8bca1bdf (diff)
Ajouté par Pierre Ducroquet il y a 6 mois

sql: switch role creation to upsert (#82951)

Historique

#2

Mis à jour par Pierre Ducroquet il y a 6 mois

Je suis plutôt d'avis d'avoir une requête au lieu de deux : INSERT ... ON CONFLICT DO UPDATE ...
Je fais le patch dans ce sens.

#3

Mis à jour par Pierre Ducroquet il y a 6 mois

  • Assigné à mis à Pierre Ducroquet
#4

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Nouveau à En cours

Pierre Ducroquet (pducroquet) a ouvert une pull request sur Gitea concernant cette demande :

#5

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de En cours à Solution proposée
#6

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Solution proposée à Solution validée

Thomas NOËL (tnoel) a approuvé une pull request sur Gitea concernant cette demande :

#7

Mis à jour par Robot Gitea il y a 6 mois

  • Statut changé de Solution validée à Résolu (à déployer)

Pierre Ducroquet (pducroquet) a mergé une pull request sur Gitea concernant cette demande :

#8

Mis à jour par Transition automatique il y a 6 mois

  • Statut changé de Résolu (à déployer) à Solution déployée
#9

Mis à jour par Transition automatique il y a 4 mois

Automatic expiration

Formats disponibles : Atom PDF