You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by gr...@apache.org on 2018/08/21 03:32:20 UTC

[2/2] kudu git commit: KUDU-2531: (part 2) Add -nobackup flag to pbc edit tool

KUDU-2531: (part 2) Add -nobackup flag to pbc edit tool

Adds a -nobackup flag to the pbc edit tool to
simplify usage when the backup file will
not be used and the user doesn’t want to worry about
cleanup.

Change-Id: If544f7682a30933077db0824452639a68507ba40
Reviewed-on: http://gerrit.cloudera.org:8080/11260
Tested-by: Kudu Jenkins
Reviewed-by: Grant Henke <gr...@apache.org>


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

Branch: refs/heads/master
Commit: 36899014032ea05d1cd6177df0d9dd73f8d91b1e
Parents: 6d7d8f5
Author: Grant Henke <gr...@apache.org>
Authored: Fri Aug 17 15:13:22 2018 -0500
Committer: Grant Henke <gr...@apache.org>
Committed: Tue Aug 21 03:31:55 2018 +0000

----------------------------------------------------------------------
 src/kudu/tools/kudu-tool-test.cc  | 38 +++++++++++++++++++++++++++++++---
 src/kudu/tools/tool_action_pbc.cc | 24 +++++++++++++--------
 2 files changed, 50 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/36899014/src/kudu/tools/kudu-tool-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/tools/kudu-tool-test.cc b/src/kudu/tools/kudu-tool-test.cc
index 0027872..4a0be3a 100644
--- a/src/kudu/tools/kudu-tool-test.cc
+++ b/src/kudu/tools/kudu-tool-test.cc
@@ -361,6 +361,19 @@ class ToolTest : public KuduTest {
         stdout, Substitute("Total orphaned blocks: $0", expected_num_orphaned));
   }
 
