Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RuntimeError: Cannot add watch, already scheduled #73

Open
lorenzwalthert opened this issue Sep 17, 2021 · 6 comments
Open

RuntimeError: Cannot add watch, already scheduled #73

lorenzwalthert opened this issue Sep 17, 2021 · 6 comments

Comments

@lorenzwalthert
Copy link

lorenzwalthert commented Sep 17, 2021

It seems that when running cachier, I randomly get these errors:

2021-09-17 09:05:32,357 - fsevents - ERROR - Unhandled exception in FSEventsEmitter
Traceback (most recent call last):
  File "/Users/lorenz/.../signals/.venv/lib/python3.9/site-packages/watchdog/observers/fsevents.py", line 315, in run
    _fsevents.add_watch(self, self.watch, self.events_callback, self.pathnames)
RuntimeError: Cannot add watch <ObservedWatch: path=/Users/lorenz/.cachier/, is_recursive=True> - it is already scheduled

My current solution is to delete the cache, assuming it is corrupt, and then start from scratch.

The most similar error I found on the net was the one reported in spyder-ide/spyder#14803. There, the solution was to unwatch on switching directories/projects.

@shaypal5
Copy link
Collaborator

Hey,

That's look very relevant! Thank you for reaching out.

Anyway to produce the full stack trace, pointing to a code line in cachier itself?
Or is this all you're getting? 

It sounds like this will be hard to reproduce to test correctly.

@shaypal5 shaypal5 added the bug label Sep 17, 2021
@shaypal5 shaypal5 added the stale Issues and PRs that seem abandoned by their authors. label Nov 15, 2021
@louismartin
Copy link
Contributor

louismartin commented Nov 25, 2022

I get that error with my flask server from time to time, I don't have more details:

ERROR:fsevents:Unhandled exception in FSEventsEmitter
Traceback (most recent call last):
  File "/Users/louismartin/miniconda3/envs/dev3.9/lib/python3.9/site-packages/watchdog/observers/fsevents.py", line 315, in run
    _fsevents.add_watch(self, self.watch, self.events_callback, self.pathnames)
RuntimeError: Cannot add watch <ObservedWatch: path=/Users/louismartin/.cachier/, is_recursive=True> - it is already scheduled

(On macOS, python 3.9)

@SultanOrazbayev
Copy link

This seems to pop-up every now and then when I use multiple process to access the same cache value, but unable to reproduce consistently.

@shaypal5 shaypal5 removed the stale Issues and PRs that seem abandoned by their authors. label Jun 30, 2023
@GianlucaFicarelli
Copy link

I can always reproduce the error on mac intel 12.7 using the latest cachier 2.2.2 and Python 3.11.1 with this script:

import logging
import threading
import time
from cachier import cachier


@cachier()
def func(x):
    logging.info("Calculating %s", x)
    time.sleep(1)
    return x * x


def thread_function(name):
    logging.info("Thread %s: starting", name)
    func(1234)
    logging.info("Thread %s: finishing", name)


def main():
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")

    func.clear_cache()

    threads = []
    for index in range(3):
        logging.info("Main    : create and start thread %d.", index)
        x = threading.Thread(target=thread_function, args=(index,))
        threads.append(x)
        x.start()

    for index, thread in enumerate(threads):
        logging.info("Main    : before joining thread %d.", index)
        thread.join()
        logging.info("Main    : thread %d done", index)


if __name__ == "__main__":
    main()

Output (the script hangs and I need to hit Ctrl-C):

11:30:25: Main    : create and start thread 0.
11:30:25: Thread 0: starting
11:30:25: Main    : create and start thread 1.
11:30:25: Thread 1: starting
11:30:25: Main    : create and start thread 2.
11:30:25: Thread 2: starting
11:30:25: Main    : before joining thread 0.
11:30:25: Calculating 1234
11:30:25: Unhandled exception in FSEventsEmitter
Traceback (most recent call last):
  File "/private/tmp/venv/lib/python3.11/site-packages/watchdog/observers/fsevents.py", line 324, in run
    _fsevents.add_watch(self, self.watch, self.events_callback, self.pathnames)
RuntimeError: Cannot add watch <ObservedWatch: path='/Users/ficarell/.cachier/', is_recursive=True> - it is already scheduled
11:30:26: Thread 0: finishing
11:30:26: Main    : thread 0 done
11:30:26: Main    : before joining thread 1.
11:30:26: Thread 2: finishing
^CTraceback (most recent call last):
  File "/private/tmp/try_cachier.py", line 40, in <module>
    main()
  File "/private/tmp/try_cachier.py", line 35, in main
    thread.join()
  File "/Users/ficarell/.pyenv/versions/3.11.1/lib/python3.11/threading.py", line 1112, in join
    self._wait_for_tstate_lock()
  File "/Users/ficarell/.pyenv/versions/3.11.1/lib/python3.11/threading.py", line 1132, in _wait_for_tstate_lock
    if lock.acquire(block, timeout):
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt

Packages installed in the virtualenv:

❯ python -V
Python 3.11.1
❯ pip freeze
cachier==2.2.2
portalocker==2.8.2
watchdog==3.0.0

I don't get the error in any of these cases:

  • if running on Linux
  • if time.sleep(1) is removed
  • if the disk cache is reused (not executing func.clear_cache())

@bryanhelmig
Copy link

Killing (CTRL-C) a long running cached function mid-miss can readily reproduce this.

@shaypal5
Copy link
Collaborator

Thank you both for chiming in, and @GianlucaFicarelli especially for the very detailed way to reproduce this!

This dramatically increases the chance that a past active contributor or a new one will take this on and try to solve this bug.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants