Development #6877
sql: regarder aussi aux "migrations" pour les tables et vues des formdefs
0%
Description
Du côté des formdefs les mises à jour sont appliquées à la volée, mais seulement au premier accès, maintenant qu'on exécute du code spécifique sql au démarrage, on pourrait passer sur tous les formdefs. Ça aidera aussi en cas de modification sur la structure générale des vues, et c'est mieux qu'avoir celle-ci qui change spontanément en cours d'utilisation.
Fichiers
Révisions associées
sql: migrate views on startup (#6877)
This introduces a "SQL level" to sql.py, that should be bumped whenever
incompatible SQL changes have to be run at startup, it relies on a new
key/value table (wcs_meta) to hold the database current sql level.
Historique
Mis à jour par Frédéric Péters il y a environ 9 ans
- Fichier 0001-sql-rebuild-all-views-on-startup-6877.patch 0001-sql-rebuild-all-views-on-startup-6877.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Mis à jour par Frédéric Péters il y a environ 9 ans
C'est peut-être inutilement coûteux en temps sur des sites avec des quantités de formulaires/vues; à mesurer.
Mis à jour par Frédéric Péters il y a environ 9 ans
Genre presque 10 secondes sur mon site de test qui déborde un peu (une grosse centaine de formulaires).
Mis à jour par Thomas Noël il y a environ 9 ans
Ça ira sans doute plus vite une machine qui ne sait que cela, et dimensionnée pour.
Je propose de pousser ce patch.
Mis à jour par Thomas Noël il y a environ 9 ans
Patch lancé sur auquo.dev : 30 secondes pour démarrer (le postgresql est en mode debug, mais quand même).
Ça ne va pas. Mais en même temps : #7017...
Mis à jour par Frédéric Péters il y a environ 9 ans
- Fichier 0001-sql-migrate-views-on-startup-6877.patch 0001-sql-migrate-views-on-startup-6877.patch ajouté
Patch un peu plus long et moins testé (il faudrait que je crée l'infra nécessaire à ce genre de tests), mais en local, j'ai les chiffres suivant (pour le initialize_sql()) : sans rien 1,2 secondes, avec le premier patch ici 9,5 secondes, avec celui-ci 2,3 secondes). À mesurer sur auquo.dev
Mis à jour par Frédéric Péters il y a environ 9 ans
La piste si ça reste trop long c'est d'avoir également du code de "migration" pour les vues des formdefs.
Mis à jour par Thomas Noël il y a environ 9 ans
Sur dev:
$ cat /tmp/wcs-sql-time https://alfortville.dev.au-quotidien.com (91 formdefs): 1.95542883873s ; 0.021488228997s/formdef https://imio.dev.au-quotidien.com (11 formdefs): 0.270038127899s ; 0.0245489207181s/formdef https://vincennes.dev.au-quotidien.com (124 formdefs): 2.36293315887s ; 0.0190559125716s/formdef https://fsb.dev.au-quotidien.com (5 formdefs): 0.10484790802s ; 0.020969581604s/formdef
On va dire 2 centièmes de secondes par formulaire.
À voir en optimisant un peu postgresql.
Mis à jour par Frédéric Péters il y a environ 9 ans
Et c'est acceptable d'avoir ces 5 secondes au démarrage ?
Mis à jour par Frédéric Péters il y a environ 9 ans
Sur la prod, il y a 815 formulaires, ça ferait 16 secondes, ce sera sans doute encore utile d'améliorer les choses.
Mis à jour par Thomas Noël il y a environ 9 ans
Joué sur quelques paramètres (zéro log, utilisation max de RAM, etc) : ça ne change pas, la création de vues consomme du temps, on reste à 20ms par formulaire.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
C'est nécessaire d'avoir ces vues pour le fonctionnement de w.c.s. ? Dans le cas contraire on pourrait faire ça dans un autre process.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
Un truc qui m'étonne c'est que normalement les vues c'est gratuit: il n'y normalement aucun stockage, ni table, ni index, c'est juste des sortes de macro. Je ne vois pas d'où viennent tous ces délais, peut-être la requête est-elle exécutée une première fois pour voir qu'elle fonctionne.
Mis à jour par Benjamin Dauvergne il y a environ 9 ans
20ms par formulaire ça me fait penser au temps nécessaire pour faire un commit sur disque, peut-être essayer d'accomplir tout cela dans une seule transaction (là j'ai l'impression qu'il y en a une par formdef).
Mis à jour par Frédéric Péters il y a environ 9 ans
Après réflexion sur le sujet, je reste attaché à l'idée d'exécuter ça au démarrage, qu'on évite des structures de tables/vues qui changent spontanément lors de l'accès à une donnée ou page particulière. Mais mon plan maintenant serait plus simple, plutôt qu'avoir un initialize_sql() servant à la fois à la mise en place initiale des structures et à leurs migrations, je créerais un migrate_sql() et stockerait un "niveau" de SQL, qu'on aurait à manuellement incrémenter en cas de modification incompatible. Si que le niveau connu de sql.py correspond au niveau enregistré dans la base, on ne fait rien; sinon, on peut faire un truc un peu coûteux, sachant que ça n'aura pas lieu à tous les démarrages.
Mis à jour par Frédéric Péters il y a environ 9 ans
- Fichier 0001-sql-migrate-views-on-startup-6877.patch 0001-sql-migrate-views-on-startup-6877.patch ajouté
Voilà, avec des tests pour me rassurer.
Mis à jour par Thomas Noël il y a environ 9 ans
Ack.
Par la suite, on pourrait ajouter une commande "sqlmigrate" à wcsctl (typiquement pour aider à faire un init.d qui détaille le démarrage, qu'on ne soit pas surpris quand ça prendra 15 secondes un jour sur un reboot en prod).
Mis à jour par Frédéric Péters il y a environ 9 ans
- Statut changé de En cours à Résolu (à déployer)
Par la suite [...]
Par la (très) suite on aura une application django et on pourra utiliser le mécanisme de migration pour construire les tables...
commit 929c40d7d528b0ea80a188c49d34343ba7e0b031 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Wed Apr 1 15:06:34 2015 +0200 sql: migrate views on startup (#6877) This introduces a "SQL level" to sql.py, that should be bumped whenever incompatible SQL changes have to be run at startup, it relies on a new key/value table (wcs_meta) to hold the database current sql level.
sql: rebuild all views on startup (#6877)