This is an automated email from the ASF dual-hosted git repository. chhsiao pushed a commit to branch 1.7.x in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 182dd84c6fcf6390c158bfb669b2f4c0f45e2b37 Author: Chun-Hung Hsiao <chhs...@mesosphere.io> AuthorDate: Fri Oct 19 09:28:38 2018 -0700 Stout: Added a sync option for `mkdir`. To ensure the directories created by `mkdir` are commited to their filesystems, an `fsync` will be called on the parent of each created directory if the `sync` option is set to true. This option has no effect on Windows. Review: https://reviews.apache.org/r/69085 --- 3rdparty/stout/include/stout/os/posix/mkdir.hpp | 40 ++++++++++++++++++++--- 3rdparty/stout/include/stout/os/windows/mkdir.hpp | 7 ++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/3rdparty/stout/include/stout/os/posix/mkdir.hpp b/3rdparty/stout/include/stout/os/posix/mkdir.hpp index 418db9a..806ec39 100644 --- a/3rdparty/stout/include/stout/os/posix/mkdir.hpp +++ b/3rdparty/stout/include/stout/os/posix/mkdir.hpp @@ -19,21 +19,44 @@ #include <vector> #include <stout/error.hpp> +#include <stout/foreach.hpp> #include <stout/nothing.hpp> #include <stout/strings.hpp> +#include <stout/path.hpp> #include <stout/try.hpp> #include <stout/os/constants.hpp> - +#include <stout/os/fsync.hpp> namespace os { -inline Try<Nothing> mkdir(const std::string& directory, bool recursive = true) +// Make a directory. +// +// If `recursive` is set to true, all intermediate directories will be created +// as required. If `sync` is set to true, `fsync()` will be called on the parent +// of each created directory to ensure that the result is committed to its +// filesystem. +// +// NOTE: This function doesn't ensure that any existing directory is committed +// to its filesystem, and it does not perform any cleanup in case of a failure. +inline Try<Nothing> mkdir( + const std::string& directory, + bool recursive = true, + bool sync = false) { if (!recursive) { if (::mkdir(directory.c_str(), 0755) < 0) { return ErrnoError(); } + + if (sync) { + const std::string parent = Path(directory).dirname(); + Try<Nothing> fsync = os::fsync(parent); + if (fsync.isError()) { + return Error( + "Failed to fsync directory '" + parent + "': " + fsync.error()); + } + } } else { std::vector<std::string> tokens = strings::tokenize(directory, stringify(os::PATH_SEPARATOR)); @@ -47,8 +70,17 @@ inline Try<Nothing> mkdir(const std::string& directory, bool recursive = true) foreach (const std::string& token, tokens) { path += token; - if (::mkdir(path.c_str(), 0755) < 0 && errno != EEXIST) { - return ErrnoError(); + if (::mkdir(path.c_str(), 0755) < 0) { + if (errno != EEXIST) { + return ErrnoError(); + } + } else if (sync) { + const std::string parent = Path(path).dirname(); + Try<Nothing> fsync = os::fsync(parent); + if (fsync.isError()) { + return Error( + "Failed to fsync directory '" + parent + "': " + fsync.error()); + } } path += os::PATH_SEPARATOR; diff --git a/3rdparty/stout/include/stout/os/windows/mkdir.hpp b/3rdparty/stout/include/stout/os/windows/mkdir.hpp index 2aef22a..77d292c 100644 --- a/3rdparty/stout/include/stout/os/windows/mkdir.hpp +++ b/3rdparty/stout/include/stout/os/windows/mkdir.hpp @@ -27,10 +27,13 @@ #include <stout/internal/windows/longpath.hpp> - namespace os { -inline Try<Nothing> mkdir(const std::string& directory, bool recursive = true) +// NOTE: `sync` has no effect on Windows. +inline Try<Nothing> mkdir( + const std::string& directory, + bool recursive = true, + bool sync = false) { if (!recursive) { // NOTE: We check for existence because parts of certain directories