+  Status HasAtLeastOneBackupFile(const string& dir, bool* found) {
+    vector<string> children;
+    RETURN_NOT_OK(env_->GetChildren(dir, &children));
+    *found = false;
+    for (const auto& child : children) {
+      if (child.find(".bak") != string::npos) {
+        *found = true;
+        break;
+      }
+    }
+    return Status::OK();
+  }
+
  protected:
   void RunLoadgen(int num_tservers = 1,
                   const vector<string>& tool_args = {},
@@ -835,21 +848,23 @@ TEST_F(ToolTest, TestPbcTools) {
   }
 
   // Utility to set the editor up based on the given shell command.
-  auto DoEdit = [&](const string& editor_shell, string* stdout, string* stderr = nullptr) {
+  auto DoEdit = [&](const string& editor_shell, string* stdout, string* stderr = nullptr,
+      const string& extra_flags = "") {
     const string editor_path = GetTestPath("editor");
     CHECK_OK(WriteStringToFile(Env::Default(),
                                StrCat("#!/usr/bin/env bash\n", editor_shell),
                                editor_path));
     chmod(editor_path.c_str(), 0755);
     setenv("EDITOR", editor_path.c_str(), /* overwrite */1);
-    return RunTool(Substitute("pbc edit $0/instance", kTestDir),
+    return RunTool(Substitute("pbc edit $0 $1/instance", extra_flags, kTestDir),
                    stdout, stderr, nullptr, nullptr);
   };
 
   // Test 'edit' by setting up EDITOR to be a sed script which performs a substitution.
   {
     string stdout;
-    ASSERT_OK(DoEdit("exec sed -i -e s/Formatted/Edited/ \"$@\"\n", &stdout));
+    ASSERT_OK(DoEdit("exec sed -i -e s/Formatted/Edited/ \"$@\"\n", &stdout, nullptr,
+                     "--nobackup"));
     ASSERT_EQ("", stdout);
 
     // Dump to make sure the edit took place.
@@ -857,6 +872,23 @@ TEST_F(ToolTest, TestPbcTools) {
         "pbc dump $0/instance --oneline", kTestDir), &stdout));
     ASSERT_STR_MATCHES(stdout, Substitute(
         "^0\tuuid: \"$0\" format_stamp: \"Edited at .*\"$$", uuid));
+
+    // Make sure no backup file was written.
+    bool found_backup;
+    ASSERT_OK(HasAtLeastOneBackupFile(kTestDir, &found_backup));
+    ASSERT_FALSE(found_backup);
+  }
+
+  // Test 'edit' with a backup.
+  {
+    string stdout;
+    ASSERT_OK(DoEdit("exec sed -i -e s/Formatted/Edited/ \"$@\"\n", &stdout));
+    ASSERT_EQ("", stdout);
+
+    // Make sure a backup file was written.
+    bool found_backup;
+    ASSERT_OK(HasAtLeastOneBackupFile(kTestDir, &found_backup));
+    ASSERT_TRUE(found_backup);
   }
 
   // Test 'edit' with an unsuccessful edit.

http://git-wip-us.apache.org/repos/asf/kudu/blob/36899014/src/kudu/tools/tool_action_pbc.cc
----------------------------------------------------------------------
diff --git a/src/kudu/tools/tool_action_pbc.cc b/src/kudu/tools/tool_action_pbc.cc
index ee3837d..cc0e3b6 100644
--- a/src/kudu/tools/tool_action_pbc.cc
+++ b/src/kudu/tools/tool_action_pbc.cc
@@ -52,15 +52,17 @@ using std::string;
 using std::unique_ptr;
 using std::vector;
 
-DEFINE_bool(oneline, false, "print each protobuf on a single line");
+DEFINE_bool(oneline, false, "Print each protobuf on a single line");
 TAG_FLAG(oneline, stable);
 
-DEFINE_bool(json, false, "print protobufs in JSON format");
+DEFINE_bool(json, false, "Print protobufs in JSON format");
 TAG_FLAG(json, stable);
 
-DEFINE_bool(debug, false, "print extra debugging information about each protobuf");
+DEFINE_bool(debug, false, "Print extra debugging information about each protobuf");
 TAG_FLAG(debug, stable);
 
+DEFINE_bool(backup, true, "Write a backup file");
+
 namespace kudu {
 
 using pb_util::ReadablePBContainerFile;
@@ -209,12 +211,15 @@ Status EditFile(const RunnerContext& context) {
     RETURN_NOT_OK_PREPEND(pb_writer.Sync(), "failed to sync output");
     RETURN_NOT_OK_PREPEND(pb_writer.Close(), "failed to close output");
   }
-  // We successfully wrote the new file. Move the old file to a backup location,
-  // and move the new one to the final location.
-  string backup_path = Substitute("$0.bak.$1", path, GetCurrentTimeMicros());
-  RETURN_NOT_OK_PREPEND(env->RenameFile(path, backup_path),
-                        "couldn't back up original file");
-  LOG(INFO) << "Moved original file to " << backup_path;
+  // We successfully wrote the new file.
+  if (FLAGS_backup) {
+    // Move the old file to a backup location.
+    string backup_path = Substitute("$0.bak.$1", path, GetCurrentTimeMicros());
+    RETURN_NOT_OK_PREPEND(env->RenameFile(path, backup_path),
+                          "couldn't back up original file");
+    LOG(INFO) << "Moved original file to " << backup_path;
+  }
+  // Move the new file to the final location.
   RETURN_NOT_OK_PREPEND(env->RenameFile(tmp_out_path, path),
                         "couldn't move new file into place");
   delete_tmp_output.cancel();
@@ -238,6 +243,7 @@ unique_ptr<Mode> BuildPbcMode() {
   unique_ptr<Action> edit =
       ActionBuilder("edit", &EditFile)
       .Description("Edit a PBC (protobuf container) file")
+      .AddOptionalParameter("backup")
       .AddRequiredParameter({kPathArg, "path to PBC file"})
       .Build();