Watchdog: WinError 58 oblige le chien de garde à échouer les événements à venir

Créé le 14 sept. 2015  ·  4Commentaires  ·  Source: gorakhargosh/watchdog

Salut tout le monde,

Lors de la surveillance d'un dossier dans un QNAP, je peux obtenir des événements pour les fichiers nouvellement créés. Cependant, si le nouveau fichier est un répertoire, le chien de garde se bloque avec une erreur système.

Je soupçonne que c'est parce que le fichier est toujours en cours de copie, mais cela ne devrait pas être une raison pour faire planter l'auditeur.

L'application s'exécute sur Windows 8.1 Pro.
Version du micrologiciel QNAP : 3.7.2 Build 20120719
Trace de la pile:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
    self.run()
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\api.py", line 146, in run
    self.queue_events(self.timeout)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\read_directory_changes.py", line 77, in queue_events
    winapi_events = read_events(self._handle, self.watch.is_recursive)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 347, in read_events
    buf, nbytes = read_directory_changes(handle, recursive)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 307, in read_directory_changes
    raise e
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 303, in read_directory_changes
    ctypes.byref(nbytes), None, None)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 108, in _errcheck_bool
    raise ctypes.WinError()
OSError: [WinError 58] The specified server cannot perform the requested operation.

Commentaire le plus utile

Je suis également à la recherche d'une solution pour retarder/réessayer le fil dirwatcher sur :
OSError : [WinError 64] Le nom de réseau spécifié n'est plus disponible

Tous les 4 commentaires

Même problème ici, avec une WinError 64 et le message : Le nom de réseau spécifié n'est plus disponible. Cela se produit lorsque le dossier est servi à partir d'un serveur de fichiers qui devient indisponible (partage SMB).

Comment attraper ce genre d'erreur, pour réessayer de rattacher un observateur plus tard ?

Je suis également à la recherche d'une solution pour retarder/réessayer le fil dirwatcher sur :
OSError : [WinError 64] Le nom de réseau spécifié n'est plus disponible

J'ai eu le même problème où je recevais le message WinError 64 lors de la surveillance d'un partage de fichiers distant. J'ai fini par créer un petit wrapper autour de la classe watchdog.utils.BaseThread qui me permet de détecter l'erreur et de la récupérer. J'ai ensuite patché la classe BaseThread d'origine avec mon wrapper avant de créer un observateur. Dans mon cas spécifique, je détecte toutes les exceptions qui pourraient se produire dans la méthode run et les ajoute à une file d'attente à utiliser dans un thread différent. C'est une solution bidon, mais il n'y a pas beaucoup d'options sans modifications du code source.

import logging
import threading

import watchdog.utils

logger = logging.getLogger(__name__)


class BaseThreadWrapper(watchdog.utils.BaseThread):
    """
    Wrapper around watchdog BaseThread class.

    """
    queue = None

    def __init__(self):
        super(BaseThreadWrapper, self).__init__()
        self._original_run = self.run
        self.run = self.run_wrapper

    def run_wrapper(self):
        try:
            self._original_run()
        except Exception as e:
            logger.exception('%s thread exited with error',
                             threading.current_thread().name)
            self.queue.put(e)


watchdog.utils.BaseThread = BaseThreadWrapper

Quelle solution (changements de code) voudriez-vous voir dans watchdog ?

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

alt3red picture alt3red  ·  3Commentaires

hgrecco picture hgrecco  ·  6Commentaires

JeromeHoen picture JeromeHoen  ·  6Commentaires

datakurre picture datakurre  ·  7Commentaires

AdrienPensart picture AdrienPensart  ·  3Commentaires