| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | //  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.//  This source code is licensed under both the GPLv2 (found in the//  COPYING file in the root directory) and Apache 2.0 License//  (found in the LICENSE.Apache file in the root 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_NAMESPACE {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_NAMESPACE::CreateDBStatistics();  options.statistics->set_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_NAMESPACE::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_NAMESPACE::CreateDBStatistics();  options.statistics->set_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);}TEST_F(DBStatisticsTest, ResetStats) {  Options options = CurrentOptions();  options.create_if_missing = true;  options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();  DestroyAndReopen(options);  for (int i = 0; i < 2; ++i) {    // pick arbitrary ticker and histogram. On first iteration they're zero    // because db is unused. On second iteration they're zero due to Reset().    ASSERT_EQ(0, TestGetTickerCount(options, NUMBER_KEYS_WRITTEN));    HistogramData histogram_data;    options.statistics->histogramData(DB_WRITE, &histogram_data);    ASSERT_EQ(0.0, histogram_data.max);    if (i == 0) {      // The Put() makes some of the ticker/histogram stats nonzero until we      // Reset().      ASSERT_OK(Put("hello", "rocksdb"));      ASSERT_EQ(1, TestGetTickerCount(options, NUMBER_KEYS_WRITTEN));      options.statistics->histogramData(DB_WRITE, &histogram_data);      ASSERT_GT(histogram_data.max, 0.0);      options.statistics->Reset();    }  }}}  // namespace ROCKSDB_NAMESPACEint main(int argc, char** argv) {  ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();  ::testing::InitGoogleTest(&argc, argv);  return RUN_ALL_TESTS();}
 |