Development #54658
possibilité pour une mise à jour des données de se casser et laisser un schéma vide
0%
Description
def do_schema(self): self.ex('SET search_path = public') self.logger.debug('dropping schema %s', self.schema_temp) self.drop_tables_sequencially(self.schema_temp) self.ex('DROP SCHEMA IF EXISTS {schema_temp} CASCADE') self.logger.debug('creating schema %s', self.schema) self.ex('CREATE SCHEMA {schema_temp}') self.ex('SET search_path = {schema_temp},public')
Le drop_tables_sequencially peut échouer, ex:
File "/usr/lib/python3/dist-packages/wcs_olap/cmd.py", line 108, in main2 olap_feeder.feed() File "/usr/lib/python3/dist-packages/wcs_olap/feeder.py", line 619, in feed self.drop_tables_sequencially(self.schema) File "/usr/lib/python3/dist-packages/wcs_olap/feeder.py", line 368, in drop_tables_sequencially % (quote(schema), quote(table_name), quote(constraint_name))) File "/usr/lib/python3/dist-packages/wcs_olap/feeder.py", line 336, in ex self.cur.execute(sql, vars=vars) psycopg2.extensions.TransactionRollbackError: deadlock detected DÉTAIL : Process 2936 waits for AccessExclusiveLock on relation 825879306 of database 50671; blocked by process 25139. Process 25139 waits for AccessShareLock on relation 825902239 of database 50671; blocked by process 2936. ASTUCE : See server log for query details.
et le résultat derrière c'est une base sans (toutes) les données/tables nécessaires.
Fichiers
Demandes liées
Révisions associées
Revert "feeder: set deadlock_timeout to 10 seconds (#54658)"
This reverts commit c74766bf2c7a911ab04da9084231ef3397cb2964.
feeder: prevent situation of half-dropped schema (#54658)
To prevent loosing currently loaded data wcs-olap, failing ro rename the
temporary schema to its final name, wcs-olap will:
- first, inside a transaction, rename the current schema instead of
dropping it, then rename the new schema to the current schema's name;
in case of failure it will retry 33 times sleeping 1 second between
each attempt;
- if successfull, drop the renamed old schema, again in a retry loop, if
it fails to drop it logs an error, without aborting the current
feeding.
Historique
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
Le deadlock_timeout est à une seconde par défaut, pour toutes les transactions, je pense qu'on peut le pousser à 10s durant la mise à jour olap.
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
- Fichier 0001-feeder-set-deadlock_timeout-to-10-seconds-54658.patch 0001-feeder-set-deadlock_timeout-to-10-seconds-54658.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
- Fichier 0001-feeder-set-deadlock_timeout-to-10-seconds-54658.patch 0001-feeder-set-deadlock_timeout-to-10-seconds-54658.patch ajouté
Autant modifier le timeout le plus tôt possible.
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
Benjamin Dauvergne a écrit :
Autant modifier le timeout le plus tôt possible.
Le but si ce n'est pas clair c'est que dans un duel (due à la détection des deadlock par postgresql), ce soit toujours wcs-olap qui gagne vu que sont timeout est plus élevé; ça laisse toujours une marge d'erreur car le scheduling des processus peut faire que wcs-olap perde quand même mais 10s ça laisse quand même une bonne marge.
Mis à jour par Nicolas Roche il y a presque 3 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Benjamin Dauvergne il y a presque 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit c74766bf2c7a911ab04da9084231ef3397cb2964 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue Jun 8 17:24:52 2021 +0200 feeder: set deadlock_timeout to 10 seconds (#54658) It makes wcs-olap always win in a deadlock with another client.
Mis à jour par Frédéric Péters il y a presque 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Frédéric Péters il y a presque 3 ans
- Statut changé de Solution déployée à Nouveau
- Patch proposed changé de Oui à Non
Le commit étant annulé (#54808) ce ticket reste.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-feeder-prevent-situation-of-half-dropped-schema-5465.patch 0001-feeder-prevent-situation-of-half-dropped-schema-5465.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Plus simple, ne pas s'occuper du deadlock juste faire les choses dans le bon ordre dans une transaction et ré-essayer.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-feeder-prevent-situation-of-half-dropped-schema-5465.patch 0001-feeder-prevent-situation-of-half-dropped-schema-5465.patch ajouté
Plus optimiste j'essaie 33 secondes toutes les secondes.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Lié à Bug #54808: pas de permissions pour SET deadlock_timeout ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Le 33 secondes c'est parce que les requêtes dans bijoe prennent au plus 30 secondes avant d'échouer (petite idée que wcs-olap devrait gagner un duel, mais je ne suis même pas sûr qu'un simple renommage de schéma prennent des verrous, par contre le schema drop en prend pleins, mais une fois le nom modifié il ne devrait plus y avoir d'accès de la part de bijoe).
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-feeder-prevent-situation-of-half-dropped-schema-5465.patch 0001-feeder-prevent-situation-of-half-dropped-schema-5465.patch ajouté
- Tracker changé de Bug à Development
J'ai récupéré atomic() depuis #56039 où il a disparu.
Mis à jour par Serghei Mihai il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 05c40317767e218acdb7675fec39ea2a34c7360b Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Sat Aug 7 18:43:29 2021 +0200 feeder: prevent situation of half-dropped schema (#54658) To prevent loosing currently loaded data wcs-olap, failing ro rename the temporary schema to its final name, wcs-olap will: - first, inside a transaction, rename the current schema instead of dropping it, then rename the new schema to the current schema's name; in case of failure it will retry 33 times sleeping 1 second between each attempt; - if successfull, drop the renamed old schema, again in a retry loop, if it fails to drop it logs an error, without aborting the current feeding.
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
feeder: set deadlock_timeout to 10 seconds (#54658)
It makes wcs-olap always win in a deadlock with another client.