pallets / werkzeug

The comprehensive WSGI web application library.
https://werkzeug.palletsprojects.com
BSD 3-Clause "New" or "Revised" License
6.66k stars 1.73k forks source link

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

Closed lociii closed 1 month ago

lociii commented 2 months ago

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

marianobianchi commented 2 months ago

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

ckarli commented 2 months ago

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)

jdimmerman commented 1 month ago

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

lociii commented 1 month ago

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

jdimmerman commented 1 month ago

Thanks @lociii - much better solution. Closing mine

lociii commented 1 month ago

@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.

mlgarchery commented 1 month ago

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