You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2017/04/11 21:21:38 UTC

kudu git commit: [client-test] fix flakes of flush mode timing tests

Repository: kudu
Updated Branches:
  refs/heads/master 02ca419bd -> da75b66d2


[client-test] fix flakes of flush mode timing tests

Fix for ClientTest.TestFlushModesCompareOpRates* flakiness.  The idea
is to run the scenario multiple times to factor out fluctuations in
multi-tasking run-time environments while collecting stats on timings.
Also, the test scenarios are moved into the category of the slow tests.

Change-Id: Iee2abc59785b83fe116a542a265a61281b2f9741
Reviewed-on: http://gerrit.cloudera.org:8080/6607
Tested-by: Kudu Jenkins
Reviewed-by: Dan Burkert <da...@apache.org>


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

Branch: refs/heads/master
Commit: da75b66d2fee1b8dc9fd815c4c8192fe9dae789a
Parents: 02ca419
Author: Alexey Serbin <as...@cloudera.com>
Authored: Tue Apr 11 10:10:35 2017 -0700
Committer: Alexey Serbin <as...@cloudera.com>
Committed: Tue Apr 11 21:20:29 2017 +0000

----------------------------------------------------------------------
 src/kudu/client/client-test.cc | 82 ++++++++++++++++++++++---------------
 1 file changed, 50 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kudu/blob/da75b66d/src/kudu/client/client-test.cc
----------------------------------------------------------------------
diff --git a/src/kudu/client/client-test.cc b/src/kudu/client/client-test.cc
index 2159090..1fdd75d 100644
--- a/src/kudu/client/client-test.cc
+++ b/src/kudu/client/client-test.cc
@@ -2507,49 +2507,67 @@ TEST_F(ClientTest, TestSessionMutationBufferMaxNum) {
   }
 }
 
+enum class RowSize {
+  CONSTANT,
+  RANDOM,
+};
+
+class FlushModeOpRatesTest : public ClientTest,
+                             public ::testing::WithParamInterface<RowSize> {
+};
+
 // A test scenario to compare rate of submission of small write operations
 // in AUTO_FLUSH and AUTO_FLUSH_BACKGROUND mode; all the operations have
 // the same pre-defined size.
-TEST_F(ClientTest, TestFlushModesCompareOpRatesFixedSize) {
-  const size_t kBufferSizeBytes = 1024;
-  const size_t kRowNum = 256;
-
-  vector<size_t> str_sizes(kRowNum, kBufferSizeBytes / 128);
-  CpuTimes t_afb;
-  TimeInsertOpBatch(KuduSession::AUTO_FLUSH_BACKGROUND,
-                    kBufferSizeBytes, 0, 2, str_sizes,
-                    &t_afb);
-  CpuTimes t_afs;
-  TimeInsertOpBatch(KuduSession::AUTO_FLUSH_SYNC,
-                    kBufferSizeBytes, 1, 2, str_sizes,
-                    &t_afs);
-  // AUTO_FLUSH_BACKGROUND should be faster than AUTO_FLUSH_SYNC.
-  EXPECT_GT(t_afs.wall, t_afb.wall);
-}
+TEST_P(FlushModeOpRatesTest, RunComparison) {
+  if (!AllowSlowTests()) {
+    LOG(WARNING) << "test is skipped; set KUDU_ALLOW_SLOW_TESTS=1 to run";
+    return;
+  }
 
-// A test scenario to compare rate of submission of small write operations
-// in AUTO_FLUSH and AUTO_FLUSH_BACKGROUND mode with operations of random size.
-TEST_F(ClientTest, TestFlushModesCompareOpRatesRandomSize) {
   const size_t kBufferSizeBytes = 1024;
   const size_t kRowNum = 256;
 
-  SeedRandom();
   vector<size_t> str_sizes(kRowNum);
-  for (size_t i = 0; i < kRowNum; ++i) {
-    str_sizes[i] = rand() % (kBufferSizeBytes / 128);
-  }
-  CpuTimes t_afb;
-  TimeInsertOpBatch(KuduSession::AUTO_FLUSH_BACKGROUND,
-                    kBufferSizeBytes, 0, 2, str_sizes,
-                    &t_afb);
-  CpuTimes t_afs;
-  TimeInsertOpBatch(KuduSession::AUTO_FLUSH_SYNC,
-                    kBufferSizeBytes, 1, 2, str_sizes,
-                    &t_afs);
+  const RowSize mode = GetParam();
+  switch (mode) {
+    case RowSize::CONSTANT:
+      std::fill(str_sizes.begin(), str_sizes.end(), kBufferSizeBytes / 128);
+      break;
+
+    case RowSize::RANDOM:
+      SeedRandom();
+      std::generate(str_sizes.begin(), str_sizes.end(),
+                    [] { return rand() % (kBufferSizeBytes / 128); });
+      break;
+  }
+
+  // Run the scenario multiple times to factor out fluctuations of multi-tasking
+  // run-time environment and avoid test flakiness.
+  uint64_t t_afb_wall = 0;
+  uint64_t t_afs_wall = 0;
+  const size_t iter_num = 16;
+  for (size_t i = 0; i < iter_num; ++i) {
+    CpuTimes t_afb;
+    TimeInsertOpBatch(KuduSession::AUTO_FLUSH_BACKGROUND,
+                      kBufferSizeBytes, 2 * i, 2 * iter_num, str_sizes,
+                      &t_afb);
+    t_afb_wall += t_afb.wall;
+
+    CpuTimes t_afs;
+    TimeInsertOpBatch(KuduSession::AUTO_FLUSH_SYNC,
+                      kBufferSizeBytes, 2 * i + 1, 2 * iter_num, str_sizes,
+                      &t_afs);
+    t_afs_wall += t_afs.wall;
+  }
   // AUTO_FLUSH_BACKGROUND should be faster than AUTO_FLUSH_SYNC.
-  EXPECT_GT(t_afs.wall, t_afb.wall);
+  EXPECT_GT(t_afs_wall, t_afb_wall);
 }
 
+INSTANTIATE_TEST_CASE_P(,
+                        FlushModeOpRatesTest,
+                        ::testing::Values(RowSize::CONSTANT, RowSize::RANDOM));
+
 // A test to verify that it's safe to perform synchronous and/or asynchronous
 // flush while having the auto-flusher thread running in the background.
 TEST_F(ClientTest, TestAutoFlushBackgroundAndExplicitFlush) {