You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by da...@apache.org on 2017/06/14 20:20:39 UTC

kudu git commit: Add option to set CWD to Subprocess

Repository: kudu
Updated Branches:
  refs/heads/master b4de65a8a -> e81db65a4


Add option to set CWD to Subprocess

This is useful for executing processes which must be run from a specific
directory.

Change-Id: I73dc4983b0074312623790ce026e6ad88439df89
Reviewed-on: http://gerrit.cloudera.org:8080/7176
Reviewed-by: Adar Dembo <ad...@cloudera.com>
Reviewed-by: Alexey Serbin <as...@cloudera.com>
Tested-by: Kudu Jenkins
Reviewed-by: Andrew Wong <aw...@cloudera.com>


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

Branch: refs/heads/master
Commit: e81db65a427d5394329420e7edc430a677b77705
Parents: b4de65a
Author: Dan Burkert <da...@apache.org>
Authored: Tue Jun 13 15:32:41 2017 -0700
Committer: Dan Burkert <da...@apache.org>
Committed: Wed Jun 14 20:20:10 2017 +0000

----------------------------------------------------------------------
 src/kudu/util/subprocess-test.cc | 20 ++++++++++++++++++++
 src/kudu/util/subprocess.cc      | 16 ++++++++++++++--
 src/kudu/util/subprocess.h       |  6 ++++++
 3 files changed, 40 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/e81db65a/src/kudu/util/subprocess-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/subprocess-test.cc b/src/kudu/util/subprocess-test.cc
index fb3d183..9e7e5cb 100644
--- a/src/kudu/util/subprocess-test.cc
+++ b/src/kudu/util/subprocess-test.cc
@@ -25,6 +25,7 @@
 #include <gtest/gtest.h>
 
 #include "kudu/gutil/strings/substitute.h"
+#include "kudu/util/path_util.h"
 #include "kudu/util/test_util.h"
 
 using std::string;
@@ -136,6 +137,25 @@ TEST_F(SubprocessTest, TestEnvVars) {
   ASSERT_OK(p.Wait());
 }
 
+// Test that the the subprocesses CWD can be set.
+TEST_F(SubprocessTest, TestCurrentDir) {
+  string dir_path = GetTestPath("d");
+  string file_path = JoinPathSegments(dir_path, "f");
+  ASSERT_OK(Env::Default()->CreateDir(dir_path));
+  std::unique_ptr<WritableFile> file;
+  ASSERT_OK(Env::Default()->NewWritableFile(file_path, &file));
+
+  Subprocess p({ "/bin/ls", "f" });
+  p.SetCurrentDir(dir_path);
+  p.ShareParentStdout(false);
+  ASSERT_OK(p.Start());
+  ASSERT_OK(p.Wait());
+
+  int rc;
+  ASSERT_OK(p.GetExitStatus(&rc, nullptr));
+  EXPECT_EQ(0, rc);
+}
+
 // Tests writing to the subprocess stdin.
 TEST_F(SubprocessTest, TestCallWithStdin) {
   string stdout;

http://git-wip-us.apache.org/repos/asf/kudu/blob/e81db65a/src/kudu/util/subprocess.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/subprocess.cc b/src/kudu/util/subprocess.cc
index 1f38b9f..5944cc8 100644
--- a/src/kudu/util/subprocess.cc
+++ b/src/kudu/util/subprocess.cc
@@ -50,9 +50,10 @@
 #include "kudu/util/monotime.h"
 #include "kudu/util/path_util.h"
 #include "kudu/util/signal.h"
-#include "kudu/util/stopwatch.h"
 #include "kudu/util/status.h"
+#include "kudu/util/stopwatch.h"
 
+using std::map;
 using std::string;
 using std::unique_ptr;
 using std::vector;
@@ -418,6 +419,11 @@ Status Subprocess::Start() {
     // don't explicitly ignore any other signals in Kudu.
     ResetSigPipeHandlerToDefault();
 
+    // Set the current working directory of the subprocess.
+    if (!cwd_.empty()) {
+      PCHECK(chdir(cwd_.c_str()) == 0);
+    }
+
     // Set the environment for the subprocess. This is more portable than
     // using execvpe(), which doesn't exist on OS X. We rely on the 'p'
     // variant of exec to do $PATH searching if the executable specified
@@ -680,10 +686,16 @@ Status Subprocess::DoWait(int* wait_status, WaitMode mode) {
   return Status::OK();
 }
 
-void Subprocess::SetEnvVars(std::map<std::string, std::string> env) {
+void Subprocess::SetEnvVars(map<string, string> env) {
+  CHECK_EQ(state_, kNotStarted);
   env_ = std::move(env);
 }
 
+void Subprocess::SetCurrentDir(string cwd) {
+  CHECK_EQ(state_, kNotStarted);
+  cwd_ = std::move(cwd);
+}
+
 void Subprocess::SetFdShared(int stdfd, bool share) {
   CHECK_EQ(state_, kNotStarted);
   CHECK_NE(fd_state_[stdfd], DISABLED);

http://git-wip-us.apache.org/repos/asf/kudu/blob/e81db65a/src/kudu/util/subprocess.h
----------------------------------------------------------------------
diff --git a/src/kudu/util/subprocess.h b/src/kudu/util/subprocess.h
index 9834e3a..2f5ad05 100644
--- a/src/kudu/util/subprocess.h
+++ b/src/kudu/util/subprocess.h
@@ -76,6 +76,11 @@ class Subprocess {
   // Repeated calls to this function replace earlier calls.
   void SetEnvVars(std::map<std::string, std::string> env);
 
+  // Set the initial current working directory of the subprocess.
+  //
+  // Must be set before starting the subprocess.
+  void SetCurrentDir(std::string cwd);
+
   // Start the subprocess. Can only be called once.
   //
   // This returns a bad Status if the fork() fails. However,
@@ -175,6 +180,7 @@ class Subprocess {
   int child_pid_;
   enum StreamMode fd_state_[3];
   int child_fds_[3];
+  std::string cwd_;
 
   // The cached wait status if Wait()/WaitNoBlock() has been called.
   // Only valid if state_ == kExited.