YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/rocksdb/db/write_controller_test.cc
Line
Count
Source
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under the BSD-style license found in the
3
//  LICENSE file in the root directory of this source tree. An additional grant
4
//  of patent rights can be found in the PATENTS file in the same directory.
5
//
6
// The following only applies to changes made to this file as part of YugaByte development.
7
//
8
// Portions Copyright (c) YugaByte, Inc.
9
//
10
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
11
// in compliance with the License.  You may obtain a copy of the License at
12
//
13
// http://www.apache.org/licenses/LICENSE-2.0
14
//
15
// Unless required by applicable law or agreed to in writing, software distributed under the License
16
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
17
// or implied.  See the License for the specific language governing permissions and limitations
18
// under the License.
19
//
20
#include <string>
21
22
#include <gtest/gtest.h>
23
24
#include "yb/rocksdb/db/write_controller.h"
25
26
#include "yb/rocksdb/env.h"
27
28
#include "yb/rocksdb/util/testutil.h"
29
30
namespace rocksdb {
31
32
class WriteControllerTest : public RocksDBTest {};
33
34
class TimeSetEnv : public EnvWrapper {
35
 public:
36
2
  TimeSetEnv() : EnvWrapper(nullptr) {}
37
  uint64_t now_micros_ = 6666;
38
13
  uint64_t NowMicros() override { return now_micros_; }
39
};
40
41
1
TEST_F(WriteControllerTest, ChangeDelayRateTest) {
42
1
  TimeSetEnv env;
43
1
  WriteController controller(10000000u);
44
1
  auto delay_token_0 =
45
1
      controller.GetDelayToken(controller.delayed_write_rate());
46
1
  ASSERT_EQ(static_cast<uint64_t>(2000000),
47
1
            controller.GetDelay(&env, 20000000u));
48
1
  auto delay_token_1 = controller.GetDelayToken(2000000u);
49
1
  ASSERT_EQ(static_cast<uint64_t>(10000000),
50
1
            controller.GetDelay(&env, 20000000u));
51
1
  auto delay_token_2 = controller.GetDelayToken(1000000u);
52
1
  ASSERT_EQ(static_cast<uint64_t>(20000000),
53
1
            controller.GetDelay(&env, 20000000u));
54
1
  auto delay_token_3 = controller.GetDelayToken(20000000u);
55
1
  ASSERT_EQ(static_cast<uint64_t>(1000000),
56
1
            controller.GetDelay(&env, 20000000u));
57
1
  auto delay_token_4 =
58
1
      controller.GetDelayToken(controller.delayed_write_rate() * 2);
59
1
  ASSERT_EQ(static_cast<uint64_t>(500000),
60
1
            controller.GetDelay(&env, 20000000u));
61
1
}
62
63
1
TEST_F(WriteControllerTest, SanityTest) {
64
1
  WriteController controller(10000000u);
65
1
  auto stop_token_1 = controller.GetStopToken();
66
1
  auto stop_token_2 = controller.GetStopToken();
67
68
1
  ASSERT_TRUE(controller.IsStopped());
69
1
  stop_token_1.reset();
70
1
  ASSERT_TRUE(controller.IsStopped());
71
1
  stop_token_2.reset();
72
1
  ASSERT_FALSE(controller.IsStopped());
73
74
1
  TimeSetEnv env;
75
76
1
  auto delay_token_1 = controller.GetDelayToken(10000000u);
77
1
  ASSERT_EQ(static_cast<uint64_t>(2000000),
78
1
            controller.GetDelay(&env, 20000000u));
79
80
1
  env.now_micros_ += 1999900u;  // sleep debt 1000
81
82
1
  auto delay_token_2 = controller.GetDelayToken(10000000u);
83
  // Rate reset after changing the token.
84
1
  ASSERT_EQ(static_cast<uint64_t>(2000000),
85
1
            controller.GetDelay(&env, 20000000u));
86
87
1
  env.now_micros_ += 1999900u;  // sleep debt 1000
88
89
  // One refill: 10240 bytes allowed, 1000 used, 9240 left
90
1
  ASSERT_EQ(static_cast<uint64_t>(1124), controller.GetDelay(&env, 1000u));
91
1
  env.now_micros_ += 1124u;  // sleep debt 0
92
93
1
  delay_token_2.reset();
94
  // 1000 used, 8240 left
95
1
  ASSERT_EQ(static_cast<uint64_t>(0), controller.GetDelay(&env, 1000u));
96
97
1
  env.now_micros_ += 100u;  // sleep credit 100
98
  // 1000 used, 7240 left
99
1
  ASSERT_EQ(static_cast<uint64_t>(0), controller.GetDelay(&env, 1000u));
100
101
1
  env.now_micros_ += 100u;  // sleep credit 200
102
  // One refill: 10240 fileed, sleep credit generates 2000. 8000 used
103
  //             7240 + 10240 + 2000 - 8000 = 11480 left
104
1
  ASSERT_EQ(static_cast<uint64_t>(1024u), controller.GetDelay(&env, 8000u));
105
106
1
  env.now_micros_ += 200u;  // sleep debt 824
107
  // 1000 used, 10480 left.
108
1
  ASSERT_EQ(static_cast<uint64_t>(0), controller.GetDelay(&env, 1000u));
109
110
1
  env.now_micros_ += 200u;  // sleep debt 624
111
  // Out of bound sleep, still 10480 left
112
1
  ASSERT_EQ(static_cast<uint64_t>(3000624u),
113
1
            controller.GetDelay(&env, 30000000u));
114
115
1
  env.now_micros_ += 3000724u;  // sleep credit 100
116
  // 6000 used, 4480 left.
117
1
  ASSERT_EQ(static_cast<uint64_t>(0), controller.GetDelay(&env, 6000u));
118
119
1
  env.now_micros_ += 200u;  // sleep credit 300
120
  // One refill, credit 4480 balance + 3000 credit + 10240 refill
121
  // Use 8000, 9720 left
122
1
  ASSERT_EQ(static_cast<uint64_t>(1024u), controller.GetDelay(&env, 8000u));
123
124
1
  env.now_micros_ += 3024u;  // sleep credit 2000
125
126
  // 1720 left
127
1
  ASSERT_EQ(static_cast<uint64_t>(0u), controller.GetDelay(&env, 8000u));
128
129
  // 1720 balance + 20000 credit = 20170 left
130
  // Use 8000, 12170 left
131
1
  ASSERT_EQ(static_cast<uint64_t>(0u), controller.GetDelay(&env, 8000u));
132
133
  // 4170 left
134
1
  ASSERT_EQ(static_cast<uint64_t>(0u), controller.GetDelay(&env, 8000u));
135
136
  // Need a refill
137
1
  ASSERT_EQ(static_cast<uint64_t>(1024u), controller.GetDelay(&env, 9000u));
138
139
1
  delay_token_1.reset();
140
1
  ASSERT_EQ(static_cast<uint64_t>(0), controller.GetDelay(&env, 30000000u));
141
1
  delay_token_1.reset();
142
1
  ASSERT_FALSE(controller.IsStopped());
143
1
}
144
145
}  // namespace rocksdb
146
147
13.2k
int main(int argc, char** argv) {
148
13.2k
  ::testing::InitGoogleTest(&argc, argv);
149
13.2k
  return RUN_ALL_TESTS();
150
13.2k
}