Projet

Général

Profil

Bug #7818

problème sur l'index workflow_roles

Ajouté par Frédéric Péters il y a presque 9 ans. Mis à jour il y a plus de 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
10 juillet 2015
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Il arrive (??? sur des workflows toujours trop complexes pour en tirer quelque chose) que l'index workflow_roles ne soit plus correct, ce qui fait que limiter un listing à un statut particulier ne fonctionne pas (zéro entrées, là où le listing global affichait des demandes dans le statut donné).

(occurence du jour, https://demarches.vincennes.fr/backoffice/management/completer-un-dossier-cree-avec-un-agent-d-accueil-envoi-de-pieces-justificatives/)


Fichiers

Révisions associées

Révision fa801967 (diff)
Ajouté par Frédéric Péters il y a presque 9 ans

storage: add lock around index update (#7818)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 9 ans

Tout à fait incapable de reproduire les conditions qui pourraient amener ça, j'ai pris un peu de recul et considéré le seul truc qui restait, qu'il y ait des écritures concurrentes sur les index, ce qui peut quand même pas trop difficilement arriver avec les hashed_indexes, il me semble.

Du coup j'ai ajouté un test avec quelques forks et facilement il y a tout qui explose, d'une part la génération d'id, exécutée lors de la création de l'objet et non lors de l'écriture, ça laisse une opportunité énorme à d'autres objets pour acquérir le même id (et boum que je t'écrase). D'autre part, les index.

Pour le premier problème j'ai retiré la génération précoce de l'id (il y a dans le storage.py du code pour créer le fichier avec (os.O_CREAT | os.O_EXCL) pour éviter ça, autant l'utiliser).

Pour le second problème j'ai regardé un peu ce qu'il existait comme bibliothèque de lock et j'ai importé le code de la plus agréable.

#2

Mis à jour par Benjamin Dauvergne il y a presque 9 ans

Il me semble qu'avec le atomic_write ça ne devrait jamais arriver qu'on lise dans le fichier d'un StorableObject pendant que quelqu'un y écrit, par contre c'est possible avec les fichiers pickle produits pour _hashed_indexes vu que ça n'utilise pas atomic_write pour sa mise à jour. À un moment on pourrait même remplacer cela par un fichier GDBM ou SQLite qui gèrent eux mêmes les locks entre lecture et écriture.

J'ai bidouillé un support gdbm qui passe ton test (mais a d'autres problèmes)... SQLite serait peut-être plus sûr.

#3

Mis à jour par Frédéric Péters il y a presque 9 ans

Ça détourne la conversation; il y a un patch avec le lock, est-ce que ça corrige le soucis présent ? Sans doute.

Pour refaire les trucs, sans passer par postgresql, tu crées un autre ticket ?

#4

Mis à jour par Benjamin Dauvergne il y a presque 9 ans

Le lock corrige le bug (même sans fsync il est impossible qu'un update_indexes() ne lise pas la mise à jour précédente, sauf crash disque), mais aussi à mon avis utiliser atomic_write aurait suffit en plus de la suppression d'une allocation précoce de l'id qui est le principal problème je pense.

#5

Mis à jour par Thomas Noël il y a presque 9 ans

Ack pour 0001-storage-add-lock-around-index-update-7818.patch

#6

Mis à jour par Frédéric Péters il y a presque 9 ans

  • Statut changé de En cours à Résolu (à déployer)
commit fa801967ef22450e3802a24d35e37ce954190516
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sat Jul 11 11:44:03 2015 +0200

    storage: add lock around index update (#7818)
#7

Mis à jour par Thomas Noël il y a plus de 8 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF