/Users/deen/code/yugabyte-db/src/yb/rocksdb/table/merger_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 | | |
21 | | #include <vector> |
22 | | #include <string> |
23 | | |
24 | | #include "yb/rocksdb/table/merger.h" |
25 | | #include <gtest/gtest.h> |
26 | | #include "yb/rocksdb/env.h" |
27 | | #include "yb/rocksdb/util/testutil.h" |
28 | | |
29 | | namespace rocksdb { |
30 | | |
31 | | class MergerTest : public RocksDBTest { |
32 | | public: |
33 | | MergerTest() |
34 | 6 | : rnd_(3), merging_iterator_(nullptr), single_iterator_(nullptr) {} |
35 | 6 | ~MergerTest() = default; |
36 | 5.20k | std::vector<std::string> GenerateStrings(size_t len, int string_len) { |
37 | 5.20k | std::vector<std::string> ret; |
38 | 265k | for (size_t i = 0; i < len; ++i) { |
39 | 260k | ret.push_back(test::RandomHumanReadableString(&rnd_, string_len)); |
40 | 260k | } |
41 | 5.20k | return ret; |
42 | 5.20k | } |
43 | | |
44 | 1.75M | void AssertEquivalence() { |
45 | 1.75M | auto a = merging_iterator_.get(); |
46 | 1.75M | auto b = single_iterator_.get(); |
47 | 1.75M | if (!a->Valid()) { |
48 | 50 | ASSERT_TRUE(!b->Valid()); |
49 | 1.75M | } else { |
50 | 1.75M | ASSERT_TRUE(b->Valid()); |
51 | 1.75M | ASSERT_EQ(b->key().ToString(), a->key().ToString()); |
52 | 1.75M | ASSERT_EQ(b->value().ToString(), a->value().ToString()); |
53 | 1.75M | } |
54 | 1.75M | } |
55 | | |
56 | 33 | void SeekToRandom() { Seek(test::RandomHumanReadableString(&rnd_, 5)); } |
57 | | |
58 | 33 | void Seek(std::string target) { |
59 | 33 | merging_iterator_->Seek(target); |
60 | 33 | single_iterator_->Seek(target); |
61 | 33 | } |
62 | | |
63 | 10 | void SeekToFirst() { |
64 | 10 | merging_iterator_->SeekToFirst(); |
65 | 10 | single_iterator_->SeekToFirst(); |
66 | 10 | } |
67 | | |
68 | 10 | void SeekToLast() { |
69 | 10 | merging_iterator_->SeekToLast(); |
70 | 10 | single_iterator_->SeekToLast(); |
71 | 10 | } |
72 | | |
73 | 30 | void Next(int times) { |
74 | 885k | for (int i = 0; i < times && merging_iterator_->Valid(); ++i) { |
75 | 885k | AssertEquivalence(); |
76 | 885k | merging_iterator_->Next(); |
77 | 885k | single_iterator_->Next(); |
78 | 885k | } |
79 | 30 | AssertEquivalence(); |
80 | 30 | } |
81 | | |
82 | 20 | void Prev(int times) { |
83 | 855k | for (int i = 0; i < times && merging_iterator_->Valid(); ++i) { |
84 | 855k | AssertEquivalence(); |
85 | 855k | merging_iterator_->Prev(); |
86 | 855k | single_iterator_->Prev(); |
87 | 855k | } |
88 | 20 | AssertEquivalence(); |
89 | 20 | } |
90 | | |
91 | 3 | void NextAndPrev(int times) { |
92 | 15.0k | for (int i = 0; i < times && merging_iterator_->Valid(); ++i) { |
93 | 15.0k | AssertEquivalence(); |
94 | 15.0k | if (rnd_.OneIn(2)) { |
95 | 7.57k | merging_iterator_->Prev(); |
96 | 7.57k | single_iterator_->Prev(); |
97 | 7.43k | } else { |
98 | 7.43k | merging_iterator_->Next(); |
99 | 7.43k | single_iterator_->Next(); |
100 | 7.43k | } |
101 | 15.0k | } |
102 | 3 | AssertEquivalence(); |
103 | 3 | } |
104 | | |
105 | | void Generate(size_t num_iterators, size_t strings_per_iterator, |
106 | 6 | int letters_per_string) { |
107 | 6 | std::vector<InternalIterator*> small_iterators; |
108 | 5.20k | for (size_t i = 0; i < num_iterators; ++i) { |
109 | 5.20k | auto strings = GenerateStrings(strings_per_iterator, letters_per_string); |
110 | 5.20k | small_iterators.push_back(new test::VectorIterator(strings)); |
111 | 5.20k | all_keys_.insert(all_keys_.end(), strings.begin(), strings.end()); |
112 | 5.20k | } |
113 | | |
114 | 6 | merging_iterator_.reset( |
115 | 6 | NewMergingIterator(BytewiseComparator(), &small_iterators[0], |
116 | 6 | static_cast<int>(small_iterators.size()))); |
117 | 6 | single_iterator_.reset(new test::VectorIterator(all_keys_)); |
118 | 6 | } |
119 | | |
120 | | Random rnd_; |
121 | | std::unique_ptr<InternalIterator> merging_iterator_; |
122 | | std::unique_ptr<InternalIterator> single_iterator_; |
123 | | std::vector<std::string> all_keys_; |
124 | | }; |
125 | | |
126 | 1 | TEST_F(MergerTest, SeekToRandomNextTest) { |
127 | 1 | Generate(1000, 50, 50); |
128 | 11 | for (int i = 0; i < 10; ++i) { |
129 | 10 | SeekToRandom(); |
130 | 10 | AssertEquivalence(); |
131 | 10 | Next(50000); |
132 | 10 | } |
133 | 1 | } |
134 | | |
135 | 1 | TEST_F(MergerTest, SeekToRandomNextSmallStringsTest) { |
136 | 1 | Generate(1000, 50, 2); |
137 | 11 | for (int i = 0; i < 10; ++i) { |
138 | 10 | SeekToRandom(); |
139 | 10 | AssertEquivalence(); |
140 | 10 | Next(50000); |
141 | 10 | } |
142 | 1 | } |
143 | | |
144 | 1 | TEST_F(MergerTest, SeekToRandomPrevTest) { |
145 | 1 | Generate(1000, 50, 50); |
146 | 11 | for (int i = 0; i < 10; ++i) { |
147 | 10 | SeekToRandom(); |
148 | 10 | AssertEquivalence(); |
149 | 10 | Prev(50000); |
150 | 10 | } |
151 | 1 | } |
152 | | |
153 | 1 | TEST_F(MergerTest, SeekToRandomRandomTest) { |
154 | 1 | Generate(200, 50, 50); |
155 | 4 | for (int i = 0; i < 3; ++i) { |
156 | 3 | SeekToRandom(); |
157 | 3 | AssertEquivalence(); |
158 | 3 | NextAndPrev(5000); |
159 | 3 | } |
160 | 1 | } |
161 | | |
162 | 1 | TEST_F(MergerTest, SeekToFirstTest) { |
163 | 1 | Generate(1000, 50, 50); |
164 | 11 | for (int i = 0; i < 10; ++i) { |
165 | 10 | SeekToFirst(); |
166 | 10 | AssertEquivalence(); |
167 | 10 | Next(50000); |
168 | 10 | } |
169 | 1 | } |
170 | | |
171 | 1 | TEST_F(MergerTest, SeekToLastTest) { |
172 | 1 | Generate(1000, 50, 50); |
173 | 11 | for (int i = 0; i < 10; ++i) { |
174 | 10 | SeekToLast(); |
175 | 10 | AssertEquivalence(); |
176 | 10 | Prev(50000); |
177 | 10 | } |
178 | 1 | } |
179 | | |
180 | | } // namespace rocksdb |
181 | | |
182 | 13.2k | int main(int argc, char** argv) { |
183 | 13.2k | ::testing::InitGoogleTest(&argc, argv); |
184 | 13.2k | return RUN_ALL_TESTS(); |
185 | 13.2k | } |