-
-
Notifications
You must be signed in to change notification settings - Fork 696
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
Fixes missing notification for deletion of watched dir on macOS #727
Fixes missing notification for deletion of watched dir on macOS #727
Conversation
First of all thanks for this PR! However, there appear to be a few gotchas with According to Apple's file system events documentation then I'll take a look tomorrow to whip up a few test cases to see what happens (on Big Sur at least, no access to older versions here). |
Indeed, Also, the event ID is not "reset". Only the |
Thank a lot @samschott ! I will wait for @CCP-Aporia approval. In the meantime, could you rebase your PR 🙏 ? |
If the public API should simply be that a changed root always translates into a |
b501d14
to
0fd9013
Compare
Rebased. @BoboTiG, could you confirm what the expected behaviour is for a moved root? I was merely extrapolating from the behaviour when child paths are moved out of root. |
@CCP-Aporia, there is already a test for the root being deleted (which is failing without this PR) but no test currently for the root being renamed. |
I think we need a unified behavior. watchdog/src/watchdog/observers/read_directory_changes.py Lines 123 to 124 in 44b9618
On Linux: watchdog/src/watchdog/observers/inotify_c.py Lines 310 to 314 in 44b9618
watchdog/src/watchdog/observers/inotify_c.py Line 521 in 44b9618
So on other OSes, we just skip the event and even stop the observer on Windows. Maybe this is not ideal 🤔 Should we just fire a |
For a moved root, I would say this is the same behavior. It should just fire the |
I think it's definitely good to fire a |
Always firing a
|
Agreeing with @samschott on the separate events for the separate scenarios. And I'd even go as far as updating the watched path in the observer in case of a |
We can start light with only targeting the deleted root in that PR. Then, as the rename/move root is more work, it would be good to tackle it in a separate branch. @samschott can you ensure the behavior will be the same on all implementation? |
... and that emitter is stopped
0fd9013
to
094545c
Compare
Will do. I have expanded the tests to check for a From looking at the code, it seems to me that the inotify backend already emits a watchdog/src/watchdog/observers/inotify_buffer.py Lines 93 to 98 in 44b9618
Edit: The polling backend is also already in line, though catching all OSErrors here may be a bit broad: watchdog/src/watchdog/observers/polling.py Lines 90 to 95 in 44b9618
Lets see what the tests give... |
There was a remaining issue with propagating the deleted event in inotify. Apart from this, However, there remain issues with moving the root folder which will be difficult to solve. This is why I have removed
To summarise, there are clear paths forward on FSEvents and Inotify and possibly a way on Windows. However, it involves moderate amounts of work and a choice of API: Do we want to emit a In any case, dealing with a moved root is probably the topic of a separate PR. |
I just had a look at the test failures and none of them seem related to the changes in this PR. @BoboTiG, if you agree on postponing the handling of a moved root to a future PR (after making a decision on a uniform API), could you have a look at the changes here? One last note on handling a moved root: In appears that the inotify backend already exposes a |
Let's get this merged. :-) |
Hm those Linux tests are now always failing:
Could you have a look? |
@BoboTiG, thanks for flagging that. There was actually a missing check that |
Great job, thanks 💯 |
* Fix installation of Python 3.7.9 on Windows (#705) * [windows] winapi.BUFFER_SIZE now defaults to 64000 (instead of 2048) To handle cases with lot of changes, this seems the highest safest value we can use. Note: it will fail with `ERROR_INVALID_PARAMETER` when it is greater than 64 KB and the application is monitoring a directory over the network. This is due to a packet size limitation with the underlying file sharing protocols. https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw#remarks Also introduced `winapi.PATH_BUFFER_SIZE` (defaults to `2048`) to keep the old behavior with path-realted functions. * [mac] Regression fixes for native fsevents (#717) * [mac] Fix missing event_id attribute in fsevents (#722) * [mac] Return byte paths if a byte path was given in fsevents (#726) * Pin py.test to a version that supports 2.7 * Disable pypy2 tests on Windows They hang and timeout after 6 hours for some unknown reason * [mac] Add compatibility with old macOS versions (#733) * Ensure version macros are available * Uniformize event for deletion of watched dir (#727) * [inotify] Add support for the IN_CLOSE_WRITE event (#747) * [mac] Support coalesced fsevents (#734) * Add `is_coalesced` property to `NativeEvent` So that we can effectively decide if we need to perform additional system calls to figure out what really happened. * Replace `NativeEvent._event_type` with `repr()` support It's more pythonic, and the `_event_type` implementation wasn't quite usable anyway. NB: the representation is not truly copy/paste python code if there is a double quote inside event.path, but that should be a rare case so we don't add the expensive special case handling there. * Allow running tests with debugger attached Some Python debuggers create additional threads, so we shouldn't assume that there is only one. * Request notifications for watched root * Expect events on macOS instead of using `time.sleep()` It might be even better to check for the emitter class, as opposed to platform * Add exception handling to FSEventsEmitter Reduce the amount of 'silent breakage' * Use sentinel event when setting up tests on macOS So that we can avoid a race between test setup and fseventsd * Improve handling of coalesced events * Revert accidental platform check change * Fix renaming_top_level_directory test on macOS * Generate sub events for move operations * Remove `filesystem_view` again While the `filesystem_view` helps with filtering out additional `FileCreatedEvent`+`DirModifiedEvent` pairs then it also introduces a huge amount of edge cases for synthetic events caused by move and rename operations. On top of that, in order to properly resolve those edge cases we'd have to go back to a solution very similar to the old directory snapshots, with all the performance penalties they suffered from... As such I think it's better to acknowledge the behaviour for coalesced events instead, and thus remove the `filesystem_view` again. * [mac] Improve handling of rename events (#750) * drop support for macOS 10.12 and lower Co-authored-by: SamSchott <[email protected]> Co-authored-by: Boris Staletic <[email protected]> Co-authored-by: Mickaël Schoentgen <[email protected]> Co-authored-by: Dustin Ingram <[email protected]> Co-authored-by: ysard <[email protected]> Co-authored-by: Lukas Šupienis <[email protected]> Co-authored-by: Lukas Šupienis <[email protected]>
This PR fixes an issue which would prevent us from being notified when the watched directory is deleted. This is achieved by passing the
kFSEventStreamCreateFlagWatchRoot
to the watch.