You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ti...@apache.org on 2014/05/29 05:48:25 UTC
git commit: Fixed missing cloexec and switched to io::redirect in
MesosContainerizer.
Repository: mesos
Updated Branches:
refs/heads/master d5eef825c -> 1af1df579
Fixed missing cloexec and switched to io::redirect in MesosContainerizer.
Review: https://reviews.apache.org/r/22001
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/1af1df57
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/1af1df57
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/1af1df57
Branch: refs/heads/master
Commit: 1af1df57910b22e783414c755b97a2fbe9c5ee71
Parents: d5eef82
Author: Till Toenshoff <to...@me.com>
Authored: Thu May 29 05:37:56 2014 +0200
Committer: Till Toenshoff <to...@me.com>
Committed: Thu May 29 05:37:56 2014 +0200
----------------------------------------------------------------------
src/slave/containerizer/mesos_containerizer.cpp | 53 +++++++++++---------
1 file changed, 29 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/1af1df57/src/slave/containerizer/mesos_containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos_containerizer.cpp b/src/slave/containerizer/mesos_containerizer.cpp
index d01d443..1438024 100644
--- a/src/slave/containerizer/mesos_containerizer.cpp
+++ b/src/slave/containerizer/mesos_containerizer.cpp
@@ -652,8 +652,14 @@ Future<Nothing> MesosContainerizerProcess::fetch(
return Failure("Failed to execute mesos-fetcher: " + fetcher.error());
}
- // Redirect output (stdout and stderr) from the fetcher to log files in the
- // executor work directory, chown'ing them if a user is specified.
+ // Redirect output (stdout and stderr) from the fetcher to log files
+ // in the executor work directory, chown'ing them if a user is
+ // specified.
+ // TODO(tillt): Consider adding O_CLOEXEC for atomic close-on-exec.
+ // TODO(tillt): Consider adding an overload to io::redirect
+ // that accepts a file path as 'to' for further reducing code. We
+ // would however also need an owner user parameter for such overload
+ // to perfectly replace the below.
Try<int> out = os::open(
path::join(directory, "stdout"),
O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK,
@@ -664,21 +670,23 @@ Future<Nothing> MesosContainerizerProcess::fetch(
}
if (user.isSome()) {
- Try<Nothing> chown = os::chown(user.get(), path::join(directory, "stdout"));
+ Try<Nothing> chown = os::chown(
+ user.get(), path::join(directory, "stdout"));
if (chown.isError()) {
os::close(out.get());
- return Failure("Failed to redirect stdout:" + chown.error());
+ return Failure(
+ "Failed to redirect stdout: Failed to chown: " +
+ chown.error());
}
}
- Try<Nothing> nonblock = os::nonblock(fetcher.get().out());
- if (nonblock.isError()) {
- os::close(out.get());
- return Failure("Failed to redirect stdout:" + nonblock.error());
- }
+ // Redirect takes care of nonblocking and close-on-exec for the
+ // supplied file descriptors.
+ io::redirect(fetcher.get().out(), out.get());
- io::splice(fetcher.get().out(), out.get())
- .onAny(lambda::bind(&os::close, out.get()));
+ // Redirect does 'dup' the file descriptor, hence we can close the
+ // original now.
+ os::close(out.get());
// Repeat for stderr.
Try<int> err = os::open(
@@ -687,28 +695,25 @@ Future<Nothing> MesosContainerizerProcess::fetch(
S_IRUSR | S_IWUSR | S_IRGRP | S_IRWXO);
if (err.isError()) {
- os::close(out.get());
- return Failure("Failed to redirect stderr:" + err.error());
+ return Failure(
+ "Failed to redirect stderr: Failed to open: " +
+ err.error());
}
if (user.isSome()) {
- Try<Nothing> chown = os::chown(user.get(), path::join(directory, "stderr"));
+ Try<Nothing> chown = os::chown(
+ user.get(), path::join(directory, "stderr"));
if (chown.isError()) {
- os::close(out.get());
os::close(err.get());
- return Failure("Failed to redirect stderr:" + chown.error());
+ return Failure(
+ "Failed to redirect stderr: Failed to chown: " +
+ chown.error());
}
}
- nonblock = os::nonblock(fetcher.get().err());
- if (nonblock.isError()) {
- os::close(out.get());
- os::close(err.get());
- return Failure("Failed to redirect stderr:" + nonblock.error());
- }
+ io::redirect(fetcher.get().err(), err.get());
- io::splice(fetcher.get().err(), err.get())
- .onAny(lambda::bind(&os::close, err.get()));
+ os::close(err.get());
return fetcher.get().status()
.then(lambda::bind(&_fetch, containerId, directory, user, lambda::_1));