[Test Code]: Run basic backfill unit test for persistent bucket as well 40/77340/4
authorManu Dhundi <manu@couchbase.com>
Wed, 26 Apr 2017 17:05:39 +0000 (10:05 -0700)
committerDave Rigby <daver@couchbase.com>
Wed, 26 Apr 2017 17:51:52 +0000 (17:51 +0000)
The test code was trying to run flush vbucket for persistent buckets
while a flusher task was already running and hence resulting in a
temp fail of flusher.

This has been fixed by not running the flusher by explicit call.
Rather the test waits for the flusher to complete.

Change-Id: Ic77cdb518aae388baa24187ee2cf588c6bb1a609
Reviewed-on: http://review.couchbase.org/77340
Tested-by: Build Bot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>
tests/module_tests/dcp_test.cc
tests/module_tests/test_helpers.cc
tests/module_tests/test_helpers.h

index 65b2227..875884b 100644 (file)
@@ -412,17 +412,14 @@ TEST_P(StreamTest, BackfillOnly) {
     auto& ckpt_mgr = vb0->checkpointManager;
     ckpt_mgr.createNewCheckpoint();
 
-    /* Flush all items to the disk for a persistent bucket */
-    if (bucketType == "persistent") {
-        // EXPECT_EQ(1, engine->getKVBucket()->flushVBucket(vbid));
-        setup_dcp_stream(); // [TODO]: Check why TearDown() crashes without this
-        return; // [TODO]: Debug why flushVBucket does not work
-    }
-
-    /* Remove the old checkpoint */
+    /* Wait for removal of the old checkpoint, this also would imply that the
+       items are persisted (in case of persistent buckets) */
     bool new_ckpt_created;
-    EXPECT_EQ(numItems,
-              ckpt_mgr.removeClosedUnrefCheckpoints(*vb0, new_ckpt_created));
+    std::chrono::microseconds uSleepTime(128);
+    while (static_cast<size_t>(numItems) !=
+           ckpt_mgr.removeClosedUnrefCheckpoints(*vb0, new_ckpt_created)) {
+        uSleepTime = decayingSleep(uSleepTime);
+    }
 
     /* Set up a DCP stream for the backfill */
     setup_dcp_stream();
@@ -434,8 +431,9 @@ TEST_P(StreamTest, BackfillOnly) {
     mock_stream->transitionStateToBackfilling();
 
     /* Wait for the backfill task to complete */
+    std::chrono::microseconds uSleepTime2(128);
     while (numItems != mock_stream->getLastReadSeqno()) {
-        usleep(10);
+        uSleepTime2 = decayingSleep(uSleepTime2);
     }
 
     /* Verify that all items are read in the backfill */
index cf51357..954f831 100644 (file)
@@ -17,6 +17,8 @@
 
 #include "test_helpers.h"
 
+#include <thread>
+
 Item make_item(uint16_t vbid,
                const StoredDocKey& key,
                const std::string& value,
@@ -28,3 +30,10 @@ Item make_item(uint16_t vbid,
     item.setVBucketId(vbid);
     return item;
 }
+
+std::chrono::microseconds decayingSleep(std::chrono::microseconds uSeconds) {
+    /* Max sleep time is slightly over a second */
+    static const std::chrono::microseconds maxSleepTime(0x1 << 20);
+    std::this_thread::sleep_for(uSeconds);
+    return std::min(uSeconds * 2, maxSleepTime);
+}
index 06f3435..07df2e6 100644 (file)
@@ -26,6 +26,8 @@
 #include "item.h"
 #include "programs/engine_testapp/mock_server.h"
 
+#include <chrono>
+
 /// Creates an item with the given vbucket id, key and value.
 Item make_item(
         uint16_t vbid,
@@ -68,3 +70,14 @@ private:
     // Amount of time travel.
     int by;
 };
+
+/**
+ * Function to do an exponentially increasing, but max bounded, sleep.
+ * To do exponentially increasing sleep, must be called first with the starting
+ * sleep time and subsequently with the sleep time returned in the previous call
+ *
+ * @param uSeconds Desired sleep time in micro seconds
+ *
+ * @return indicates the next sleep time (doubled from the current value)
+ */
+std::chrono::microseconds decayingSleep(std::chrono::microseconds uSeconds);