Watchdog: WinError 58 заставляет сторожевой таймер провалить предстоящие события

Созданный на 14 сент. 2015  ·  4Комментарии  ·  Источник: gorakhargosh/watchdog

Всем привет,

При наблюдении за папкой внутри QNAP я могу получать события для вновь созданных файлов. Однако, если новый файл является каталогом, сторожевой таймер завершает работу с системной ошибкой.

Я подозреваю, что это потому, что файл все еще копируется, но это не должно быть причиной сбоя слушателя.

Приложение работает под управлением Windows 8.1 Pro.
Версия прошивки QNAP: 3.7.2 Build 20120719
Трассировки стека:

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.

Самый полезный комментарий

Я также сейчас ищу решение, чтобы отложить / повторить поток dirwatcher на:
OSError: [WinError 64] Указанное сетевое имя больше не доступно

Все 4 Комментарий

Такая же проблема здесь, с WinError 64 и сообщением: указанное сетевое имя больше не доступно. Это происходит, когда папка обслуживается файловым сервером, который становится недоступным (общий ресурс SMB).

Как мы могли поймать такую ​​ошибку, чтобы позже снова подключить наблюдателя?

Я также сейчас ищу решение, чтобы отложить / повторить поток dirwatcher на:
OSError: [WinError 64] Указанное сетевое имя больше не доступно

У меня была такая же проблема, когда я получал сообщение WinError 64 при мониторинге удаленного общего доступа к файлам. В итоге я создал крошечную оболочку для класса watchdog.utils.BaseThread, которая позволяет мне отловить ошибку и восстановить ее. Затем я monkeypatch исходный класс BaseThread с моей оболочкой перед созданием Observer. В моем конкретном случае я перехватываю любые исключения, которые могут произойти в методе выполнения, и добавляю их в очередь для использования в другом потоке. Это хакерское решение, но без изменений исходного кода вариантов не так много.

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

Какое решение (изменение кода) вы бы хотели видеть в Watchdog?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

bhargavrpatel picture bhargavrpatel  ·  3Комментарии

JeromeHoen picture JeromeHoen  ·  6Комментарии

alciomarhollanda picture alciomarhollanda  ·  5Комментарии

Ajordat picture Ajordat  ·  4Комментарии

mccarthyryanc picture mccarthyryanc  ·  5Комментарии