Summary: I'm going to add more DB tests for statistics as currently we have very few. I started a file dedicated to this purpose and moved the existing stats-specific tests there. Closes https://github.com/facebook/rocksdb/pull/2211 Differential Revision: D4951558 Pulled By: ajkr fbshipit-source-id: 05d11c35079c40ecabdfd2cf5556ccb761f694a4main
parent
7eddecce12
commit
f6a27d0bce
@ -0,0 +1,124 @@ |
||||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under the BSD-style license found in the
|
||||
// LICENSE file in the root directory of this source tree. An additional grant
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
|
||||
#include <string> |
||||
|
||||
#include "db/db_test_util.h" |
||||
#include "monitoring/thread_status_util.h" |
||||
#include "port/stack_trace.h" |
||||
#include "rocksdb/statistics.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
class DBStatisticsTest : public DBTestBase { |
||||
public: |
||||
DBStatisticsTest() : DBTestBase("/db_statistics_test") {} |
||||
}; |
||||
|
||||
TEST_F(DBStatisticsTest, CompressionStatsTest) { |
||||
CompressionType type; |
||||
|
||||
if (Snappy_Supported()) { |
||||
type = kSnappyCompression; |
||||
fprintf(stderr, "using snappy\n"); |
||||
} else if (Zlib_Supported()) { |
||||
type = kZlibCompression; |
||||
fprintf(stderr, "using zlib\n"); |
||||
} else if (BZip2_Supported()) { |
||||
type = kBZip2Compression; |
||||
fprintf(stderr, "using bzip2\n"); |
||||
} else if (LZ4_Supported()) { |
||||
type = kLZ4Compression; |
||||
fprintf(stderr, "using lz4\n"); |
||||
} else if (XPRESS_Supported()) { |
||||
type = kXpressCompression; |
||||
fprintf(stderr, "using xpress\n"); |
||||
} else if (ZSTD_Supported()) { |
||||
type = kZSTD; |
||||
fprintf(stderr, "using ZSTD\n"); |
||||
} else { |
||||
fprintf(stderr, "skipping test, compression disabled\n"); |
||||
return; |
||||
} |
||||
|
||||
Options options = CurrentOptions(); |
||||
options.compression = type; |
||||
options.statistics = rocksdb::CreateDBStatistics(); |
||||
options.statistics->stats_level_ = StatsLevel::kExceptTimeForMutex; |
||||
DestroyAndReopen(options); |
||||
|
||||
int kNumKeysWritten = 100000; |
||||
|
||||
// Check that compressions occur and are counted when compression is turned on
|
||||
Random rnd(301); |
||||
for (int i = 0; i < kNumKeysWritten; ++i) { |
||||
// compressible string
|
||||
ASSERT_OK(Put(Key(i), RandomString(&rnd, 128) + std::string(128, 'a'))); |
||||
} |
||||
ASSERT_OK(Flush()); |
||||
ASSERT_GT(options.statistics->getTickerCount(NUMBER_BLOCK_COMPRESSED), 0); |
||||
|
||||
for (int i = 0; i < kNumKeysWritten; ++i) { |
||||
auto r = Get(Key(i)); |
||||
} |
||||
ASSERT_GT(options.statistics->getTickerCount(NUMBER_BLOCK_DECOMPRESSED), 0); |
||||
|
||||
options.compression = kNoCompression; |
||||
DestroyAndReopen(options); |
||||
uint64_t currentCompressions = |
||||
options.statistics->getTickerCount(NUMBER_BLOCK_COMPRESSED); |
||||
uint64_t currentDecompressions = |
||||
options.statistics->getTickerCount(NUMBER_BLOCK_DECOMPRESSED); |
||||
|
||||
// Check that compressions do not occur when turned off
|
||||
for (int i = 0; i < kNumKeysWritten; ++i) { |
||||
// compressible string
|
||||
ASSERT_OK(Put(Key(i), RandomString(&rnd, 128) + std::string(128, 'a'))); |
||||
} |
||||
ASSERT_OK(Flush()); |
||||
ASSERT_EQ(options.statistics->getTickerCount(NUMBER_BLOCK_COMPRESSED) |
||||
- currentCompressions, 0); |
||||
|
||||
for (int i = 0; i < kNumKeysWritten; ++i) { |
||||
auto r = Get(Key(i)); |
||||
} |
||||
ASSERT_EQ(options.statistics->getTickerCount(NUMBER_BLOCK_DECOMPRESSED) |
||||
- currentDecompressions, 0); |
||||
} |
||||
|
||||
TEST_F(DBStatisticsTest, MutexWaitStatsDisabledByDefault) { |
||||
Options options = CurrentOptions(); |
||||
options.create_if_missing = true; |
||||
options.statistics = rocksdb::CreateDBStatistics(); |
||||
CreateAndReopenWithCF({"pikachu"}, options); |
||||
const uint64_t kMutexWaitDelay = 100; |
||||
ThreadStatusUtil::TEST_SetStateDelay(ThreadStatus::STATE_MUTEX_WAIT, |
||||
kMutexWaitDelay); |
||||
ASSERT_OK(Put("hello", "rocksdb")); |
||||
ASSERT_EQ(TestGetTickerCount(options, DB_MUTEX_WAIT_MICROS), 0); |
||||
ThreadStatusUtil::TEST_SetStateDelay(ThreadStatus::STATE_MUTEX_WAIT, 0); |
||||
} |
||||
|
||||
TEST_F(DBStatisticsTest, MutexWaitStats) { |
||||
Options options = CurrentOptions(); |
||||
options.create_if_missing = true; |
||||
options.statistics = rocksdb::CreateDBStatistics(); |
||||
options.statistics->stats_level_ = StatsLevel::kAll; |
||||
CreateAndReopenWithCF({"pikachu"}, options); |
||||
const uint64_t kMutexWaitDelay = 100; |
||||
ThreadStatusUtil::TEST_SetStateDelay(ThreadStatus::STATE_MUTEX_WAIT, |
||||
kMutexWaitDelay); |
||||
ASSERT_OK(Put("hello", "rocksdb")); |
||||
ASSERT_GE(TestGetTickerCount(options, DB_MUTEX_WAIT_MICROS), kMutexWaitDelay); |
||||
ThreadStatusUtil::TEST_SetStateDelay(ThreadStatus::STATE_MUTEX_WAIT, 0); |
||||
} |
||||
|
||||
} // namespace rocksdb
|
||||
|
||||
int main(int argc, char** argv) { |
||||
rocksdb::port::InstallStackTraceHandler(); |
||||
::testing::InitGoogleTest(&argc, argv); |
||||
return RUN_ALL_TESTS(); |
||||
} |
Loading…
Reference in new issue