Skip to content

Avoid race condition crash on directory deletion#281

Merged
tamland merged 1 commit intogorakhargosh:masterfrom
theospears:do-not-crash-on-dir-deletion
Oct 25, 2014
Merged

Avoid race condition crash on directory deletion#281
tamland merged 1 commit intogorakhargosh:masterfrom
theospears:do-not-crash-on-dir-deletion

Conversation

@theospears
Copy link
Copy Markdown
Contributor

Given the directory structure /a/b/c.txt there is a race condition
in DirectorySnapshot if it reads the list of entries in /a, then
/a/b is deleted, and then it tries to read /a/b. This happens
often in practice when changing between very different branches in
git.

The correct behaviour would be to report /a/b as not existing in this
case, but we cannot do this without either changing the order of the
walk (from parent-first to parent-last) or significantly increasing
memory usage and copies, so instead we report /a/b as existing but
empty, which is not ideal, but is better than the current behavior
of silently crashing.

@theospears
Copy link
Copy Markdown
Contributor Author

I believe (but am not certain) the test failure here is spurious due to general test flakiness.

Comment thread src/watchdog/utils/dirsnapshot.py Outdated
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Compare with errno.ENOENT instead of hardcoding it

@tamland
Copy link
Copy Markdown
Collaborator

tamland commented Oct 24, 2014

Thanks! Don't mind the occasional travis failure. It runs on a toaster so sometimes it's so slow it times out.

If this happens we treat it as empty, which is wrong but better than crashing

I understand your reasoning, but I don't think it's wrong to treat it as empty. The directory did exist the instance it was checked. It's the nature of snapshotting. In the next snapshot it will correct itself and report the dir as deleted.

Given the directory structure /a/b/c.txt there is a race condition
in DirectorySnapshot if it reads the list of entries in /a, then
/a/b is deleted, and then it tries to read /a/b. This happens
often in practice when changing between very different branches in
git.

The ideal behaviour would be to report /a/b as not existing in this
case, but we cannot do this without either changing the order of the
walk (from parent-first to parent-last) or significantly increasing
memory usage and copies, so instead we report /a/b as existing but
empty.
@theospears theospears force-pushed the do-not-crash-on-dir-deletion branch from b20604a to 2e83199 Compare October 24, 2014 17:32
@theospears
Copy link
Copy Markdown
Contributor Author

Updated to reflect comments.

tamland added a commit that referenced this pull request Oct 25, 2014
Avoid race condition crash on directory deletion
@tamland tamland merged commit 5893e29 into gorakhargosh:master Oct 25, 2014
CCP-Aporia pushed a commit to CCP-Aporia/watchdog that referenced this pull request Aug 13, 2020
…ir-deletion

Avoid race condition crash on directory deletion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants