Bug #63387
InternalError: tuple concurrently updated
0%
Description
https://sentry.entrouvert.org/entrouvert/publik/issues/55052/
InternalError: tuple concurrently updated (15 additional frame(s) were not displayed) ... File "wcs/formdef.py", line 483, in store self.update_storage() File "wcs/formdef.py", line 492, in update_storage actions = sql.do_formdef_tables(self, rebuild_views=True, rebuild_global_views=True) File "wcs/sql.py", line 616, in f return func(*args, **kwargs) File "wcs/sql.py", line 805, in do_formdef_tables recreate_trigger(formdef, cur, conn) File "wcs/sql.py", line 938, in recreate_trigger endpoint_status=endpoint_status_filter,
Fichiers
Révisions associées
Historique
Mis à jour par Lauréline Guérin il y a environ 2 ans
quelque chose à corriger dans la gestion des triggers qui gèrent wcs_all_forms ?
Mis à jour par Frédéric Péters il y a environ 2 ans
De ce que je lis il s'agirait de mettre ça dans une transaction avec un appel à pg_advisory_xact_lock().
(cf aussi https://www.postgresql.org/docs/current/explicit-locking.html#ADVISORY-LOCKS)
Mis à jour par Lauréline Guérin il y a environ 2 ans
2022-03-30 10:23:53.396 CEST [32561] wcs@wcs_demarches_essonne_test_entrouvert_org LOG: statement: CREATE INDEX IF NOT EXISTS wcs_all_forms_user_id ON wcs_all_forms (user_id) 2022-03-30 10:23:53.396 CEST [32561] wcs@wcs_demarches_essonne_test_entrouvert_org LOG: statement: CREATE INDEX IF NOT EXISTS wcs_all_forms_status ON wcs_all_forms (status) 2022-03-30 10:23:53.396 CEST [32561] wcs@wcs_demarches_essonne_test_entrouvert_org LOG: statement: CREATE INDEX IF NOT EXISTS wcs_all_forms_concerned_roles_array ON wcs_all_forms USING gin (concerned_roles_array) 2022-03-30 10:23:53.397 CEST [32561] wcs@wcs_demarches_essonne_test_entrouvert_org LOG: statement: CREATE INDEX IF NOT EXISTS wcs_all_forms_actions_roles_array ON wcs_all_forms USING gin (actions_roles_array)
qui passe en même temps
dans wcs/formdef.py:
@classmethod def remove_object(cls, id): super().remove_object(id) if get_publisher().is_using_postgresql(): # recreate global views so they don't reference formdata from # deleted formefs from . import sql conn, cur = sql.get_connection_and_cursor() sql.do_global_views(conn, cur) conn.commit() cur.close()
(
do_global_views
refait les triggers)à simplifier ?
Mis à jour par Lauréline Guérin il y a environ 2 ans
- Fichier 0001-sql-simplify-wcs_all_forms-clean-on-formdef-removal-.patch 0001-sql-simplify-wcs_all_forms-clean-on-formdef-removal-.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Pour éviter de rebuilder les triggers à la suppression d'un formdef (ou d'un cardef ?); juste suppression des données de la table globale
Mis à jour par Pierre Ducroquet il y a environ 2 ans
Comme discuté avec laureline : oui, un advisory lock éliminerait le problème. De la même façon que modifier la conf gunicorn pour n'avoir qu'un seul process max sur une seule machine règlerait le problème. :)
Tant qu'on trouve des options pour réduire les réécritures des tables et vues, il faut les exploiter puisque c'est ça le vrai bug ici.
Mis à jour par Frédéric Péters il y a environ 2 ans
valid_ids = set() for formdef in FormDef.select(ignore_migration=True): valid_ids.add(int(formdef.id))
tu devrais pouvoir juste prendre FormDef.keys(), ça évitera même de charger les pickls.
Mis à jour par Lauréline Guérin il y a environ 2 ans
Mis à jour par Frédéric Péters il y a environ 2 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Lauréline Guérin il y a environ 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit f68b91ddf7f61379576c6b4c317b56c6a3e2acf4 Author: Lauréline Guérin <zebuline@entrouvert.com> Date: Fri Apr 1 16:32:39 2022 +0200 sql: simplify wcs_all_forms clean on formdef removal (#63387)
Mis à jour par Transition automatique il y a environ 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
sql: simplify wcs_all_forms clean on formdef removal (#63387)