Projet

Général

Profil

Development #42906

FileNotFoundError dans Publisher.clean_sessions

Ajouté par Benjamin Dauvergne il y a presque 4 ans. Mis à jour il y a presque 4 ans.

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Trace à la réunion qui ressemble beaucoup à un exécution concurrente de remove_ajax_form_token() pendant un cleanup (ou alors deux cleanup en parallèle, enfin osef) :

## Portail de démarches ##

Exception:
  type = '<class 'FileNotFoundError'>', value = '[Errno 2] No such file or directory: '/var/lib/wcs/formulaires-demarches.cr-reunion.fr/form_tokens/6wIZy4-VkqnOintfuLHsyQ''

Stack trace (most recent call first):
  File "/usr/lib/python3/dist-packages/wcs/qommon/publisher.py", line 621, in clean_sessions
   619                             pass
   620         finally:
>  621             os.close(fd)
   622
   623     def clean_afterjobs(self):

  locals:
     cleaning_lock_file = '/var/lib/wcs/formulaires-demarches.cr-reunion.fr/cleaning_sessions.lock'
     creation_limit = 1586888402.266552
     fd = 11
     filename = '6wIZy4-VkqnOintfuLHsyQ'
     form_tokens_dir = '/var/lib/wcs/formulaires-demarches.cr-reunion.fr/form_tokens'
     last_usage_limit = 1589221202.266552
     manager = <StorageSessionManager at 7f06795ee400>
     now = 1589480402.266552
     self = <wcs.compat.CompatWcsPublisher object at 0x7f06796a9208>
     session = <Session at 7f06795fc390: LaX7AoyClB4W1OItdHVlGw>
     session_key = 'LaX7AoyClB4W1OItdHVlGw'

c'est dans ce code :

            # also delete obsolete form_tokens that would have be missed when
            # cleaning sessions.
            form_tokens_dir = self.form_tokens_dir
            if os.path.exists(form_tokens_dir):
                for filename in os.listdir(form_tokens_dir):
                    if os.stat(os.path.join(form_tokens_dir, filename)).st_mtime < creation_limit:
                        try:
                            os.unlink(os.path.join(form_tokens_dir, filename))
                        except OSError:
                            pass
        finally:
            os.close(fd)

Je pense que c'est le os.stat non protégé qui lève l'exception (le fichier ayant disparu entre os.listdir() et os.stat(). Il faut juste récupérer FileNotFoundError autour du tout et plus OSError.


Fichiers

Révisions associées

Révision 5b75356e (diff)
Ajouté par Benjamin Dauvergne il y a presque 4 ans

misc: ignore FileNotFoundError when cleaning form-tokens (#42906)

Historique

#1

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

  • Assigné à mis à Benjamin Dauvergne
#2

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

Me demandez pas un test.

#3

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

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

On est effectivement sur plus de 100000 fichiers dans form_tokens sur cr-reunion... Environ 1/2 seconde pour faire ce nettoyage.

A noter qu'en Python 3.5 on a os.scandir qui est plus rapide selon la doc. Bon, j'ai testé c'est pas ultra significatif ici (0.5s versus 0.7s sur 100000 fichiers) mais le code est plus joli (je trouve) :

for entry in os.scandir(form_tokens_dir):
    try:
        if entry.stat().st_mtime < creation_limit:
            os.unlink(entry.path)
    except FileNotFoundError:
        pass

Sans doute aussi qu'en tant qu'itérateur, scandir va faire de son mieux pour éviter de sortir des fichiers supprimés entre temps.

#4

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

Thomas Noël a écrit :

On est effectivement sur plus de 100000 fichiers dans form_tokens sur cr-reunion... Environ 1/2 seconde pour faire ce nettoyage.

A noter qu'en Python 3.5 on a os.scandir qui est plus rapide selon la doc. Bon, j'ai testé c'est pas ultra significatif ici (0.5s versus 0.7s sur 100000 fichiers) mais le code est plus joli (je trouve) :

[...]

Sans doute aussi qu'en tant qu'itérateur, scandir va faire de son mieux pour éviter de sortir des fichiers supprimés entre temps.

Race condition, on ne peut rien faire de mieux que le gérer, même si ça ne prenait qu'un millème de seconde t'auras une erreur de temps en temps si suffisamment de form-tokens existent et disparaissent à chaque seconde.

#5

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

  • Statut changé de Solution validée à Résolu (à déployer)
commit 5b75356e17f78d5bb84c7693235e71c43b18a73e
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu May 14 22:49:05 2020 +0200

    misc: ignore FileNotFoundError when cleaning form-tokens (#42906)
#6

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

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

Formats disponibles : Atom PDF