You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by tn...@apache.org on 2015/06/17 09:37:14 UTC

mesos git commit: Fix handling large docker image info on inspect.

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 <tn...@gmail.com>
Authored: Sat Jun 6 19:02:21 2015 +0000
Committer: Timothy Chen <tn...@apache.org>
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,