Deflake DBTest.L0L1L2AndUpHitCounter (#8259)

Summary:
Previously we saw flakes on platforms like arm on CircleCI, such as the following:

```
Note: Google Test filter = DBTest.L0L1L2AndUpHitCounter
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from DBTest
[ RUN      ] DBTest.L0L1L2AndUpHitCounter
db/db_test.cc:5345: Failure
Expected: (TestGetTickerCount(options, GET_HIT_L0)) > (100), actual: 30 vs 100
[  FAILED  ] DBTest.L0L1L2AndUpHitCounter (150 ms)
[----------] 1 test from DBTest (150 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (150 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] DBTest.L0L1L2AndUpHitCounter
```

The test was totally non-deterministic, e.g., flush/compaction timing would affect how many files on each level. Furthermore, it depended heavily on platform-specific details, e.g., by having a 32KB memtable, it could become full with a very different number of entries depending on the platform.

This PR rewrites the test to build a deterministic LSM with one file per level.

Pull Request resolved: https://github.com/facebook/rocksdb/pull/8259

Reviewed By: mrambacher

Differential Revision: D28178100

Pulled By: ajkr

fbshipit-source-id: 0a03b26e8d23c29d8297c1bccb1b115dce33bdcd
main
Andrew Kryczka 4 years ago committed by Facebook GitHub Bot
parent 8a92564a82
commit c2a3424de5
  1. 48
      db/db_test.cc

@ -5314,39 +5314,43 @@ TEST_F(DBTest, DynamicMiscOptions) {
#endif // ROCKSDB_LITE #endif // ROCKSDB_LITE
TEST_F(DBTest, L0L1L2AndUpHitCounter) { TEST_F(DBTest, L0L1L2AndUpHitCounter) {
const int kNumLevels = 3;
const int kNumKeysPerLevel = 10000;
const int kNumKeysPerDb = kNumLevels * kNumKeysPerLevel;
Options options = CurrentOptions(); Options options = CurrentOptions();
options.write_buffer_size = 32 * 1024;
options.target_file_size_base = 32 * 1024;
options.level0_file_num_compaction_trigger = 2;
options.level0_slowdown_writes_trigger = 2;
options.level0_stop_writes_trigger = 4;
options.max_bytes_for_level_base = 64 * 1024;
options.max_write_buffer_number = 2;
options.max_background_compactions = 8;
options.max_background_flushes = 8;
options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics(); options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
CreateAndReopenWithCF({"mypikachu"}, options); Reopen(options);
int numkeys = 20000; // After the below loop there will be one file on each of L0, L1, and L2.
for (int i = 0; i < numkeys; i++) { int key = 0;
ASSERT_OK(Put(1, Key(i), "val")); for (int output_level = kNumLevels - 1; output_level >= 0; --output_level) {
for (int i = 0; i < kNumKeysPerLevel; ++i) {
ASSERT_OK(Put(Key(key), "val"));
key++;
} }
ASSERT_OK(Flush());
for (int input_level = 0; input_level < output_level; ++input_level) {
// `TEST_CompactRange(input_level, ...)` compacts from `input_level` to
// `input_level + 1`.
ASSERT_OK(dbfull()->TEST_CompactRange(input_level, nullptr, nullptr));
}
}
assert(key == kNumKeysPerDb);
ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L0)); ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L0));
ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L1)); ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L1));
ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L2_AND_UP)); ASSERT_EQ(0, TestGetTickerCount(options, GET_HIT_L2_AND_UP));
ASSERT_OK(Flush(1)); for (int i = 0; i < kNumKeysPerDb; i++) {
dbfull()->TEST_WaitForCompact(); ASSERT_EQ(Get(Key(i)), "val");
for (int i = 0; i < numkeys; i++) {
ASSERT_EQ(Get(1, Key(i)), "val");
} }
ASSERT_GT(TestGetTickerCount(options, GET_HIT_L0), 100); ASSERT_EQ(kNumKeysPerLevel, TestGetTickerCount(options, GET_HIT_L0));
ASSERT_GT(TestGetTickerCount(options, GET_HIT_L1), 100); ASSERT_EQ(kNumKeysPerLevel, TestGetTickerCount(options, GET_HIT_L1));
ASSERT_GT(TestGetTickerCount(options, GET_HIT_L2_AND_UP), 100); ASSERT_EQ(kNumKeysPerLevel, TestGetTickerCount(options, GET_HIT_L2_AND_UP));
ASSERT_EQ(numkeys, TestGetTickerCount(options, GET_HIT_L0) + ASSERT_EQ(kNumKeysPerDb, TestGetTickerCount(options, GET_HIT_L0) +
TestGetTickerCount(options, GET_HIT_L1) + TestGetTickerCount(options, GET_HIT_L1) +
TestGetTickerCount(options, GET_HIT_L2_AND_UP)); TestGetTickerCount(options, GET_HIT_L2_AND_UP));
} }

Loading…
Cancel
Save