Repository: mesos
Updated Branches:
  refs/heads/master d94f08892 -> 1239e6cc3


Fixed health check command subprocess handling.

Currently it doesn't check all subprocess future states, and also
creates a pipe to stdin which can cause some scripts to expect stdin
input and blocks.

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


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

Branch: refs/heads/master
Commit: 1239e6cc36494ea56e00ad5720abd85bd6f2a4ac
Parents: d94f088
Author: Timothy Chen <[email protected]>
Authored: Mon Jul 14 10:46:58 2014 -0700
Committer: Niklas Q. Nielsen <[email protected]>
Committed: Mon Jul 14 10:47:12 2014 -0700

----------------------------------------------------------------------
 src/health-check/main.cpp | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/1239e6cc/src/health-check/main.cpp
----------------------------------------------------------------------
diff --git a/src/health-check/main.cpp b/src/health-check/main.cpp
index 707810a..95d881e 100644
--- a/src/health-check/main.cpp
+++ b/src/health-check/main.cpp
@@ -151,7 +151,11 @@ private:
       Try<Subprocess> external =
         process::subprocess(
           command.value(),
-          Subprocess::PIPE(),
+          // Reading from STDIN instead of PIPE because scripts
+          // seeing an open STDIN pipe might behave differently
+          // and we do not expect to pass any value from STDIN
+          // or PIPE.
+          Subprocess::FD(STDIN_FILENO),
           Subprocess::FD(STDERR_FILENO),
           Subprocess::FD(STDERR_FILENO),
           environment);
@@ -162,9 +166,18 @@ private:
         Future<Option<int> > status = external.get().status();
         status.await(Seconds(check.timeout_seconds()));
 
-        if (status.isFailed()) {
-          promise.fail("Shell command check failed with status: " +
-                        status.failure());
+        if (!status.isReady()) {
+          string msg = "Shell command check failed with reason: ";
+          if (status.isFailed()) {
+            msg += "failed with error: " + status.failure();
+          } else if (status.isDiscarded()) {
+            msg += "status future discarded";
+          } else {
+            msg += "status still pending after timeout " +
+                   stringify(Seconds(check.timeout_seconds()));
+          }
+
+          promise.fail(msg);
           return;
         }
 

Reply via email to