Repository: kudu
Updated Branches:
  refs/heads/master 15afb6495 -> 3f194c3a1


test_util: reset flags before cleaning test directory

TabletServerDiskFailureTest.TestRandomOpSequence didn't reset
env_inject_eio to 0 before finishing. Rather than fixing that, let's change
KuduTest to reset its flags _before_ cleaning out the test directory. This
obviates the need for all such workarounds.

Change-Id: I4b4843cbc2c3bc2cbeb3a4d5959f80a35da7714a
Reviewed-on: http://gerrit.cloudera.org:8080/9944
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/3f194c3a
Tree: http://git-wip-us.apache.org/repos/asf/kudu/tree/3f194c3a
Diff: http://git-wip-us.apache.org/repos/asf/kudu/diff/3f194c3a

Branch: refs/heads/master
Commit: 3f194c3a17f11a70e64bf2668a96e1e93fed00df
Parents: 15afb64
Author: Adar Dembo <a...@cloudera.com>
Authored: Fri Apr 6 10:41:26 2018 -0700
Committer: Adar Dembo <a...@cloudera.com>
Committed: Fri Apr 6 21:03:38 2018 +0000

----------------------------------------------------------------------
 src/kudu/fs/block_manager-test.cc     |  2 --
 src/kudu/fs/data_dirs-test.cc         |  1 -
 src/kudu/fs/fs_manager-test.cc        | 24 +++++++++---------------
 src/kudu/fs/log_block_manager-test.cc | 14 ++++++++------
 src/kudu/tablet/diskrowset-test.cc    |  2 --
 src/kudu/util/test_util.cc            |  4 ++++
 src/kudu/util/test_util.h             | 12 ++++++++++--
 7 files changed, 31 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/fs/block_manager-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/block_manager-test.cc 
b/src/kudu/fs/block_manager-test.cc
index e17a61e..9d5a590 100644
--- a/src/kudu/fs/block_manager-test.cc
+++ b/src/kudu/fs/block_manager-test.cc
@@ -998,7 +998,6 @@ TYPED_TEST(BlockManagerTest, 
TestMetadataOkayDespiteFailure) {
                                          false /* create */));
     }
   }
-  FLAGS_env_inject_eio = 0;
 }
 
 TYPED_TEST(BlockManagerTest, TestGetAllBlockIds) {
@@ -1147,7 +1146,6 @@ TYPED_TEST(BlockManagerTest, TestBlockTransaction) {
   ASSERT_STR_CONTAINS(s.ToString(), Substitute("only deleted $0 blocks, "
                                                "first failure",
                                                deleted_blocks.size()));
-  FLAGS_env_inject_eio = 0;
 }
 
 } // namespace fs

http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/fs/data_dirs-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/data_dirs-test.cc b/src/kudu/fs/data_dirs-test.cc
index 449780a..7d35f09 100644
--- a/src/kudu/fs/data_dirs-test.cc
+++ b/src/kudu/fs/data_dirs-test.cc
@@ -421,7 +421,6 @@ TEST_F(DataDirManagerTest, TestOpenWithFailedDirs) {
       DataDirManagerOptions(), &dd_manager_);
   ASSERT_STR_CONTAINS(s.ToString(), "could not open directory manager");
   ASSERT_TRUE(s.IsIOError());
-  FLAGS_env_inject_eio = 0;
 }
 
 class TooManyDataDirManagerTest : public DataDirManagerTest {

http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/fs/fs_manager-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/fs_manager-test.cc b/src/kudu/fs/fs_manager-test.cc
index 4952a6b..5a76883 100644
--- a/src/kudu/fs/fs_manager-test.cc
+++ b/src/kudu/fs/fs_manager-test.cc
@@ -406,7 +406,6 @@ TEST_F(FsManagerTestBase, TestCreateWithFailedDirs) {
   Status s = fs_manager()->CreateInitialFileSystemLayout();
   ASSERT_STR_MATCHES(s.ToString(), "cannot create FS layout; at least one 
directory "
                                    "failed to canonicalize");
-  FLAGS_env_inject_eio = 0;
 }
 
 TEST_F(FsManagerTestBase, TestOpenWithNoBlockManagerInstances) {
@@ -458,8 +457,6 @@ TEST_F(FsManagerTestBase, TestOpenWithFailedDirs) {
   ReinitFsManagerWithPaths(wal_path, data_roots);
   ASSERT_OK(fs_manager()->Open(nullptr));
   ASSERT_EQ(1, fs_manager()->dd_manager()->GetFailedDataDirs().size());
-
-  FLAGS_env_inject_eio = 0;
 }
 
 TEST_F(FsManagerTestBase, TestTmpFilesCleanup) {
@@ -633,19 +630,16 @@ TEST_F(FsManagerTestBase, TestAddRemoveDataDirs) {
 
   // Try to open with a new data dir although an existing data dir has failed;
   // this should fail.
-  {
-    google::FlagSaver saver;
-    FLAGS_crash_on_eio = false;
-    FLAGS_env_inject_eio = 1.0;
-    FLAGS_env_inject_eio_globs = JoinPathSegments(new_path2, "**");
+  FLAGS_crash_on_eio = false;
+  FLAGS_env_inject_eio = 1.0;
+  FLAGS_env_inject_eio_globs = JoinPathSegments(new_path2, "**");
 
-    const string new_path3 = GetTestPath("new_path3");
-    opts.data_roots = { fs_root_, new_path2, new_path3 };
-    ReinitFsManagerWithOpts(opts);
-    Status s = fs_manager()->Open();
-    ASSERT_TRUE(s.IsIOError());
-    ASSERT_STR_CONTAINS(s.ToString(), "found failed data directory");
-  }
+  const string new_path3 = GetTestPath("new_path3");
+  opts.data_roots = { fs_root_, new_path2, new_path3 };
+  ReinitFsManagerWithOpts(opts);
+  s = fs_manager()->Open();
+  ASSERT_TRUE(s.IsIOError());
+  ASSERT_STR_CONTAINS(s.ToString(), "found failed data directory");
 }
 
 TEST_F(FsManagerTestBase, TestReAddRemovedDataDir) {

http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/fs/log_block_manager-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/fs/log_block_manager-test.cc 
b/src/kudu/fs/log_block_manager-test.cc
index 460d9d4..d93d8aa 100644
--- a/src/kudu/fs/log_block_manager-test.cc
+++ b/src/kudu/fs/log_block_manager-test.cc
@@ -30,6 +30,7 @@
 #include <vector>
 
 #include <boost/optional/optional.hpp>
+#include <gflags/gflags.h>
 #include <gflags/gflags_declare.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
@@ -1016,11 +1017,13 @@ TEST_F(LogBlockManagerTest, 
TestFailMultipleTransactionsPerContainer) {
   // Briefly inject an error while committing one of the transactions. This
   // should make the container read-only, preventing the remaining transactions
   // from proceeding.
-  FLAGS_crash_on_eio = false;
-  FLAGS_env_inject_eio = 1.0;
-  Status s = block_transactions[0]->CommitCreatedBlocks();
-  ASSERT_TRUE(s.IsIOError());
-  FLAGS_env_inject_eio = 0;
+  {
+    google::FlagSaver saver;
+    FLAGS_crash_on_eio = false;
+    FLAGS_env_inject_eio = 1.0;
+    Status s = block_transactions[0]->CommitCreatedBlocks();
+    ASSERT_TRUE(s.IsIOError());
+  }
 
   // Now try to add some more blocks.
   for (int i = 0; i < kNumTransactions; i++) {
@@ -1647,7 +1650,6 @@ TEST_F(LogBlockManagerTest, 
TestOpenWithFailedDirectories) {
   int uuid_idx;
   dd_manager_->FindUuidIndexByRoot(test_dirs[failed_idx], &uuid_idx);
   ASSERT_TRUE(ContainsKey(failed_dirs, uuid_idx));
-  FLAGS_env_inject_eio = 0;
 }
 
 // Test Close() a FINALIZED block. Including,

http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/tablet/diskrowset-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/tablet/diskrowset-test.cc 
b/src/kudu/tablet/diskrowset-test.cc
index 3005512..d6e9363 100644
--- a/src/kudu/tablet/diskrowset-test.cc
+++ b/src/kudu/tablet/diskrowset-test.cc
@@ -223,8 +223,6 @@ TEST_F(TestRowSet, TestErrorDuringUpdate) {
   Status s = rs->MutateRow(timestamp, probe, enc.as_changelist(), op_id_, 
&stats, &result);
   LOG(INFO) << s.ToString();
   ASSERT_TRUE(s.IsIOError());
-
-  FLAGS_env_inject_eio = 0;
 }
 
 TEST_F(TestRowSet, TestRandomRead) {

http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/util/test_util.cc
----------------------------------------------------------------------
diff --git a/src/kudu/util/test_util.cc b/src/kudu/util/test_util.cc
index b9f919a..30726a5 100644
--- a/src/kudu/util/test_util.cc
+++ b/src/kudu/util/test_util.cc
@@ -78,6 +78,7 @@ bool g_is_gtest = true;
 
 KuduTest::KuduTest()
   : env_(Env::Default()),
+    flag_saver_(new google::FlagSaver()),
     test_dir_(GetTestDataDirectory()) {
   std::map<const char*, const char*> flags_for_tests = {
     // Disabling fsync() speeds up tests dramatically, and it's safe to do as 
no
@@ -108,6 +109,9 @@ KuduTest::KuduTest()
 }
 
 KuduTest::~KuduTest() {
+  // Reset the flags first to prevent them from affecting test directory 
cleanup.
+  flag_saver_.reset();
+
   // Clean up the test directory in the destructor instead of a TearDown
   // method. This is better because it ensures that the child-class
   // dtor runs first -- so, if the child class is using a minicluster, etc,

http://git-wip-us.apache.org/repos/asf/kudu/blob/3f194c3a/src/kudu/util/test_util.h
----------------------------------------------------------------------
diff --git a/src/kudu/util/test_util.h b/src/kudu/util/test_util.h
index f79daa6..67f0034 100644
--- a/src/kudu/util/test_util.h
+++ b/src/kudu/util/test_util.h
@@ -23,9 +23,9 @@
 
 #include <cstdint>
 #include <functional>
+#include <memory>
 #include <string>
 
-#include <gflags/gflags.h>
 #include <gtest/gtest.h>
 
 #include "kudu/gutil/port.h"
@@ -36,6 +36,10 @@
   NO_PENDING_FATALS(); \
 } while (0)
 
+namespace google {
+class FlagSaver;
+} // namespace google
+
 namespace kudu {
 
 class Env;
@@ -64,7 +68,11 @@ class KuduTest : public ::testing::Test {
   std::string GetTestPath(const std::string& relative_path);
 
   Env* env_;
-  google::FlagSaver flag_saver_;  // Reset flags on every test.
+
+  // Reset flags on every test. Allocated on the heap so it can be destroyed
+  // (and the flags reset) before test_dir_ is deleted.
+  std::unique_ptr<google::FlagSaver> flag_saver_;
+
   std::string test_dir_;
 };
 

Reply via email to