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

Avoid race condition crash on directory deletion #281

Merged

Conversation

theospears
Copy link
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
Contributor Author

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

# Directory may have been deleted between finding it in the directory
# list of its parent and trying to delete its contents. If this
# happens we treat it as empty, which is wrong but better than crashing
if e.errno == 2:
Copy link
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
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
Copy link
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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants