YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/docdb/docdb_rocksdb_util-test.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#include "yb/docdb/docdb_rocksdb_util.h"
15
#include "yb/rocksdb/table.h"
16
17
#include "yb/util/result.h"
18
#include "yb/util/test_util.h"
19
20
DECLARE_int32(num_cpus);
21
DECLARE_int32(rocksdb_max_background_flushes);
22
DECLARE_bool(rocksdb_disable_compactions);
23
DECLARE_int32(rocksdb_base_background_compactions);
24
DECLARE_int32(rocksdb_max_background_compactions);
25
DECLARE_int32(priority_thread_pool_size);
26
DECLARE_int32(block_restart_interval);
27
DECLARE_int64(rocksdb_compact_flush_rate_limit_bytes_per_sec);
28
DECLARE_string(rocksdb_compact_flush_rate_limit_sharing_mode);
29
30
namespace yb {
31
namespace docdb {
32
33
class DocDBRocksDBUtilTest : public YBTest {};
34
35
0
TEST_F(DocDBRocksDBUtilTest, MaxBackgroundFlushesDefault) {
36
0
  FLAGS_num_cpus = 16;
37
0
  auto options = TEST_AutoInitFromRocksDBFlags();
38
0
  CHECK_EQ(options.max_background_flushes, 3);
39
0
}
40
41
0
TEST_F(DocDBRocksDBUtilTest, MaxBackgroundFlushesDefaultLimit) {
42
0
  FLAGS_num_cpus = 32;
43
0
  auto options = TEST_AutoInitFromRocksDBFlags();
44
0
  CHECK_EQ(options.max_background_flushes, 4);
45
0
}
46
47
0
TEST_F(DocDBRocksDBUtilTest, MaxBackgroundFlushesCompactionsDisabled) {
48
0
  FLAGS_rocksdb_max_background_flushes = 10;
49
0
  FLAGS_rocksdb_disable_compactions = true;
50
0
  auto options = TEST_AutoInitFromRocksDBFlags();
51
0
  CHECK_EQ(options.max_background_flushes, 10);
52
0
}
53
54
0
TEST_F(DocDBRocksDBUtilTest, BaseBackgroundCompactionsDefault) {
55
0
  FLAGS_rocksdb_max_background_compactions = 10;
56
0
  auto options = TEST_AutoInitFromRocksDBFlags();
57
0
  CHECK_EQ(options.base_background_compactions, 10);
58
0
}
59
60
0
TEST_F(DocDBRocksDBUtilTest, BaseBackgroundCompactionsDisabled) {
61
0
  FLAGS_rocksdb_disable_compactions = true;
62
0
  auto options = TEST_AutoInitFromRocksDBFlags();
63
0
  CHECK_EQ(options.base_background_compactions, -1);
64
0
}
65
66
0
TEST_F(DocDBRocksDBUtilTest, BaseBackgroundCompactionsExplicit) {
67
0
  FLAGS_rocksdb_base_background_compactions = 23;
68
0
  auto options = TEST_AutoInitFromRocksDBFlags();
69
0
  CHECK_EQ(options.base_background_compactions, 23);
70
0
}
71
72
0
TEST_F(DocDBRocksDBUtilTest, MaxBackgroundCompactionsDefault) {
73
0
  FLAGS_num_cpus = 12;
74
0
  auto options = TEST_AutoInitFromRocksDBFlags();
75
0
  CHECK_EQ(options.max_background_compactions, 3);
76
0
}
77
78
0
TEST_F(DocDBRocksDBUtilTest, MaxBackgroundCompactionsDisabled) {
79
0
  FLAGS_rocksdb_disable_compactions = true;
80
0
  auto options = TEST_AutoInitFromRocksDBFlags();
81
0
  CHECK_EQ(options.max_background_compactions, 1);
82
0
}
83
84
0
TEST_F(DocDBRocksDBUtilTest, MaxBackgroundCompactionsExplicit) {
85
0
  FLAGS_rocksdb_max_background_compactions = 23;
86
0
  auto options = TEST_AutoInitFromRocksDBFlags();
87
0
  CHECK_EQ(options.max_background_compactions, 23);
88
0
}
89
90
0
TEST_F(DocDBRocksDBUtilTest, PriorityThreadPoolSizeDefaultLowCpus) {
91
0
  FLAGS_num_cpus = 3;
92
0
  CHECK_EQ(GetGlobalRocksDBPriorityThreadPoolSize(), 1);
93
0
}
94
95
0
TEST_F(DocDBRocksDBUtilTest, PriorityThreadPoolSizeDefaultFewCpus) {
96
0
  FLAGS_num_cpus = 5;
97
0
  CHECK_EQ(GetGlobalRocksDBPriorityThreadPoolSize(), 2);
98
0
}
99
100
0
TEST_F(DocDBRocksDBUtilTest, PriorityThreadPoolSizeDefaultManyCpus) {
101
0
  FLAGS_num_cpus = 10;
102
0
  CHECK_EQ(GetGlobalRocksDBPriorityThreadPoolSize(), 4);
103
0
}
104
105
0
TEST_F(DocDBRocksDBUtilTest, PriorityThreadPoolSizeTakesExplicitSetting) {
106
0
  FLAGS_priority_thread_pool_size = 16;
107
0
  CHECK_EQ(GetGlobalRocksDBPriorityThreadPoolSize(), 16);
108
0
}
109
110
0
TEST_F(DocDBRocksDBUtilTest, PriorityThreadPoolSizeTakesMaxBackgroundCompaction) {
111
0
  FLAGS_rocksdb_max_background_compactions = 4;
112
0
  CHECK_EQ(GetGlobalRocksDBPriorityThreadPoolSize(), 4);
113
0
}
114
115
0
TEST_F(DocDBRocksDBUtilTest, PriorityThreadPoolSizeCompactionDisabled) {
116
0
  FLAGS_rocksdb_disable_compactions = true;
117
0
  CHECK_EQ(GetGlobalRocksDBPriorityThreadPoolSize(), 1);
118
0
}
119
120
0
TEST_F(DocDBRocksDBUtilTest, MinBlockRestartInterval) {
121
0
  FLAGS_block_restart_interval = 0;
122
0
  auto blockBasedOptions = TEST_AutoInitFromRocksDbTableFlags();
123
0
  CHECK_EQ(blockBasedOptions.block_restart_interval, 16);
124
0
}
125
126
0
TEST_F(DocDBRocksDBUtilTest, MaxBlockRestartInterval) {
127
0
  FLAGS_block_restart_interval = 512;
128
0
  auto blockBasedOptions = TEST_AutoInitFromRocksDbTableFlags();
129
0
  CHECK_EQ(blockBasedOptions.block_restart_interval, 256);
130
0
}
131
132
0
TEST_F(DocDBRocksDBUtilTest, ValidBlockRestartInterval) {
133
0
  FLAGS_block_restart_interval = 8;
134
0
  auto blockBasedOptions = TEST_AutoInitFromRocksDbTableFlags();
135
0
  CHECK_EQ(blockBasedOptions.block_restart_interval, 8);
136
0
}
137
138
0
TEST_F(DocDBRocksDBUtilTest, DefaultBlockRestartInterval) {
139
0
  auto blockBasedOptions = TEST_AutoInitFromRocksDbTableFlags();
140
0
  CHECK_EQ(blockBasedOptions.block_restart_interval, 16);
141
0
}
142
143
0
TEST_F(DocDBRocksDBUtilTest, RocksDBRateLimiter) {
144
  // Check `ParseEnumInsensitive<RateLimiterSharingMode>`
145
0
  {
146
0
    using Ret = Result<RateLimiterSharingMode>;
147
0
    using State = std::tuple<std::string, Ret>;
148
0
    State states[] {
149
0
      std::make_tuple(ToString(RateLimiterSharingMode::NONE),
150
0
                      Ret(RateLimiterSharingMode::NONE)),
151
0
      std::make_tuple(ToString(RateLimiterSharingMode::TSERVER),
152
0
                      Ret(RateLimiterSharingMode::TSERVER)),
153
0
      std::make_tuple("none", Ret(RateLimiterSharingMode::NONE)),
154
0
      std::make_tuple("nOnE", Ret(RateLimiterSharingMode::NONE)),
155
0
      std::make_tuple("tserver", Ret(RateLimiterSharingMode::TSERVER)),
156
0
      std::make_tuple("TServeR", Ret(RateLimiterSharingMode::TSERVER)),
157
0
      std::make_tuple("",
158
0
                      Ret(STATUS(InvalidArgument,
159
0
                                 "yb::docdb::RateLimiterSharingMode invalid value: "))),
160
0
      std::make_tuple("none-",
161
0
                      Ret(STATUS(InvalidArgument,
162
0
                                 "yb::docdb::RateLimiterSharingMode invalid value: none-"))),
163
0
      std::make_tuple("t_server",
164
0
                      Ret(STATUS(InvalidArgument,
165
0
                                 "yb::docdb::RateLimiterSharingMode invalid value: t_server")))
166
0
    };
167
168
0
    for (const auto& s : states) {
169
0
      auto pr = ParseEnumInsensitive<RateLimiterSharingMode>(std::get<std::string>(s));
170
0
      ASSERT_EQ(pr.ok(), std::get<Ret>(s).ok());
171
0
      if (pr.ok()) {
172
0
        ASSERT_EQ(*pr, *std::get<Ret>(s));
173
0
      } else {
174
0
        ASSERT_EQ(pr.status().ToString(false, true),
175
0
                  std::get<Ret>(s).status().ToString(false, true));
176
0
      }
177
0
    }
178
0
  }
179
180
  // Check `GetRocksDBRateLimiterSharingMode`
181
0
  {
182
0
    for (auto mode : kRateLimiterSharingModeList) {
183
0
      ANNOTATE_UNPROTECTED_WRITE(FLAGS_rocksdb_compact_flush_rate_limit_sharing_mode) =
184
0
          ToString(mode);
185
0
      ASSERT_EQ(mode, GetRocksDBRateLimiterSharingMode());
186
0
    }
187
188
    // Check zero bps case
189
0
    ANNOTATE_UNPROTECTED_WRITE(FLAGS_rocksdb_compact_flush_rate_limit_bytes_per_sec) = 0;
190
0
    auto util_limiter = CreateRocksDBRateLimiter();
191
0
    ASSERT_EQ(util_limiter.get(), nullptr);
192
193
    // Check non-zero case, should be same to direct call to `rocksdb::NewGenericRateLimiter`
194
0
    constexpr int64_t kBPS = 64_MB;
195
0
    ANNOTATE_UNPROTECTED_WRITE(FLAGS_rocksdb_compact_flush_rate_limit_bytes_per_sec) = kBPS;
196
0
    std::shared_ptr<rocksdb::RateLimiter> raw_limiter(rocksdb::NewGenericRateLimiter(kBPS));
197
0
    ASSERT_NOTNULL(raw_limiter.get());
198
0
    util_limiter = CreateRocksDBRateLimiter();
199
0
    ASSERT_NOTNULL(util_limiter.get());
200
0
    ASSERT_EQ(util_limiter->GetSingleBurstBytes(), raw_limiter->GetSingleBurstBytes());
201
202
    // Decrease bytes per sec
203
0
    constexpr auto kFactor = 2;
204
0
    ANNOTATE_UNPROTECTED_WRITE(FLAGS_rocksdb_compact_flush_rate_limit_bytes_per_sec)
205
0
      = kBPS / kFactor;
206
0
    ASSERT_NOTNULL(raw_limiter.get());
207
0
    util_limiter = CreateRocksDBRateLimiter();
208
0
    ASSERT_NOTNULL(util_limiter.get());
209
0
    ASSERT_EQ(util_limiter->GetSingleBurstBytes(), raw_limiter->GetSingleBurstBytes() / kFactor);
210
0
  }
211
0
}
212
213
}  // namespace docdb
214
}  // namespace yb