mesos-reviews mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alex Clemmer <>
Subject Re: Review Request 55327: Windows: Fixed hanging symlink bug in `os::rmdir`.
Date Wed, 18 Jan 2017 20:50:18 GMT

This is an automatically generated e-mail. To reply, visit:

(Updated Jan. 18, 2017, 8:50 p.m.)

Review request for mesos, Andrew Schwartzmeyer, Daniel Pravat, and Joseph Wu.


Address Joseph's comments, fix embarrasing mistake.

Repository: mesos


The Windows implementation of `os::rmdir` will fail to delete "hanging"
symlinks (i.e., symlinks whose targets do not exist). Note that on
Windows this bug is specific to symlinks whose targets are _deleted_,
since it is impossible to create a symlink whose target does not exist.

The primary issue that causes this problem is that it is very difficult
to tell whether a symlink points at a directory or a file unless you
resolve the symlink and determine whether the target is a directory or a
file. In situations where the target does not exist, we can't use this
information, and so `os::rmdir` occasionally mis-routes a symlink to
(what was) a directory to a `::remove` call, which will fail with a
cryptic error.

To fix this behavior, this commit will introduce code that simply tries
to remove the reparse point with both `RemoveDirectory` and
`DeleteFile`, and if either succeeds, we report success for the
operation. This represents a "best effort"; in the case that the reparse
point represents something more exotic than a symlink, we will still
fail, but by choosing not to verify whether the target is a directory or
a file, we simplify the code and still obtain the outcome of having
deleted the directory.

This commit is the primary blocker for MESOS-6707, as deleting the Agent
sandbox will sometimes cause us to delete the latest run directory for
the executor before the symlinked `latest` directory itself. This causes
the delete to fail, and then the GC tests to fail, since they tend to
assert the directory does not exist.

Diffs (updated)

  3rdparty/stout/include/stout/os/windows/rmdir.hpp 4437484c068e9ef046e0be14683c97db447f2da1

  3rdparty/stout/tests/os/rmdir_tests.cpp 988d41b7fdd11cc96ce005671a7c62d1b5a3615d 




Alex Clemmer

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message