Repository: mesos
Updated Branches:
  refs/heads/master fe39e7b2d -> 54ad73e1a


Perform read right after subprocess for docker ps.

Perform read right after subprocess for docker ps.

Review: https://reviews.apache.org/r/26487


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/54ad73e1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/54ad73e1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/54ad73e1

Branch: refs/heads/master
Commit: 54ad73e1adb22fd84fdd1dfb5c28175f743d1960
Parents: fe39e7b
Author: Timothy Chen <[email protected]>
Authored: Sat Oct 11 16:40:08 2014 -0700
Committer: Timothy Chen <[email protected]>
Committed: Sat Oct 11 16:40:08 2014 -0700

----------------------------------------------------------------------
 src/docker/docker.cpp | 16 +++++++++++-----
 src/docker/docker.hpp |  3 ++-
 2 files changed, 13 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/54ad73e1/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 20be6cd..1c0d6e6 100644
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -677,8 +677,13 @@ Future<list<Docker::Container> > Docker::ps(
     return Failure(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());
+
   return s.get().status()
-    .then(lambda::bind(&Docker::_ps, *this, cmd, s.get(), prefix));
+    .then(lambda::bind(&Docker::_ps, *this, cmd, s.get(), prefix, output));
 }
 
 
@@ -686,13 +691,16 @@ Future<list<Docker::Container> > Docker::_ps(
     const Docker& docker,
     const string& cmd,
     const Subprocess& s,
-    const Option<string>& prefix)
+    const Option<string>& prefix,
+    Future<string>& output)
 {
   Option<int> status = s.status().get();
 
   if (!status.isSome()) {
+    output.discard();
     return Failure("No status found from '" + cmd + "'");
   } else if (status.get() != 0) {
+    output.discard();
     CHECK_SOME(s.err());
     return io::read(s.err().get())
       .then(lambda::bind(
@@ -703,9 +711,7 @@ Future<list<Docker::Container> > Docker::_ps(
   }
 
   // Read to EOF.
-  CHECK_SOME(s.out());
-  return io::read(s.out().get())
-    .then(lambda::bind(&Docker::__ps, docker, prefix, lambda::_1));
+  return output.then(lambda::bind(&Docker::__ps, docker, prefix, lambda::_1));
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/54ad73e1/src/docker/docker.hpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp
index 7972eda..5ce90f6 100644
--- a/src/docker/docker.hpp
+++ b/src/docker/docker.hpp
@@ -143,7 +143,8 @@ private:
       const Docker& docker,
       const std::string& cmd,
       const process::Subprocess& s,
-      const Option<std::string>& prefix);
+      const Option<std::string>& prefix,
+      process::Future<std::string>& output);
 
   static process::Future<std::list<Container> > __ps(
       const Docker& docker,

Reply via email to