Repository: mesos Updated Branches: refs/heads/master 02160a1ce -> f13239e14
Fix handling large docker image info on inspect. Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/f13239e1 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/f13239e1 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/f13239e1 Branch: refs/heads/master Commit: f13239e14f9a982465e93184ef6e34395eb561f4 Parents: 02160a1 Author: Timothy Chen <[email protected]> Authored: Sat Jun 6 19:02:21 2015 +0000 Committer: Timothy Chen <[email protected]> Committed: Wed Jun 17 00:25:04 2015 -0700 ---------------------------------------------------------------------- src/docker/docker.cpp | 28 +++++++++++++++++++++++----- src/docker/docker.hpp | 4 +++- 2 files changed, 26 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/f13239e1/src/docker/docker.cpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp index 7138329..4e13003 100644 --- a/src/docker/docker.cpp +++ b/src/docker/docker.cpp @@ -670,8 +670,13 @@ void Docker::_inspect( return; } + // Start reading from stdout so writing to the pipe won't block + // to handle cases where the output is larger than the pipe + // capacity. + const Future<string> output = io::read(s.get().out().get()); + s.get().status() - .onAny([=]() { __inspect(cmd, promise, retryInterval, s.get()); }); + .onAny([=]() { __inspect(cmd, promise, retryInterval, output, s.get()); }); } @@ -679,10 +684,12 @@ void Docker::__inspect( const string& cmd, const Owned<Promise<Docker::Container>>& promise, const Option<Duration>& retryInterval, + Future<string> output, const Subprocess& s) { if (promise->future().hasDiscard()) { promise->discard(); + output.discard(); return; } @@ -694,6 +701,8 @@ void Docker::__inspect( if (!status.isSome()) { promise->fail("No status found from '" + cmd + "'"); } else if (status.get() != 0) { + output.discard(); + if (retryInterval.isSome()) { VLOG(1) << "Retrying inspect with non-zero status code. cmd: '" << cmd << "', interval: " << stringify(retryInterval.get()); @@ -718,7 +727,7 @@ void Docker::__inspect( // Read to EOF. CHECK_SOME(s.out()); - io::read(s.out().get()) + output .onAny([=](const Future<string>& output) { ___inspect(cmd, promise, retryInterval, output); }); @@ -892,6 +901,11 @@ Future<Docker::Image> Docker::pull( return Failure("Failed to execute '" + cmd + "': " + s.error()); } + // Start reading from stdout so writing to the pipe won't block + // to handle cases where the output is larger than the pipe + // capacity. + const Future<string> output = io::read(s.get().out().get()); + // We assume docker inspect to exit quickly and do not need to be // discarded. return s.get().status() @@ -901,7 +915,8 @@ Future<Docker::Image> Docker::pull( s.get(), directory, dockerImage, - path)); + path, + output)); } @@ -910,14 +925,17 @@ Future<Docker::Image> Docker::_pull( const Subprocess& s, const string& directory, const string& image, - const string& path) + const string& path, + Future<string> output) { Option<int> status = s.status().get(); if (status.isSome() && status.get() == 0) { - return io::read(s.out().get()) + return output .then(lambda::bind(&Docker::____pull, lambda::_1)); } + output.discard(); + return Docker::__pull(docker, directory, image, path); } http://git-wip-us.apache.org/repos/asf/mesos/blob/f13239e1/src/docker/docker.hpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp index 7790d0f..fbae7bd 100644 --- a/src/docker/docker.hpp +++ b/src/docker/docker.hpp @@ -170,6 +170,7 @@ private: const std::string& cmd, const process::Owned<process::Promise<Container>>& promise, const Option<Duration>& retryInterval, + process::Future<std::string> output, const process::Subprocess& s); static void ___inspect( @@ -195,7 +196,8 @@ private: const process::Subprocess& s, const std::string& directory, const std::string& image, - const std::string& path); + const std::string& path, + process::Future<std::string> output); static process::Future<Image> __pull( const Docker& docker,
