Project

General

Profile

Development #22383

migrate : séparer les deux étapes (migrations / réindexations)

Added by Thomas Noël (congés → 2 septembre) over 6 years ago. Updated over 5 years ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
08 March 2018
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:

Description

Pour ne pas qu'une mise à jour bloque la mise à jour trop longtemps.

Il faut retirer du sql::migrate.py :

        for user_id in SqlUser.keys():
            SqlUser.get(user_id).store()

et

        from wcs.formdef import FormDef
        for formdef in FormDef.select():
            for formdata in formdef.data_class().select():
                formdata.store()

et poser cela dans des commandes "rebuild-indexes --users --formdata ..." ?


Files


Related issues

Related to w.c.s. - Development #23305: sql: permettre à select() de fonctionner comme un itérateurFermé20 April 2018

Actions

Associated revisions

Revision 3961764a (diff)
Added by Thomas Noël (congés → 2 septembre) about 6 years ago

sql: delay re-index operations on first cron (#22383)

History

#2

Updated by Thomas Noël (congés → 2 septembre) over 6 years ago

Proposition :
  • par défaut migrate ne fait jamais les rebuild FTS
  • mais on peut les lancer "quand on veut" avec --rebuild-fts-user et --rebuild-fts-formdata (y compris, en fait, en dehors d'une migration)

Une proposition alternative pourrait être d'avoir une nouvelle commande « rebuild-fts » ?

#3

Updated by Frédéric Péters over 6 years ago

Ces étapes post-migrations de schéma (et il y a aussi la création de nouveaux index, que tu laisses exécutée au démarrage), je pense vraiment qu'elles doivent être exécutées de manière automatique.

Et sur la forme précise, pour ne pas partir dans des forks, je me dis que ça pourrait être déclaré comme job cron (interne, register_cronjob), qui regarde une ligne supplémentaire de la table wcs_meta et lance la "post-migration" si nécessaire.

#4

Updated by Thomas Noël (congés → 2 septembre) over 6 years ago

Frédéric Péters a écrit :

Ces étapes post-migrations de schéma (et il y a aussi la création de nouveaux index, que tu laisses exécutée au démarrage), je pense vraiment qu'elles doivent être exécutées de manière automatique.

Je ne comprends pas. C'est justement ce qui nous gêne actuellement, non ?

#5

Updated by Frédéric Péters over 6 years ago

Ce qui (me) gêne c'est que w.c.s. doit attendre qu'elles aient été exécutées pour être up.

#6

Updated by Thomas Noël (congés → 2 septembre) over 6 years ago

Frédéric Péters a écrit :

Ce qui (me) gêne c'est que w.c.s. doit attendre qu'elles aient été exécutées pour être up.

Ok, la prochaine fois je lirais tes commentaires jusqu'au bout ! :-)

#7

Updated by Thomas Noël (congés → 2 septembre) over 6 years ago

  • Patch proposed changed from Yes to No

Patch à refaire, une simple première étape serait de forker avant de lancer les "re-indexations" potentiellement longues et qui peuvent être lancées après le démarrage de wcs, ie après les mises à jour des schémas, qui doivent rester "bloquantes" avant le démarrage.

#8

Updated by Thomas Noël (congés → 2 septembre) over 6 years ago

Voici mon plan :

  • sur migrate :
    • retirer de sql.migrate les reindexaction user et formdata
    • les remplacer par des valeurs dans wcs_meta : need_reindex_user et need_reindex_formdata, qui passent à value=1 quand une reindexation doit avoir lieu
  • au lancement du processus démon
    • parcourir les sites qui ont need_reindex_* à 1, les ré-indexer et passer la valeur à 0 quand c'est fait

Mon soucis pour l'instant c'est cette seconde étape... je ne sais pas où la coder :/ Pour l'instant ce que j'arrive à imaginer c'est une nouvelle commande "reindex" qui se lancerait en daemon, et serait donc lancée après migrate par systemd, mais ne serait pas bloquant. Toute idée est bienvenue.

#9

Updated by Thomas Noël (congés → 2 septembre) over 6 years ago

Première approche simple pour démarrer "assez vite" sans les FTS : on passe celles-ci dans le premier cron.

Le patch joint présente une implémentation (test_sql doivent être élargis et adaptés, ne passent plus en l'état).

J'utilise deux clés "reindex_user" et "reindex_formdata" dans wcs_meta, qui seront posées à "needed" par sql.migrate si besoin. Lors de chaque cron (et notamment le premier) on lance en premier lieu les re-indexactions qui sont à "needed". A la fin du process on met "done" dans la clé.

Si ça crashe, la clé est toujours à "needed" tant que la ré-indexation n'est pas terminée : un futur cron relancera la reindexation. Par sécurité (lock de cron en rade, cron sur deux machines distinctes, etc.) on pourrait passer la clé à "in-progress" pendant qu'a lieu la ré-indexation, mais ça compliquerait les rattrapages en cas de pépin.

#10

Updated by Thomas Noël (congés → 2 septembre) about 6 years ago

Voilà, avec les tests où on vérifie que la ré-indexation a bien eu lieu après le premier cron.

#11

Updated by Frédéric Péters about 6 years ago

Je déplacerais les changements sur les fixtures dans un premier commit.

Petite hésitation sur l'état qui peut juste être needed/done. (mais ça doit juste être une crainte d'exécutions parallèles qui n'est pas fondée)

Pour les utilisateurs on passe par une récupération une par une des lignes, plutôt que le .select(); je peux comprendre ça sur l'idée que le select() n'est pas un itérateur mais je serais pour le permettre (et pour ne pas prendre de risque sur le code actuel, que ça soit uniquement en présence d'un iterator=True en paramètre, défaut à False).

#12

Updated by Thomas Noël (congés → 2 septembre) about 6 years ago

  • Related to Development #23305: sql: permettre à select() de fonctionner comme un itérateur added
#13

Updated by Thomas Noël (congés → 2 septembre) about 6 years ago

Voilà, avec un select itérable. J'ai aussi renforcé un poil les tests en vérifiant que la migration ne joue pas la re-indexation (ie qu'elle est bien faite uniquement après le premier cron).

#14

Updated by Frédéric Péters about 6 years ago

Ok, go.

#15

Updated by Thomas Noël (congés → 2 septembre) about 6 years ago

  • Status changed from En cours to Résolu (à déployer)
commit 3961764ac9300727a6d22376774b6df460dd859b (HEAD -> master, origin/master, origin/HEAD)
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Fri Apr 20 12:17:55 2018 +0200

    sql: delay re-index operations on first cron (#22383)

commit 0b56cd640ef7ecc8f20d5bfe734fa8fb0b98f4ba
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Fri Apr 20 12:17:39 2018 +0200

    tests: use sql_mode publisher creation in test_sql

#16

Updated by Frédéric Péters over 5 years ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF