Projet

Général

Profil

Development #43153

export des utilisateurs vs beaucoup d'utilisateurs

Ajouté par Frédéric Péters il y a presque 4 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
20 mai 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Le lien d'export "CSV" existe en bas de tableau mais sur des sites conséquents, ça prend un temps fou et termine hors délais.


Fichiers

Révisions associées

Révision 6937f2f3 (diff)
Ajouté par Valentin Deniaud il y a environ 3 ans

misc: add uwsgi spooler (#43153)

Révision 413604d0 (diff)
Ajouté par Valentin Deniaud il y a environ 3 ans

manager: move user export code (#43153)

Révision b3bc13d2 (diff)
Ajouté par Valentin Deniaud il y a environ 3 ans

manager: export users asynchronously (#43153)

Historique

#2

Mis à jour par Valentin Deniaud il y a environ 3 ans

J'ai un peu regardé et je doute qu'il y ait moyen de faire beaucoup plus rapide, est-ce que la bonne voie à suivre c'est de montrer une page « attendez que ça soit prêt » comme pour l'export de wcs ?

#3

Mis à jour par Frédéric Péters il y a environ 3 ans

(c'était ma perspective, oui)

#4

Mis à jour par Valentin Deniaud il y a environ 3 ans

  • Assigné à mis à Valentin Deniaud
#5

Mis à jour par Valentin Deniaud il y a environ 3 ans

Draft fonctionnel sur la branche à base de spooler uwsgi.

Pour lancer,

AUTHENTIC2_SETTINGS_FILE=/home/$USER/.config/publik/settings/authentic-multitenant/settings.py uwsgi --chdir . --module=authentic2.wsgi:application --env DJANGO_SETTINGS_MODULE=authentic2.settings --master --process 3 --pidfile=/tmp/project-master.pid --http=127.0.0.1:8000 --spooler-python-import=authentic2.utils.spooler --spooler /var/lib/authentic-multitenant/spooler/

#6

Mis à jour par Valentin Deniaud il y a environ 3 ans

Dans 0002 le split de la grosse méthode en plusieurs fonctions n'est finalement pas utile, je peux revenir en arrière et faire juste un bête copier coller si c'est jugé plus sûr.

0003, le gros du boulot, j'ai essayé de faire au plus simple.

#7

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • Statut changé de Solution proposée à En cours

Valentin Deniaud a écrit :

0003, le gros du boulot, j'ai essayé de faire au plus simple.

Utiliser le même préfixe '/export/' pour le endpoint d'avancement :

        url(r'^users/export-progress/(?P<uuid>[a-z0-9-]+)/$',
->
        url(r'^users/export/(?P<uuid>[a-z0-9-]+)/progress/$',

Dans 0002 le split de la grosse méthode en plusieurs fonctions n'est finalement pas utile, je peux revenir en arrière et faire juste un bête copier coller si c'est jugé plus sûr.

Ouaip. Est-ce qu'au passage tu pourrais reprendre les décorateurs de spooler qui sont dans combo/utils/spooler.py maintenant ? Qu'on évite les mêmes soucis tout de suite, dans quelques cycles on le bougera dans hobo pour le partager.

#9

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

  • Statut changé de Solution proposée à Solution validée

Je n'ai pas compris le besoin de transactional_db dans les tests car en l'absence de uwsgi tout ça reste synchrone, non ?

#10

Mis à jour par Valentin Deniaud il y a environ 3 ans

Benjamin Dauvergne a écrit :

Je n'ai pas compris le besoin de transactional_db dans les tests car en l'absence de uwsgi tout ça reste synchrone, non ?

Le transaction.on_commit n'est pas déclenché sinon, et donc l'export ne se fait pas.
(je pousse demain, je suis tombé sur un glitch qui fait que la progression peut afficher brièvement 10x% avec x > 0 qu'il faut que je corrige)

#11

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

Valentin Deniaud a écrit :

Benjamin Dauvergne a écrit :

Je n'ai pas compris le besoin de transactional_db dans les tests car en l'absence de uwsgi tout ça reste synchrone, non ?

Le transaction.on_commit n'est pas déclenché sinon, et donc l'export ne se fait pas.

Mais pourquoi tu fais un on_commit ici il n'y a même pas d'écriture en base ? Je ne suis même pas sûr qu'il y ait une transaction..

PS: oui il y en a une parce que dans les settings par défaut il y a ATOMIC_REQUESTS, mais c'est écrasé dans hobo/debian/debian_config_common.py, je vais ouvrir un ticket sur ça, pour virer le ATOMIC_REQUESTS. Mais dans l'absolu sans écriture en base dont on veut s'assurer qu'elle soit cohérente avec la création du job ça ne sert à rien. En fait je pencherai pour ne générer que l'uuid dans la vue, et reporter UserExport.new() dans le callback du spooler.

#12

Mis à jour par Valentin Deniaud il y a environ 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit b3bc13d26c6ddd87e930795e4711dd2896763897
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Wed Mar 31 12:37:20 2021 +0200

    manager: export users asynchronously (#43153)

commit 413604d06b9e765ca40a9afc656606133877eaf1
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Tue Mar 9 17:23:41 2021 +0100

    manager: move user export code (#43153)

commit 6937f2f3ad5fee9ebcf97b9e4ef4cc46437e557e
Author: Valentin Deniaud <vdeniaud@entrouvert.com>
Date:   Tue Mar 9 10:48:30 2021 +0100

    misc: add uwsgi spooler (#43153)
#13

Mis à jour par Valentin Deniaud il y a environ 3 ans

Benjamin Dauvergne a écrit :

Mais pourquoi tu fais un on_commit ici il n'y a même pas d'écriture en base ?

Effectivement, je l'ai enlevé ça marche tout aussi bien, viré les transactional_db dans les tests du coup.

En fait je pencherai pour ne générer que l'uuid dans la vue, et reporter UserExport.new() dans le callback du spooler

Dans la vue de progression de l'export on regarde si l'export existe sinon 404, pour ça il faut qu'il ait été créé, et on ne peut pas compter sur le spooler pour le faire plus vite que la redirection.

#14

Mis à jour par Frédéric Péters il y a environ 3 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF