Bug #82951
race condition sur la création d'un rôle
0%
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
Historique
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.
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 :
- URL : https://git.entrouvert.org/entrouvert/wcs/pulls/795
- Titre : WIP: sql: switch role creation to upsert (#82951)
- Modifications : https://git.entrouvert.org/entrouvert/wcs/pulls/795/files
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 :
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 :
- URL : https://git.entrouvert.org/entrouvert/wcs/pulls/795
- Titre : sql: switch role creation to upsert (#82951)
- Modifications : https://git.entrouvert.org/entrouvert/wcs/pulls/795/files
Mis à jour par Transition automatique il y a 6 mois
- Statut changé de Résolu (à déployer) à Solution déployée
sql: switch role creation to upsert (#82951)