Development #42906
FileNotFoundError dans Publisher.clean_sessions
0%
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
Historique
Mis à jour par Benjamin Dauvergne il y a presque 4 ans
- Fichier 0001-misc-ignore-FileNotFoundError-when-cleaning-form-tok.patch 0001-misc-ignore-FileNotFoundError-when-cleaning-form-tok.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Me demandez pas un test.
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.
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.
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)
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
misc: ignore FileNotFoundError when cleaning form-tokens (#42906)