werkzeug icon indicating copy to clipboard operation
werkzeug copied to clipboard

watchdog: Prevent reload if a file gets closed without any changes

Open lociii opened this issue 1 year ago • 7 comments

What's the issue?

watchdog 5.0 introduced a new signal that is fired when a file gets closed without any changes written.
This leads to random reloads when something opens and closes a file. opened events are already ignored, so we should ignore the new closed_no_write events too.

How to reproduce?

Update to watchdog 5.0+ and wait for the reloads to come in.

What's the expected behavior?

Werkzeug should only reload if there are actual changes to the code base.

Environment

  • Python version: 3.11.2
  • Werkzeug version: 3.0.4
  • watchdog version: 5.0.2

lociii avatar Sep 05 '24 07:09 lociii

I'm using Django and django-extensions. I started getting reloads on every request. After doing some checks I was able to find that it started happening after upgrading werkzeug from 3.0.3 to 3.0.4

marianobianchi avatar Sep 16 '24 11:09 marianobianchi

I'm using Django and django-extensions. I started getting reloads on every request. After doing some checks I was able to find that it started happening after upgrading werkzeug from 3.0.3 to 3.0.4

I am also having the same problem

I am using werkzeug==3.0.4 watchdog==5.0.2

After a request i get bogus changes detected

backend-1 | * Detected change in '/backend/common/schema.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/drf_spectacular/openapi.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/drf_spectacular/utils.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/drf_spectacular/generators.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/drf_spectacular/views.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/rest_framework/views.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/django/views/generic/base.py', reloading backend-1 | * Detected change in '/usr/local/lib/python3.12/site-packages/django/views/decorators/csrf.py', reloading backend-1 | * Detected change in '/backend/common/authentication.py', reloading postgres-1 | 2024-09-17 08:08:21.866 UTC [104] LOG: could not receive data from client: Connection reset by peer backend-1 | * Restarting with watchdog (inotify)

ckarli avatar Sep 17 '24 08:09 ckarli

Opened a PR but needs feedback on direction: https://github.com/pallets/werkzeug/pull/2954#issuecomment-2396929700

jdimmerman avatar Oct 07 '24 13:10 jdimmerman

Opened a PR but needs feedback on direction: #2954 (comment)

I already opened one over a month ago. Not much progress from the maintainer side so far.
https://github.com/pallets/werkzeug/pull/2947

lociii avatar Oct 07 '24 15:10 lociii

Thanks @lociii - much better solution. Closing mine

jdimmerman avatar Oct 07 '24 15:10 jdimmerman

@ThiefMaster @davidism
This issue breaks runserver_plus from django-extensions for everyone not pinning watchdog to 4.x and using the file system events reload mechanism. It would be really appreciated if my simple fix could be merged and released.

lociii avatar Oct 15 '24 07:10 lociii

Thank you very much @lociii for reporting the issue :) I enforced watchdog version to be <5 in my project (using functions-framework) to fix it temporarily and move forward

mlgarchery avatar Oct 15 '24 12:10 mlgarchery