1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
11 #include "db/db_iter.h"
12 #include "db/dbformat.h"
13 #include "rocksdb/comparator.h"
14 #include "rocksdb/options.h"
15 #include "rocksdb/perf_context.h"
16 #include "rocksdb/slice.h"
17 #include "rocksdb/statistics.h"
18 #include "table/iterator_wrapper.h"
19 #include "table/merging_iterator.h"
20 #include "test_util/sync_point.h"
21 #include "test_util/testharness.h"
22 #include "util/string_util.h"
23 #include "utilities/merge_operators.h"
25 namespace ROCKSDB_NAMESPACE
{
27 static uint64_t TestGetTickerCount(const Options
& options
,
28 Tickers ticker_type
) {
29 return options
.statistics
->getTickerCount(ticker_type
);
32 class TestIterator
: public InternalIterator
{
34 explicit TestIterator(const Comparator
* comparator
)
35 : initialized_(false),
43 void AddPut(std::string argkey
, std::string argvalue
) {
44 Add(argkey
, kTypeValue
, argvalue
);
47 void AddDeletion(std::string argkey
) {
48 Add(argkey
, kTypeDeletion
, std::string());
51 void AddSingleDeletion(std::string argkey
) {
52 Add(argkey
, kTypeSingleDeletion
, std::string());
55 void AddMerge(std::string argkey
, std::string argvalue
) {
56 Add(argkey
, kTypeMerge
, argvalue
);
59 void Add(std::string argkey
, ValueType type
, std::string argvalue
) {
60 Add(argkey
, type
, argvalue
, sequence_number_
++);
63 void Add(std::string argkey
, ValueType type
, std::string argvalue
,
64 size_t seq_num
, bool update_iter
= false) {
66 ParsedInternalKey
internal_key(argkey
, seq_num
, type
);
68 std::pair
<std::string
, std::string
>(std::string(), argvalue
));
69 AppendInternalKey(&data_
.back().first
, internal_key
);
70 if (update_iter
&& valid_
&& cmp
.Compare(data_
.back().first
, key()) < 0) {
71 // insert a key smaller than current key
73 // data_[iter_] is not anymore the current element of the iterator.
74 // Increment it to reposition it to the right position.
79 // should be called before operations with iterator
82 std::sort(data_
.begin(), data_
.end(),
83 [this](std::pair
<std::string
, std::string
> a
,
84 std::pair
<std::string
, std::string
> b
) {
85 return (cmp
.Compare(a
.first
, b
.first
) < 0);
89 // Removes the key from the set of keys over which this iterator iterates.
90 // Not to be confused with AddDeletion().
91 // If the iterator is currently positioned on this key, the deletion will
92 // apply next time the iterator moves.
93 // Used for simulating ForwardIterator updating to a new version that doesn't
94 // have some of the keys (e.g. after compaction with a filter).
95 void Vanish(std::string _key
) {
96 if (valid_
&& data_
[iter_
].first
== _key
) {
97 delete_current_
= true;
100 for (auto it
= data_
.begin(); it
!= data_
.end(); ++it
) {
101 ParsedInternalKey ikey
;
103 ParseInternalKey(it
->first
, &ikey
, true /* log_err_key */);
104 pik_status
.PermitUncheckedError();
105 assert(pik_status
.ok());
106 if (!pik_status
.ok() || ikey
.user_key
!= _key
) {
109 if (valid_
&& data_
.begin() + iter_
> it
) {
118 // Number of operations done on this iterator since construction.
119 size_t steps() const { return steps_
; }
121 bool Valid() const override
{
122 assert(initialized_
);
126 void SeekToFirst() override
{
127 assert(initialized_
);
129 DeleteCurrentIfNeeded();
130 valid_
= (data_
.size() > 0);
134 void SeekToLast() override
{
135 assert(initialized_
);
137 DeleteCurrentIfNeeded();
138 valid_
= (data_
.size() > 0);
139 iter_
= data_
.size() - 1;
142 void Seek(const Slice
& target
) override
{
143 assert(initialized_
);
149 while (iter_
< data_
.size() &&
150 (cmp
.Compare(data_
[iter_
].first
, target
) < 0)) {
154 if (iter_
== data_
.size()) {
159 void SeekForPrev(const Slice
& target
) override
{
160 assert(initialized_
);
161 DeleteCurrentIfNeeded();
162 SeekForPrevImpl(target
, &cmp
);
165 void Next() override
{
166 assert(initialized_
);
168 assert(iter_
< data_
.size());
171 if (delete_current_
) {
172 DeleteCurrentIfNeeded();
176 valid_
= iter_
< data_
.size();
179 void Prev() override
{
180 assert(initialized_
);
182 assert(iter_
< data_
.size());
185 DeleteCurrentIfNeeded();
193 Slice
key() const override
{
194 assert(initialized_
);
195 return data_
[iter_
].first
;
198 Slice
value() const override
{
199 assert(initialized_
);
200 return data_
[iter_
].second
;
203 Status
status() const override
{
204 assert(initialized_
);
208 bool IsKeyPinned() const override
{ return true; }
209 bool IsValuePinned() const override
{ return true; }
214 size_t sequence_number_
;
218 InternalKeyComparator cmp
;
219 std::vector
<std::pair
<std::string
, std::string
>> data_
;
220 bool delete_current_
= false;
222 void DeleteCurrentIfNeeded() {
223 if (!delete_current_
) {
226 data_
.erase(data_
.begin() + iter_
);
227 delete_current_
= false;
231 class DBIteratorTest
: public testing::Test
{
235 DBIteratorTest() : env_(Env::Default()) {}
238 TEST_F(DBIteratorTest
, DBIteratorPrevNext
) {
240 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
241 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
243 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
244 internal_iter
->AddDeletion("a");
245 internal_iter
->AddDeletion("a");
246 internal_iter
->AddDeletion("a");
247 internal_iter
->AddDeletion("a");
248 internal_iter
->AddPut("a", "val_a");
250 internal_iter
->AddPut("b", "val_b");
251 internal_iter
->Finish();
254 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
255 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
256 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
257 nullptr /*read_callback*/));
259 db_iter
->SeekToLast();
260 ASSERT_TRUE(db_iter
->Valid());
261 ASSERT_EQ(db_iter
->key().ToString(), "b");
262 ASSERT_EQ(db_iter
->value().ToString(), "val_b");
265 ASSERT_TRUE(db_iter
->Valid());
266 ASSERT_EQ(db_iter
->key().ToString(), "a");
267 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
270 ASSERT_TRUE(db_iter
->Valid());
271 ASSERT_EQ(db_iter
->key().ToString(), "b");
272 ASSERT_EQ(db_iter
->value().ToString(), "val_b");
275 ASSERT_TRUE(!db_iter
->Valid());
277 // Test to check the SeekToLast() with iterate_upper_bound not set
279 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
280 internal_iter
->AddPut("a", "val_a");
281 internal_iter
->AddPut("b", "val_b");
282 internal_iter
->AddPut("b", "val_b");
283 internal_iter
->AddPut("c", "val_c");
284 internal_iter
->Finish();
287 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
288 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
289 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
290 nullptr /*read_callback*/));
292 db_iter
->SeekToLast();
293 ASSERT_TRUE(db_iter
->Valid());
294 ASSERT_EQ(db_iter
->key().ToString(), "c");
297 // Test to check the SeekToLast() with iterate_upper_bound set
299 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
301 internal_iter
->AddPut("a", "val_a");
302 internal_iter
->AddPut("b", "val_b");
303 internal_iter
->AddPut("c", "val_c");
304 internal_iter
->AddPut("d", "val_d");
305 internal_iter
->AddPut("e", "val_e");
306 internal_iter
->AddPut("f", "val_f");
307 internal_iter
->Finish();
312 ro
.iterate_upper_bound
= &prefix
;
314 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
315 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
316 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
317 nullptr /*read_callback*/));
319 db_iter
->SeekToLast();
320 ASSERT_TRUE(db_iter
->Valid());
321 ASSERT_EQ(db_iter
->key().ToString(), "c");
324 ASSERT_TRUE(!db_iter
->Valid());
326 db_iter
->SeekToLast();
327 ASSERT_TRUE(db_iter
->Valid());
328 ASSERT_EQ(db_iter
->key().ToString(), "c");
330 // Test to check the SeekToLast() iterate_upper_bound set to a key that
333 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
335 internal_iter
->AddPut("a", "val_a");
336 internal_iter
->AddPut("a", "val_a");
337 internal_iter
->AddPut("b", "val_b");
338 internal_iter
->AddPut("c", "val_c");
339 internal_iter
->AddPut("d", "val_d");
340 internal_iter
->Finish();
345 ro
.iterate_upper_bound
= &prefix
;
347 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
348 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
349 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
350 nullptr /*read_callback*/));
352 db_iter
->SeekToLast();
353 ASSERT_TRUE(db_iter
->Valid());
354 ASSERT_EQ(db_iter
->key().ToString(), "d");
357 ASSERT_TRUE(!db_iter
->Valid());
359 db_iter
->SeekToLast();
360 ASSERT_TRUE(db_iter
->Valid());
361 ASSERT_EQ(db_iter
->key().ToString(), "d");
364 ASSERT_TRUE(db_iter
->Valid());
365 ASSERT_EQ(db_iter
->key().ToString(), "c");
367 // Test to check the SeekToLast() with iterate_upper_bound set to the
370 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
371 internal_iter
->AddPut("a", "val_a");
372 internal_iter
->AddPut("a", "val_a");
373 internal_iter
->AddPut("a", "val_a");
374 internal_iter
->AddPut("b", "val_b");
375 internal_iter
->AddPut("b", "val_b");
376 internal_iter
->Finish();
381 ro
.iterate_upper_bound
= &prefix
;
383 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
384 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
385 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
386 nullptr /*read_callback*/));
388 db_iter
->SeekToLast();
389 ASSERT_TRUE(!db_iter
->Valid());
391 // Test case to check SeekToLast with iterate_upper_bound set
392 // (same key put may times - SeekToLast should start with the
393 // maximum sequence id of the upper bound)
396 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
397 internal_iter
->AddPut("a", "val_a");
398 internal_iter
->AddPut("b", "val_b");
399 internal_iter
->AddPut("c", "val_c");
400 internal_iter
->AddPut("c", "val_c");
401 internal_iter
->AddPut("c", "val_c");
402 internal_iter
->AddPut("c", "val_c");
403 internal_iter
->AddPut("c", "val_c");
404 internal_iter
->AddPut("c", "val_c");
405 internal_iter
->AddPut("c", "val_c");
406 internal_iter
->Finish();
411 ro
.iterate_upper_bound
= &prefix
;
413 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
414 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
415 internal_iter
, 7, options
.max_sequential_skip_in_iterations
,
416 nullptr /*read_callback*/));
418 SetPerfLevel(kEnableCount
);
419 ASSERT_TRUE(GetPerfLevel() == kEnableCount
);
421 get_perf_context()->Reset();
422 db_iter
->SeekToLast();
424 ASSERT_TRUE(db_iter
->Valid());
425 ASSERT_EQ(static_cast<int>(get_perf_context()->internal_key_skipped_count
), 1);
426 ASSERT_EQ(db_iter
->key().ToString(), "b");
428 SetPerfLevel(kDisable
);
430 // Test to check the SeekToLast() with the iterate_upper_bound set
431 // (Checking the value of the key which has sequence ids greater than
432 // and less that the iterator's sequence id)
434 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
436 internal_iter
->AddPut("a", "val_a1");
437 internal_iter
->AddPut("a", "val_a2");
438 internal_iter
->AddPut("b", "val_b1");
439 internal_iter
->AddPut("c", "val_c1");
440 internal_iter
->AddPut("c", "val_c2");
441 internal_iter
->AddPut("c", "val_c3");
442 internal_iter
->AddPut("b", "val_b2");
443 internal_iter
->AddPut("d", "val_d1");
444 internal_iter
->Finish();
449 ro
.iterate_upper_bound
= &prefix
;
451 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
452 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
453 internal_iter
, 4, options
.max_sequential_skip_in_iterations
,
454 nullptr /*read_callback*/));
456 db_iter
->SeekToLast();
457 ASSERT_TRUE(db_iter
->Valid());
458 ASSERT_EQ(db_iter
->key().ToString(), "b");
459 ASSERT_EQ(db_iter
->value().ToString(), "val_b1");
462 // Test to check the SeekToLast() with the iterate_upper_bound set to the
463 // key that is deleted
465 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
466 internal_iter
->AddPut("a", "val_a");
467 internal_iter
->AddDeletion("a");
468 internal_iter
->AddPut("b", "val_b");
469 internal_iter
->AddPut("c", "val_c");
470 internal_iter
->Finish();
475 ro
.iterate_upper_bound
= &prefix
;
477 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
478 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
479 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
480 nullptr /*read_callback*/));
482 db_iter
->SeekToLast();
483 ASSERT_TRUE(!db_iter
->Valid());
485 // Test to check the SeekToLast() with the iterate_upper_bound set
488 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
489 internal_iter
->AddPut("a", "val_a");
490 internal_iter
->AddPut("b", "val_b");
491 internal_iter
->AddDeletion("b");
492 internal_iter
->AddPut("c", "val_c");
493 internal_iter
->Finish();
498 ro
.iterate_upper_bound
= &prefix
;
500 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
501 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
502 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
503 nullptr /*read_callback*/));
505 db_iter
->SeekToLast();
506 ASSERT_TRUE(db_iter
->Valid());
507 ASSERT_EQ(db_iter
->key().ToString(), "a");
510 ASSERT_TRUE(!db_iter
->Valid());
512 db_iter
->SeekToLast();
513 ASSERT_TRUE(db_iter
->Valid());
514 ASSERT_EQ(db_iter
->key().ToString(), "a");
516 // Test to check the SeekToLast() with iterate_upper_bound set
517 // (Deletion cases - Lot of internal keys after the upper_bound
520 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
521 internal_iter
->AddPut("a", "val_a");
522 internal_iter
->AddPut("b", "val_b");
523 internal_iter
->AddDeletion("c");
524 internal_iter
->AddDeletion("d");
525 internal_iter
->AddDeletion("e");
526 internal_iter
->AddDeletion("f");
527 internal_iter
->AddDeletion("g");
528 internal_iter
->AddDeletion("h");
529 internal_iter
->Finish();
534 ro
.iterate_upper_bound
= &prefix
;
536 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
537 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
538 internal_iter
, 7, options
.max_sequential_skip_in_iterations
,
539 nullptr /*read_callback*/));
541 SetPerfLevel(kEnableCount
);
542 ASSERT_TRUE(GetPerfLevel() == kEnableCount
);
544 get_perf_context()->Reset();
545 db_iter
->SeekToLast();
547 ASSERT_TRUE(db_iter
->Valid());
548 ASSERT_EQ(static_cast<int>(get_perf_context()->internal_delete_skipped_count
), 0);
549 ASSERT_EQ(db_iter
->key().ToString(), "b");
551 SetPerfLevel(kDisable
);
555 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
556 internal_iter
->AddDeletion("a");
557 internal_iter
->AddDeletion("a");
558 internal_iter
->AddDeletion("a");
559 internal_iter
->AddDeletion("a");
560 internal_iter
->AddPut("a", "val_a");
562 internal_iter
->AddPut("b", "val_b");
563 internal_iter
->Finish();
566 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
567 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
568 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
569 nullptr /*read_callback*/));
571 db_iter
->SeekToFirst();
572 ASSERT_TRUE(db_iter
->Valid());
573 ASSERT_EQ(db_iter
->key().ToString(), "a");
574 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
577 ASSERT_TRUE(db_iter
->Valid());
578 ASSERT_EQ(db_iter
->key().ToString(), "b");
579 ASSERT_EQ(db_iter
->value().ToString(), "val_b");
582 ASSERT_TRUE(db_iter
->Valid());
583 ASSERT_EQ(db_iter
->key().ToString(), "a");
584 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
587 ASSERT_TRUE(!db_iter
->Valid());
591 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
592 internal_iter
->AddPut("a", "val_a");
593 internal_iter
->AddPut("b", "val_b");
595 internal_iter
->AddPut("a", "val_a");
596 internal_iter
->AddPut("b", "val_b");
598 internal_iter
->AddPut("a", "val_a");
599 internal_iter
->AddPut("b", "val_b");
601 internal_iter
->AddPut("a", "val_a");
602 internal_iter
->AddPut("b", "val_b");
604 internal_iter
->AddPut("a", "val_a");
605 internal_iter
->AddPut("b", "val_b");
606 internal_iter
->Finish();
609 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
610 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
611 internal_iter
, 2, options
.max_sequential_skip_in_iterations
,
612 nullptr /*read_callback*/));
613 db_iter
->SeekToLast();
614 ASSERT_TRUE(db_iter
->Valid());
615 ASSERT_EQ(db_iter
->key().ToString(), "b");
616 ASSERT_EQ(db_iter
->value().ToString(), "val_b");
619 ASSERT_TRUE(!db_iter
->Valid());
621 db_iter
->SeekToLast();
622 ASSERT_TRUE(db_iter
->Valid());
623 ASSERT_EQ(db_iter
->key().ToString(), "b");
624 ASSERT_EQ(db_iter
->value().ToString(), "val_b");
628 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
629 internal_iter
->AddPut("a", "val_a");
630 internal_iter
->AddPut("a", "val_a");
631 internal_iter
->AddPut("a", "val_a");
632 internal_iter
->AddPut("a", "val_a");
633 internal_iter
->AddPut("a", "val_a");
635 internal_iter
->AddPut("b", "val_b");
637 internal_iter
->AddPut("c", "val_c");
638 internal_iter
->Finish();
641 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
642 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
643 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
644 nullptr /*read_callback*/));
645 db_iter
->SeekToLast();
646 ASSERT_TRUE(db_iter
->Valid());
647 ASSERT_EQ(db_iter
->key().ToString(), "c");
648 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
651 ASSERT_TRUE(db_iter
->Valid());
652 ASSERT_EQ(db_iter
->key().ToString(), "b");
653 ASSERT_EQ(db_iter
->value().ToString(), "val_b");
656 ASSERT_TRUE(db_iter
->Valid());
657 ASSERT_EQ(db_iter
->key().ToString(), "c");
658 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
662 TEST_F(DBIteratorTest
, DBIteratorEmpty
) {
664 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
665 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
669 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
670 internal_iter
->Finish();
672 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
673 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
674 internal_iter
, 0, options
.max_sequential_skip_in_iterations
,
675 nullptr /*read_callback*/));
676 db_iter
->SeekToLast();
677 ASSERT_TRUE(!db_iter
->Valid());
681 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
682 internal_iter
->Finish();
684 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
685 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
686 internal_iter
, 0, options
.max_sequential_skip_in_iterations
,
687 nullptr /*read_callback*/));
688 db_iter
->SeekToFirst();
689 ASSERT_TRUE(!db_iter
->Valid());
693 TEST_F(DBIteratorTest
, DBIteratorUseSkipCountSkips
) {
696 options
.statistics
= ROCKSDB_NAMESPACE::CreateDBStatistics();
697 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
699 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
700 for (size_t i
= 0; i
< 200; ++i
) {
701 internal_iter
->AddPut("a", "a");
702 internal_iter
->AddPut("b", "b");
703 internal_iter
->AddPut("c", "c");
705 internal_iter
->Finish();
707 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
708 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
709 BytewiseComparator(), internal_iter
, 2,
710 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
711 db_iter
->SeekToLast();
712 ASSERT_TRUE(db_iter
->Valid());
713 ASSERT_EQ(db_iter
->key().ToString(), "c");
714 ASSERT_EQ(db_iter
->value().ToString(), "c");
715 ASSERT_EQ(TestGetTickerCount(options
, NUMBER_OF_RESEEKS_IN_ITERATION
), 1u);
718 ASSERT_TRUE(db_iter
->Valid());
719 ASSERT_EQ(db_iter
->key().ToString(), "b");
720 ASSERT_EQ(db_iter
->value().ToString(), "b");
721 ASSERT_EQ(TestGetTickerCount(options
, NUMBER_OF_RESEEKS_IN_ITERATION
), 2u);
724 ASSERT_TRUE(db_iter
->Valid());
725 ASSERT_EQ(db_iter
->key().ToString(), "a");
726 ASSERT_EQ(db_iter
->value().ToString(), "a");
727 ASSERT_EQ(TestGetTickerCount(options
, NUMBER_OF_RESEEKS_IN_ITERATION
), 3u);
730 ASSERT_TRUE(!db_iter
->Valid());
731 ASSERT_EQ(TestGetTickerCount(options
, NUMBER_OF_RESEEKS_IN_ITERATION
), 3u);
734 TEST_F(DBIteratorTest
, DBIteratorUseSkip
) {
737 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
738 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
739 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
742 for (size_t i
= 0; i
< 200; ++i
) {
743 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
744 internal_iter
->AddMerge("b", "merge_1");
745 internal_iter
->AddMerge("a", "merge_2");
746 for (size_t k
= 0; k
< 200; ++k
) {
747 internal_iter
->AddPut("c", ToString(k
));
749 internal_iter
->Finish();
751 options
.statistics
= ROCKSDB_NAMESPACE::CreateDBStatistics();
752 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
753 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
754 internal_iter
, i
+ 2, options
.max_sequential_skip_in_iterations
,
755 nullptr /*read_callback*/));
756 db_iter
->SeekToLast();
757 ASSERT_TRUE(db_iter
->Valid());
759 ASSERT_EQ(db_iter
->key().ToString(), "c");
760 ASSERT_EQ(db_iter
->value().ToString(), ToString(i
));
762 ASSERT_TRUE(db_iter
->Valid());
764 ASSERT_EQ(db_iter
->key().ToString(), "b");
765 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
767 ASSERT_TRUE(db_iter
->Valid());
769 ASSERT_EQ(db_iter
->key().ToString(), "a");
770 ASSERT_EQ(db_iter
->value().ToString(), "merge_2");
773 ASSERT_TRUE(!db_iter
->Valid());
778 for (size_t i
= 0; i
< 200; ++i
) {
779 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
780 internal_iter
->AddMerge("b", "merge_1");
781 internal_iter
->AddMerge("a", "merge_2");
782 for (size_t k
= 0; k
< 200; ++k
) {
783 internal_iter
->AddDeletion("c");
785 internal_iter
->AddPut("c", "200");
786 internal_iter
->Finish();
788 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
789 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
790 internal_iter
, i
+ 2, options
.max_sequential_skip_in_iterations
,
791 nullptr /*read_callback*/));
792 db_iter
->SeekToLast();
793 ASSERT_TRUE(db_iter
->Valid());
795 ASSERT_EQ(db_iter
->key().ToString(), "b");
796 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
798 ASSERT_TRUE(db_iter
->Valid());
800 ASSERT_EQ(db_iter
->key().ToString(), "a");
801 ASSERT_EQ(db_iter
->value().ToString(), "merge_2");
804 ASSERT_TRUE(!db_iter
->Valid());
808 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
809 internal_iter
->AddMerge("b", "merge_1");
810 internal_iter
->AddMerge("a", "merge_2");
811 for (size_t i
= 0; i
< 200; ++i
) {
812 internal_iter
->AddDeletion("c");
814 internal_iter
->AddPut("c", "200");
815 internal_iter
->Finish();
817 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
818 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
819 internal_iter
, 202, options
.max_sequential_skip_in_iterations
,
820 nullptr /*read_callback*/));
821 db_iter
->SeekToLast();
822 ASSERT_TRUE(db_iter
->Valid());
824 ASSERT_EQ(db_iter
->key().ToString(), "c");
825 ASSERT_EQ(db_iter
->value().ToString(), "200");
827 ASSERT_TRUE(db_iter
->Valid());
829 ASSERT_EQ(db_iter
->key().ToString(), "b");
830 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
832 ASSERT_TRUE(db_iter
->Valid());
834 ASSERT_EQ(db_iter
->key().ToString(), "a");
835 ASSERT_EQ(db_iter
->value().ToString(), "merge_2");
838 ASSERT_TRUE(!db_iter
->Valid());
843 for (size_t i
= 0; i
< 200; ++i
) {
844 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
845 for (size_t k
= 0; k
< 200; ++k
) {
846 internal_iter
->AddDeletion("c");
848 internal_iter
->AddPut("c", "200");
849 internal_iter
->Finish();
850 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
851 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
852 internal_iter
, i
, options
.max_sequential_skip_in_iterations
,
853 nullptr /*read_callback*/));
854 db_iter
->SeekToLast();
855 ASSERT_TRUE(!db_iter
->Valid());
857 db_iter
->SeekToFirst();
858 ASSERT_TRUE(!db_iter
->Valid());
861 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
862 for (size_t i
= 0; i
< 200; ++i
) {
863 internal_iter
->AddDeletion("c");
865 internal_iter
->AddPut("c", "200");
866 internal_iter
->Finish();
867 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
868 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
869 internal_iter
, 200, options
.max_sequential_skip_in_iterations
,
870 nullptr /*read_callback*/));
871 db_iter
->SeekToLast();
872 ASSERT_TRUE(db_iter
->Valid());
873 ASSERT_EQ(db_iter
->key().ToString(), "c");
874 ASSERT_EQ(db_iter
->value().ToString(), "200");
877 ASSERT_TRUE(!db_iter
->Valid());
879 db_iter
->SeekToFirst();
880 ASSERT_TRUE(db_iter
->Valid());
881 ASSERT_EQ(db_iter
->key().ToString(), "c");
882 ASSERT_EQ(db_iter
->value().ToString(), "200");
885 ASSERT_TRUE(!db_iter
->Valid());
889 for (size_t i
= 0; i
< 200; ++i
) {
890 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
891 internal_iter
->AddMerge("b", "merge_1");
892 internal_iter
->AddMerge("a", "merge_2");
893 for (size_t k
= 0; k
< 200; ++k
) {
894 internal_iter
->AddPut("d", ToString(k
));
897 for (size_t k
= 0; k
< 200; ++k
) {
898 internal_iter
->AddPut("c", ToString(k
));
900 internal_iter
->Finish();
902 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
903 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
904 internal_iter
, i
+ 2, options
.max_sequential_skip_in_iterations
,
905 nullptr /*read_callback*/));
906 db_iter
->SeekToLast();
907 ASSERT_TRUE(db_iter
->Valid());
909 ASSERT_EQ(db_iter
->key().ToString(), "d");
910 ASSERT_EQ(db_iter
->value().ToString(), ToString(i
));
912 ASSERT_TRUE(db_iter
->Valid());
914 ASSERT_EQ(db_iter
->key().ToString(), "b");
915 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
917 ASSERT_TRUE(db_iter
->Valid());
919 ASSERT_EQ(db_iter
->key().ToString(), "a");
920 ASSERT_EQ(db_iter
->value().ToString(), "merge_2");
923 ASSERT_TRUE(!db_iter
->Valid());
928 for (size_t i
= 0; i
< 200; ++i
) {
929 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
930 internal_iter
->AddMerge("b", "b");
931 internal_iter
->AddMerge("a", "a");
932 for (size_t k
= 0; k
< 200; ++k
) {
933 internal_iter
->AddMerge("c", ToString(k
));
935 internal_iter
->Finish();
937 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
938 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
939 internal_iter
, i
+ 2, options
.max_sequential_skip_in_iterations
,
940 nullptr /*read_callback*/));
941 db_iter
->SeekToLast();
942 ASSERT_TRUE(db_iter
->Valid());
944 ASSERT_EQ(db_iter
->key().ToString(), "c");
945 std::string merge_result
= "0";
946 for (size_t j
= 1; j
<= i
; ++j
) {
947 merge_result
+= "," + ToString(j
);
949 ASSERT_EQ(db_iter
->value().ToString(), merge_result
);
952 ASSERT_TRUE(db_iter
->Valid());
953 ASSERT_EQ(db_iter
->key().ToString(), "b");
954 ASSERT_EQ(db_iter
->value().ToString(), "b");
957 ASSERT_TRUE(db_iter
->Valid());
958 ASSERT_EQ(db_iter
->key().ToString(), "a");
959 ASSERT_EQ(db_iter
->value().ToString(), "a");
962 ASSERT_TRUE(!db_iter
->Valid());
967 TEST_F(DBIteratorTest
, DBIteratorSkipInternalKeys
) {
969 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
970 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
973 // Basic test case ... Make sure explicityly passing the default value works.
974 // Skipping internal keys is disabled by default, when the value is 0.
976 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
977 internal_iter
->AddPut("a", "val_a");
978 internal_iter
->AddDeletion("b");
979 internal_iter
->AddDeletion("b");
980 internal_iter
->AddPut("c", "val_c");
981 internal_iter
->AddPut("c", "val_c");
982 internal_iter
->AddDeletion("c");
983 internal_iter
->AddPut("d", "val_d");
984 internal_iter
->Finish();
986 ro
.max_skippable_internal_keys
= 0;
987 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
988 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
989 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
990 nullptr /*read_callback*/));
992 db_iter
->SeekToFirst();
993 ASSERT_TRUE(db_iter
->Valid());
994 ASSERT_EQ(db_iter
->key().ToString(), "a");
995 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
998 ASSERT_TRUE(db_iter
->Valid());
999 ASSERT_EQ(db_iter
->key().ToString(), "d");
1000 ASSERT_EQ(db_iter
->value().ToString(), "val_d");
1003 ASSERT_TRUE(!db_iter
->Valid());
1004 ASSERT_TRUE(db_iter
->status().ok());
1006 db_iter
->SeekToLast();
1007 ASSERT_TRUE(db_iter
->Valid());
1008 ASSERT_EQ(db_iter
->key().ToString(), "d");
1009 ASSERT_EQ(db_iter
->value().ToString(), "val_d");
1012 ASSERT_TRUE(db_iter
->Valid());
1013 ASSERT_EQ(db_iter
->key().ToString(), "a");
1014 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1017 ASSERT_TRUE(!db_iter
->Valid());
1018 ASSERT_TRUE(db_iter
->status().ok());
1021 // Test to make sure that the request will *not* fail as incomplete if
1022 // num_internal_keys_skipped is *equal* to max_skippable_internal_keys
1023 // threshold. (It will fail as incomplete only when the threshold is
1026 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1027 internal_iter
->AddPut("a", "val_a");
1028 internal_iter
->AddDeletion("b");
1029 internal_iter
->AddDeletion("b");
1030 internal_iter
->AddPut("c", "val_c");
1031 internal_iter
->Finish();
1033 ro
.max_skippable_internal_keys
= 2;
1034 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1035 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1036 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1037 nullptr /*read_callback*/));
1039 db_iter
->SeekToFirst();
1040 ASSERT_TRUE(db_iter
->Valid());
1041 ASSERT_EQ(db_iter
->key().ToString(), "a");
1042 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1045 ASSERT_TRUE(db_iter
->Valid());
1046 ASSERT_EQ(db_iter
->key().ToString(), "c");
1047 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1050 ASSERT_TRUE(!db_iter
->Valid());
1051 ASSERT_TRUE(db_iter
->status().ok());
1053 db_iter
->SeekToLast();
1054 ASSERT_TRUE(db_iter
->Valid());
1055 ASSERT_EQ(db_iter
->key().ToString(), "c");
1056 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1059 ASSERT_EQ(db_iter
->key().ToString(), "a");
1060 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1063 ASSERT_TRUE(!db_iter
->Valid());
1064 ASSERT_TRUE(db_iter
->status().ok());
1067 // Fail the request as incomplete when num_internal_keys_skipped >
1068 // max_skippable_internal_keys
1070 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1071 internal_iter
->AddPut("a", "val_a");
1072 internal_iter
->AddDeletion("b");
1073 internal_iter
->AddDeletion("b");
1074 internal_iter
->AddDeletion("b");
1075 internal_iter
->AddPut("c", "val_c");
1076 internal_iter
->Finish();
1078 ro
.max_skippable_internal_keys
= 2;
1079 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1080 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1081 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1082 nullptr /*read_callback*/));
1084 db_iter
->SeekToFirst();
1085 ASSERT_TRUE(db_iter
->Valid());
1086 ASSERT_EQ(db_iter
->key().ToString(), "a");
1087 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1090 ASSERT_TRUE(!db_iter
->Valid());
1091 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1093 db_iter
->SeekToLast();
1094 ASSERT_TRUE(db_iter
->Valid());
1095 ASSERT_EQ(db_iter
->key().ToString(), "c");
1096 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1099 ASSERT_TRUE(!db_iter
->Valid());
1100 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1103 // Test that the num_internal_keys_skipped counter resets after a successful
1106 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1107 internal_iter
->AddPut("a", "val_a");
1108 internal_iter
->AddDeletion("b");
1109 internal_iter
->AddDeletion("b");
1110 internal_iter
->AddPut("c", "val_c");
1111 internal_iter
->AddDeletion("d");
1112 internal_iter
->AddDeletion("d");
1113 internal_iter
->AddDeletion("d");
1114 internal_iter
->AddPut("e", "val_e");
1115 internal_iter
->Finish();
1117 ro
.max_skippable_internal_keys
= 2;
1118 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1119 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1120 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1121 nullptr /*read_callback*/));
1123 db_iter
->SeekToFirst();
1124 ASSERT_TRUE(db_iter
->Valid());
1125 ASSERT_EQ(db_iter
->key().ToString(), "a");
1126 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1129 ASSERT_TRUE(db_iter
->Valid());
1130 ASSERT_EQ(db_iter
->key().ToString(), "c");
1131 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1133 db_iter
->Next(); // num_internal_keys_skipped counter resets here.
1134 ASSERT_TRUE(!db_iter
->Valid());
1135 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1138 // Test that the num_internal_keys_skipped counter resets after a successful
1140 // Reverse direction
1142 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1143 internal_iter
->AddPut("a", "val_a");
1144 internal_iter
->AddDeletion("b");
1145 internal_iter
->AddDeletion("b");
1146 internal_iter
->AddDeletion("b");
1147 internal_iter
->AddPut("c", "val_c");
1148 internal_iter
->AddDeletion("d");
1149 internal_iter
->AddDeletion("d");
1150 internal_iter
->AddPut("e", "val_e");
1151 internal_iter
->Finish();
1153 ro
.max_skippable_internal_keys
= 2;
1154 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1155 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1156 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1157 nullptr /*read_callback*/));
1159 db_iter
->SeekToLast();
1160 ASSERT_TRUE(db_iter
->Valid());
1161 ASSERT_EQ(db_iter
->key().ToString(), "e");
1162 ASSERT_EQ(db_iter
->value().ToString(), "val_e");
1165 ASSERT_TRUE(db_iter
->Valid());
1166 ASSERT_EQ(db_iter
->key().ToString(), "c");
1167 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1169 db_iter
->Prev(); // num_internal_keys_skipped counter resets here.
1170 ASSERT_TRUE(!db_iter
->Valid());
1171 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1174 // Test that skipping separate keys is handled
1176 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1177 internal_iter
->AddPut("a", "val_a");
1178 internal_iter
->AddDeletion("b");
1179 internal_iter
->AddDeletion("c");
1180 internal_iter
->AddDeletion("d");
1181 internal_iter
->AddPut("e", "val_e");
1182 internal_iter
->Finish();
1184 ro
.max_skippable_internal_keys
= 2;
1185 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1186 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1187 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1188 nullptr /*read_callback*/));
1190 db_iter
->SeekToFirst();
1191 ASSERT_TRUE(db_iter
->Valid());
1192 ASSERT_EQ(db_iter
->key().ToString(), "a");
1193 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1196 ASSERT_TRUE(!db_iter
->Valid());
1197 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1199 db_iter
->SeekToLast();
1200 ASSERT_TRUE(db_iter
->Valid());
1201 ASSERT_EQ(db_iter
->key().ToString(), "e");
1202 ASSERT_EQ(db_iter
->value().ToString(), "val_e");
1205 ASSERT_TRUE(!db_iter
->Valid());
1206 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1209 // Test if alternating puts and deletes of the same key are handled correctly.
1211 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1212 internal_iter
->AddPut("a", "val_a");
1213 internal_iter
->AddPut("b", "val_b");
1214 internal_iter
->AddDeletion("b");
1215 internal_iter
->AddPut("c", "val_c");
1216 internal_iter
->AddDeletion("c");
1217 internal_iter
->AddPut("d", "val_d");
1218 internal_iter
->AddDeletion("d");
1219 internal_iter
->AddPut("e", "val_e");
1220 internal_iter
->Finish();
1222 ro
.max_skippable_internal_keys
= 2;
1223 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1224 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1225 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1226 nullptr /*read_callback*/));
1228 db_iter
->SeekToFirst();
1229 ASSERT_TRUE(db_iter
->Valid());
1230 ASSERT_EQ(db_iter
->key().ToString(), "a");
1231 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1234 ASSERT_TRUE(!db_iter
->Valid());
1235 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1237 db_iter
->SeekToLast();
1238 ASSERT_TRUE(db_iter
->Valid());
1239 ASSERT_EQ(db_iter
->key().ToString(), "e");
1240 ASSERT_EQ(db_iter
->value().ToString(), "val_e");
1243 ASSERT_TRUE(!db_iter
->Valid());
1244 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1247 // Test for large number of skippable internal keys with *default*
1248 // max_sequential_skip_in_iterations.
1250 for (size_t i
= 1; i
<= 200; ++i
) {
1251 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1252 internal_iter
->AddPut("a", "val_a");
1253 for (size_t j
= 1; j
<= i
; ++j
) {
1254 internal_iter
->AddPut("b", "val_b");
1255 internal_iter
->AddDeletion("b");
1257 internal_iter
->AddPut("c", "val_c");
1258 internal_iter
->Finish();
1260 ro
.max_skippable_internal_keys
= i
;
1261 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1262 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1263 internal_iter
, 2 * i
+ 1, options
.max_sequential_skip_in_iterations
,
1264 nullptr /*read_callback*/));
1266 db_iter
->SeekToFirst();
1267 ASSERT_TRUE(db_iter
->Valid());
1268 ASSERT_EQ(db_iter
->key().ToString(), "a");
1269 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1272 if ((options
.max_sequential_skip_in_iterations
+ 1) >=
1273 ro
.max_skippable_internal_keys
) {
1274 ASSERT_TRUE(!db_iter
->Valid());
1275 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1277 ASSERT_TRUE(db_iter
->Valid());
1278 ASSERT_EQ(db_iter
->key().ToString(), "c");
1279 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1282 db_iter
->SeekToLast();
1283 ASSERT_TRUE(db_iter
->Valid());
1284 ASSERT_EQ(db_iter
->key().ToString(), "c");
1285 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1288 if ((options
.max_sequential_skip_in_iterations
+ 1) >=
1289 ro
.max_skippable_internal_keys
) {
1290 ASSERT_TRUE(!db_iter
->Valid());
1291 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1293 ASSERT_TRUE(db_iter
->Valid());
1294 ASSERT_EQ(db_iter
->key().ToString(), "a");
1295 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1300 // Test for large number of skippable internal keys with a *non-default*
1301 // max_sequential_skip_in_iterations.
1303 for (size_t i
= 1; i
<= 200; ++i
) {
1304 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1305 internal_iter
->AddPut("a", "val_a");
1306 for (size_t j
= 1; j
<= i
; ++j
) {
1307 internal_iter
->AddPut("b", "val_b");
1308 internal_iter
->AddDeletion("b");
1310 internal_iter
->AddPut("c", "val_c");
1311 internal_iter
->Finish();
1313 options
.max_sequential_skip_in_iterations
= 1000;
1314 ro
.max_skippable_internal_keys
= i
;
1315 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1316 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1317 internal_iter
, 2 * i
+ 1, options
.max_sequential_skip_in_iterations
,
1318 nullptr /*read_callback*/));
1320 db_iter
->SeekToFirst();
1321 ASSERT_TRUE(db_iter
->Valid());
1322 ASSERT_EQ(db_iter
->key().ToString(), "a");
1323 ASSERT_EQ(db_iter
->value().ToString(), "val_a");
1326 ASSERT_TRUE(!db_iter
->Valid());
1327 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1329 db_iter
->SeekToLast();
1330 ASSERT_TRUE(db_iter
->Valid());
1331 ASSERT_EQ(db_iter
->key().ToString(), "c");
1332 ASSERT_EQ(db_iter
->value().ToString(), "val_c");
1335 ASSERT_TRUE(!db_iter
->Valid());
1336 ASSERT_TRUE(db_iter
->status().IsIncomplete());
1341 TEST_F(DBIteratorTest
, DBIterator1
) {
1344 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1346 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1347 internal_iter
->AddPut("a", "0");
1348 internal_iter
->AddPut("b", "0");
1349 internal_iter
->AddDeletion("b");
1350 internal_iter
->AddMerge("a", "1");
1351 internal_iter
->AddMerge("b", "2");
1352 internal_iter
->Finish();
1354 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1355 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
1356 BytewiseComparator(), internal_iter
, 1,
1357 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
1358 db_iter
->SeekToFirst();
1359 ASSERT_TRUE(db_iter
->Valid());
1360 ASSERT_EQ(db_iter
->key().ToString(), "a");
1361 ASSERT_EQ(db_iter
->value().ToString(), "0");
1363 ASSERT_TRUE(db_iter
->Valid());
1364 ASSERT_EQ(db_iter
->key().ToString(), "b");
1366 ASSERT_FALSE(db_iter
->Valid());
1369 TEST_F(DBIteratorTest
, DBIterator2
) {
1372 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1374 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1375 internal_iter
->AddPut("a", "0");
1376 internal_iter
->AddPut("b", "0");
1377 internal_iter
->AddDeletion("b");
1378 internal_iter
->AddMerge("a", "1");
1379 internal_iter
->AddMerge("b", "2");
1380 internal_iter
->Finish();
1382 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1383 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
1384 BytewiseComparator(), internal_iter
, 0,
1385 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
1386 db_iter
->SeekToFirst();
1387 ASSERT_TRUE(db_iter
->Valid());
1388 ASSERT_EQ(db_iter
->key().ToString(), "a");
1389 ASSERT_EQ(db_iter
->value().ToString(), "0");
1391 ASSERT_TRUE(!db_iter
->Valid());
1394 TEST_F(DBIteratorTest
, DBIterator3
) {
1397 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1399 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1400 internal_iter
->AddPut("a", "0");
1401 internal_iter
->AddPut("b", "0");
1402 internal_iter
->AddDeletion("b");
1403 internal_iter
->AddMerge("a", "1");
1404 internal_iter
->AddMerge("b", "2");
1405 internal_iter
->Finish();
1407 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1408 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
1409 BytewiseComparator(), internal_iter
, 2,
1410 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
1411 db_iter
->SeekToFirst();
1412 ASSERT_TRUE(db_iter
->Valid());
1413 ASSERT_EQ(db_iter
->key().ToString(), "a");
1414 ASSERT_EQ(db_iter
->value().ToString(), "0");
1416 ASSERT_TRUE(!db_iter
->Valid());
1419 TEST_F(DBIteratorTest
, DBIterator4
) {
1422 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1424 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1425 internal_iter
->AddPut("a", "0");
1426 internal_iter
->AddPut("b", "0");
1427 internal_iter
->AddDeletion("b");
1428 internal_iter
->AddMerge("a", "1");
1429 internal_iter
->AddMerge("b", "2");
1430 internal_iter
->Finish();
1432 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1433 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
1434 BytewiseComparator(), internal_iter
, 4,
1435 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
1436 db_iter
->SeekToFirst();
1437 ASSERT_TRUE(db_iter
->Valid());
1438 ASSERT_EQ(db_iter
->key().ToString(), "a");
1439 ASSERT_EQ(db_iter
->value().ToString(), "0,1");
1441 ASSERT_TRUE(db_iter
->Valid());
1442 ASSERT_EQ(db_iter
->key().ToString(), "b");
1443 ASSERT_EQ(db_iter
->value().ToString(), "2");
1445 ASSERT_TRUE(!db_iter
->Valid());
1448 TEST_F(DBIteratorTest
, DBIterator5
) {
1451 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1452 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
1453 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
1456 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1457 internal_iter
->AddMerge("a", "merge_1");
1458 internal_iter
->AddMerge("a", "merge_2");
1459 internal_iter
->AddMerge("a", "merge_3");
1460 internal_iter
->AddPut("a", "put_1");
1461 internal_iter
->AddMerge("a", "merge_4");
1462 internal_iter
->AddMerge("a", "merge_5");
1463 internal_iter
->AddMerge("a", "merge_6");
1464 internal_iter
->Finish();
1466 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1467 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1468 internal_iter
, 0, options
.max_sequential_skip_in_iterations
,
1469 nullptr /*read_callback*/));
1470 db_iter
->SeekToLast();
1471 ASSERT_TRUE(db_iter
->Valid());
1472 ASSERT_EQ(db_iter
->key().ToString(), "a");
1473 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
1475 ASSERT_TRUE(!db_iter
->Valid());
1479 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1480 internal_iter
->AddMerge("a", "merge_1");
1481 internal_iter
->AddMerge("a", "merge_2");
1482 internal_iter
->AddMerge("a", "merge_3");
1483 internal_iter
->AddPut("a", "put_1");
1484 internal_iter
->AddMerge("a", "merge_4");
1485 internal_iter
->AddMerge("a", "merge_5");
1486 internal_iter
->AddMerge("a", "merge_6");
1487 internal_iter
->Finish();
1489 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1490 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1491 internal_iter
, 1, options
.max_sequential_skip_in_iterations
,
1492 nullptr /*read_callback*/));
1493 db_iter
->SeekToLast();
1494 ASSERT_TRUE(db_iter
->Valid());
1495 ASSERT_EQ(db_iter
->key().ToString(), "a");
1496 ASSERT_EQ(db_iter
->value().ToString(), "merge_1,merge_2");
1498 ASSERT_TRUE(!db_iter
->Valid());
1502 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1503 internal_iter
->AddMerge("a", "merge_1");
1504 internal_iter
->AddMerge("a", "merge_2");
1505 internal_iter
->AddMerge("a", "merge_3");
1506 internal_iter
->AddPut("a", "put_1");
1507 internal_iter
->AddMerge("a", "merge_4");
1508 internal_iter
->AddMerge("a", "merge_5");
1509 internal_iter
->AddMerge("a", "merge_6");
1510 internal_iter
->Finish();
1512 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1513 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1514 internal_iter
, 2, options
.max_sequential_skip_in_iterations
,
1515 nullptr /*read_callback*/));
1516 db_iter
->SeekToLast();
1517 ASSERT_TRUE(db_iter
->Valid());
1518 ASSERT_EQ(db_iter
->key().ToString(), "a");
1519 ASSERT_EQ(db_iter
->value().ToString(), "merge_1,merge_2,merge_3");
1521 ASSERT_TRUE(!db_iter
->Valid());
1525 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1526 internal_iter
->AddMerge("a", "merge_1");
1527 internal_iter
->AddMerge("a", "merge_2");
1528 internal_iter
->AddMerge("a", "merge_3");
1529 internal_iter
->AddPut("a", "put_1");
1530 internal_iter
->AddMerge("a", "merge_4");
1531 internal_iter
->AddMerge("a", "merge_5");
1532 internal_iter
->AddMerge("a", "merge_6");
1533 internal_iter
->Finish();
1535 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1536 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1537 internal_iter
, 3, options
.max_sequential_skip_in_iterations
,
1538 nullptr /*read_callback*/));
1539 db_iter
->SeekToLast();
1540 ASSERT_TRUE(db_iter
->Valid());
1541 ASSERT_EQ(db_iter
->key().ToString(), "a");
1542 ASSERT_EQ(db_iter
->value().ToString(), "put_1");
1544 ASSERT_TRUE(!db_iter
->Valid());
1548 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1549 internal_iter
->AddMerge("a", "merge_1");
1550 internal_iter
->AddMerge("a", "merge_2");
1551 internal_iter
->AddMerge("a", "merge_3");
1552 internal_iter
->AddPut("a", "put_1");
1553 internal_iter
->AddMerge("a", "merge_4");
1554 internal_iter
->AddMerge("a", "merge_5");
1555 internal_iter
->AddMerge("a", "merge_6");
1556 internal_iter
->Finish();
1558 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1559 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1560 internal_iter
, 4, options
.max_sequential_skip_in_iterations
,
1561 nullptr /*read_callback*/));
1562 db_iter
->SeekToLast();
1563 ASSERT_TRUE(db_iter
->Valid());
1564 ASSERT_EQ(db_iter
->key().ToString(), "a");
1565 ASSERT_EQ(db_iter
->value().ToString(), "put_1,merge_4");
1567 ASSERT_TRUE(!db_iter
->Valid());
1571 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1572 internal_iter
->AddMerge("a", "merge_1");
1573 internal_iter
->AddMerge("a", "merge_2");
1574 internal_iter
->AddMerge("a", "merge_3");
1575 internal_iter
->AddPut("a", "put_1");
1576 internal_iter
->AddMerge("a", "merge_4");
1577 internal_iter
->AddMerge("a", "merge_5");
1578 internal_iter
->AddMerge("a", "merge_6");
1579 internal_iter
->Finish();
1581 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1582 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1583 internal_iter
, 5, options
.max_sequential_skip_in_iterations
,
1584 nullptr /*read_callback*/));
1585 db_iter
->SeekToLast();
1586 ASSERT_TRUE(db_iter
->Valid());
1587 ASSERT_EQ(db_iter
->key().ToString(), "a");
1588 ASSERT_EQ(db_iter
->value().ToString(), "put_1,merge_4,merge_5");
1590 ASSERT_TRUE(!db_iter
->Valid());
1594 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1595 internal_iter
->AddMerge("a", "merge_1");
1596 internal_iter
->AddMerge("a", "merge_2");
1597 internal_iter
->AddMerge("a", "merge_3");
1598 internal_iter
->AddPut("a", "put_1");
1599 internal_iter
->AddMerge("a", "merge_4");
1600 internal_iter
->AddMerge("a", "merge_5");
1601 internal_iter
->AddMerge("a", "merge_6");
1602 internal_iter
->Finish();
1604 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1605 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1606 internal_iter
, 6, options
.max_sequential_skip_in_iterations
,
1607 nullptr /*read_callback*/));
1608 db_iter
->SeekToLast();
1609 ASSERT_TRUE(db_iter
->Valid());
1610 ASSERT_EQ(db_iter
->key().ToString(), "a");
1611 ASSERT_EQ(db_iter
->value().ToString(), "put_1,merge_4,merge_5,merge_6");
1613 ASSERT_TRUE(!db_iter
->Valid());
1617 // put, singledelete, merge
1618 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1619 internal_iter
->AddPut("a", "val_a");
1620 internal_iter
->AddSingleDeletion("a");
1621 internal_iter
->AddMerge("a", "merge_1");
1622 internal_iter
->AddMerge("a", "merge_2");
1623 internal_iter
->AddPut("b", "val_b");
1624 internal_iter
->Finish();
1625 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1626 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1627 internal_iter
, 10, options
.max_sequential_skip_in_iterations
,
1628 nullptr /*read_callback*/));
1630 ASSERT_TRUE(db_iter
->Valid());
1631 ASSERT_EQ(db_iter
->key().ToString(), "b");
1633 ASSERT_TRUE(db_iter
->Valid());
1634 ASSERT_EQ(db_iter
->key().ToString(), "a");
1638 TEST_F(DBIteratorTest
, DBIterator6
) {
1641 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1642 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
1643 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
1646 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1647 internal_iter
->AddMerge("a", "merge_1");
1648 internal_iter
->AddMerge("a", "merge_2");
1649 internal_iter
->AddMerge("a", "merge_3");
1650 internal_iter
->AddDeletion("a");
1651 internal_iter
->AddMerge("a", "merge_4");
1652 internal_iter
->AddMerge("a", "merge_5");
1653 internal_iter
->AddMerge("a", "merge_6");
1654 internal_iter
->Finish();
1656 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1657 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1658 internal_iter
, 0, options
.max_sequential_skip_in_iterations
,
1659 nullptr /*read_callback*/));
1660 db_iter
->SeekToLast();
1661 ASSERT_TRUE(db_iter
->Valid());
1662 ASSERT_EQ(db_iter
->key().ToString(), "a");
1663 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
1665 ASSERT_TRUE(!db_iter
->Valid());
1669 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1670 internal_iter
->AddMerge("a", "merge_1");
1671 internal_iter
->AddMerge("a", "merge_2");
1672 internal_iter
->AddMerge("a", "merge_3");
1673 internal_iter
->AddDeletion("a");
1674 internal_iter
->AddMerge("a", "merge_4");
1675 internal_iter
->AddMerge("a", "merge_5");
1676 internal_iter
->AddMerge("a", "merge_6");
1677 internal_iter
->Finish();
1679 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1680 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1681 internal_iter
, 1, options
.max_sequential_skip_in_iterations
,
1682 nullptr /*read_callback*/));
1683 db_iter
->SeekToLast();
1684 ASSERT_TRUE(db_iter
->Valid());
1685 ASSERT_EQ(db_iter
->key().ToString(), "a");
1686 ASSERT_EQ(db_iter
->value().ToString(), "merge_1,merge_2");
1688 ASSERT_TRUE(!db_iter
->Valid());
1692 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1693 internal_iter
->AddMerge("a", "merge_1");
1694 internal_iter
->AddMerge("a", "merge_2");
1695 internal_iter
->AddMerge("a", "merge_3");
1696 internal_iter
->AddDeletion("a");
1697 internal_iter
->AddMerge("a", "merge_4");
1698 internal_iter
->AddMerge("a", "merge_5");
1699 internal_iter
->AddMerge("a", "merge_6");
1700 internal_iter
->Finish();
1702 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1703 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1704 internal_iter
, 2, options
.max_sequential_skip_in_iterations
,
1705 nullptr /*read_callback*/));
1706 db_iter
->SeekToLast();
1707 ASSERT_TRUE(db_iter
->Valid());
1708 ASSERT_EQ(db_iter
->key().ToString(), "a");
1709 ASSERT_EQ(db_iter
->value().ToString(), "merge_1,merge_2,merge_3");
1711 ASSERT_TRUE(!db_iter
->Valid());
1715 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1716 internal_iter
->AddMerge("a", "merge_1");
1717 internal_iter
->AddMerge("a", "merge_2");
1718 internal_iter
->AddMerge("a", "merge_3");
1719 internal_iter
->AddDeletion("a");
1720 internal_iter
->AddMerge("a", "merge_4");
1721 internal_iter
->AddMerge("a", "merge_5");
1722 internal_iter
->AddMerge("a", "merge_6");
1723 internal_iter
->Finish();
1725 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1726 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1727 internal_iter
, 3, options
.max_sequential_skip_in_iterations
,
1728 nullptr /*read_callback*/));
1729 db_iter
->SeekToLast();
1730 ASSERT_TRUE(!db_iter
->Valid());
1734 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1735 internal_iter
->AddMerge("a", "merge_1");
1736 internal_iter
->AddMerge("a", "merge_2");
1737 internal_iter
->AddMerge("a", "merge_3");
1738 internal_iter
->AddDeletion("a");
1739 internal_iter
->AddMerge("a", "merge_4");
1740 internal_iter
->AddMerge("a", "merge_5");
1741 internal_iter
->AddMerge("a", "merge_6");
1742 internal_iter
->Finish();
1744 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1745 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1746 internal_iter
, 4, options
.max_sequential_skip_in_iterations
,
1747 nullptr /*read_callback*/));
1748 db_iter
->SeekToLast();
1749 ASSERT_TRUE(db_iter
->Valid());
1750 ASSERT_EQ(db_iter
->key().ToString(), "a");
1751 ASSERT_EQ(db_iter
->value().ToString(), "merge_4");
1753 ASSERT_TRUE(!db_iter
->Valid());
1757 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1758 internal_iter
->AddMerge("a", "merge_1");
1759 internal_iter
->AddMerge("a", "merge_2");
1760 internal_iter
->AddMerge("a", "merge_3");
1761 internal_iter
->AddDeletion("a");
1762 internal_iter
->AddMerge("a", "merge_4");
1763 internal_iter
->AddMerge("a", "merge_5");
1764 internal_iter
->AddMerge("a", "merge_6");
1765 internal_iter
->Finish();
1767 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1768 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1769 internal_iter
, 5, options
.max_sequential_skip_in_iterations
,
1770 nullptr /*read_callback*/));
1771 db_iter
->SeekToLast();
1772 ASSERT_TRUE(db_iter
->Valid());
1773 ASSERT_EQ(db_iter
->key().ToString(), "a");
1774 ASSERT_EQ(db_iter
->value().ToString(), "merge_4,merge_5");
1776 ASSERT_TRUE(!db_iter
->Valid());
1780 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1781 internal_iter
->AddMerge("a", "merge_1");
1782 internal_iter
->AddMerge("a", "merge_2");
1783 internal_iter
->AddMerge("a", "merge_3");
1784 internal_iter
->AddDeletion("a");
1785 internal_iter
->AddMerge("a", "merge_4");
1786 internal_iter
->AddMerge("a", "merge_5");
1787 internal_iter
->AddMerge("a", "merge_6");
1788 internal_iter
->Finish();
1790 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1791 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1792 internal_iter
, 6, options
.max_sequential_skip_in_iterations
,
1793 nullptr /*read_callback*/));
1794 db_iter
->SeekToLast();
1795 ASSERT_TRUE(db_iter
->Valid());
1796 ASSERT_EQ(db_iter
->key().ToString(), "a");
1797 ASSERT_EQ(db_iter
->value().ToString(), "merge_4,merge_5,merge_6");
1799 ASSERT_TRUE(!db_iter
->Valid());
1803 TEST_F(DBIteratorTest
, DBIterator7
) {
1806 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
1807 ImmutableCFOptions cf_options
= ImmutableCFOptions(options
);
1808 MutableCFOptions mutable_cf_options
= MutableCFOptions(options
);
1811 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1812 internal_iter
->AddMerge("a", "merge_1");
1813 internal_iter
->AddPut("b", "val");
1814 internal_iter
->AddMerge("b", "merge_2");
1816 internal_iter
->AddDeletion("b");
1817 internal_iter
->AddMerge("b", "merge_3");
1819 internal_iter
->AddMerge("c", "merge_4");
1820 internal_iter
->AddMerge("c", "merge_5");
1822 internal_iter
->AddDeletion("b");
1823 internal_iter
->AddMerge("b", "merge_6");
1824 internal_iter
->AddMerge("b", "merge_7");
1825 internal_iter
->AddMerge("b", "merge_8");
1826 internal_iter
->AddMerge("b", "merge_9");
1827 internal_iter
->AddMerge("b", "merge_10");
1828 internal_iter
->AddMerge("b", "merge_11");
1830 internal_iter
->AddDeletion("c");
1831 internal_iter
->Finish();
1833 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1834 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1835 internal_iter
, 0, options
.max_sequential_skip_in_iterations
,
1836 nullptr /*read_callback*/));
1837 db_iter
->SeekToLast();
1838 ASSERT_TRUE(db_iter
->Valid());
1839 ASSERT_EQ(db_iter
->key().ToString(), "a");
1840 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
1842 ASSERT_TRUE(!db_iter
->Valid());
1846 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1847 internal_iter
->AddMerge("a", "merge_1");
1848 internal_iter
->AddPut("b", "val");
1849 internal_iter
->AddMerge("b", "merge_2");
1851 internal_iter
->AddDeletion("b");
1852 internal_iter
->AddMerge("b", "merge_3");
1854 internal_iter
->AddMerge("c", "merge_4");
1855 internal_iter
->AddMerge("c", "merge_5");
1857 internal_iter
->AddDeletion("b");
1858 internal_iter
->AddMerge("b", "merge_6");
1859 internal_iter
->AddMerge("b", "merge_7");
1860 internal_iter
->AddMerge("b", "merge_8");
1861 internal_iter
->AddMerge("b", "merge_9");
1862 internal_iter
->AddMerge("b", "merge_10");
1863 internal_iter
->AddMerge("b", "merge_11");
1865 internal_iter
->AddDeletion("c");
1866 internal_iter
->Finish();
1868 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1869 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1870 internal_iter
, 2, options
.max_sequential_skip_in_iterations
,
1871 nullptr /*read_callback*/));
1872 db_iter
->SeekToLast();
1873 ASSERT_TRUE(db_iter
->Valid());
1875 ASSERT_EQ(db_iter
->key().ToString(), "b");
1876 ASSERT_EQ(db_iter
->value().ToString(), "val,merge_2");
1878 ASSERT_TRUE(db_iter
->Valid());
1880 ASSERT_EQ(db_iter
->key().ToString(), "a");
1881 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
1883 ASSERT_TRUE(!db_iter
->Valid());
1887 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1888 internal_iter
->AddMerge("a", "merge_1");
1889 internal_iter
->AddPut("b", "val");
1890 internal_iter
->AddMerge("b", "merge_2");
1892 internal_iter
->AddDeletion("b");
1893 internal_iter
->AddMerge("b", "merge_3");
1895 internal_iter
->AddMerge("c", "merge_4");
1896 internal_iter
->AddMerge("c", "merge_5");
1898 internal_iter
->AddDeletion("b");
1899 internal_iter
->AddMerge("b", "merge_6");
1900 internal_iter
->AddMerge("b", "merge_7");
1901 internal_iter
->AddMerge("b", "merge_8");
1902 internal_iter
->AddMerge("b", "merge_9");
1903 internal_iter
->AddMerge("b", "merge_10");
1904 internal_iter
->AddMerge("b", "merge_11");
1906 internal_iter
->AddDeletion("c");
1907 internal_iter
->Finish();
1909 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1910 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1911 internal_iter
, 4, options
.max_sequential_skip_in_iterations
,
1912 nullptr /*read_callback*/));
1913 db_iter
->SeekToLast();
1914 ASSERT_TRUE(db_iter
->Valid());
1916 ASSERT_EQ(db_iter
->key().ToString(), "b");
1917 ASSERT_EQ(db_iter
->value().ToString(), "merge_3");
1919 ASSERT_TRUE(db_iter
->Valid());
1921 ASSERT_EQ(db_iter
->key().ToString(), "a");
1922 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
1924 ASSERT_TRUE(!db_iter
->Valid());
1928 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1929 internal_iter
->AddMerge("a", "merge_1");
1930 internal_iter
->AddPut("b", "val");
1931 internal_iter
->AddMerge("b", "merge_2");
1933 internal_iter
->AddDeletion("b");
1934 internal_iter
->AddMerge("b", "merge_3");
1936 internal_iter
->AddMerge("c", "merge_4");
1937 internal_iter
->AddMerge("c", "merge_5");
1939 internal_iter
->AddDeletion("b");
1940 internal_iter
->AddMerge("b", "merge_6");
1941 internal_iter
->AddMerge("b", "merge_7");
1942 internal_iter
->AddMerge("b", "merge_8");
1943 internal_iter
->AddMerge("b", "merge_9");
1944 internal_iter
->AddMerge("b", "merge_10");
1945 internal_iter
->AddMerge("b", "merge_11");
1947 internal_iter
->AddDeletion("c");
1948 internal_iter
->Finish();
1950 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1951 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1952 internal_iter
, 5, options
.max_sequential_skip_in_iterations
,
1953 nullptr /*read_callback*/));
1954 db_iter
->SeekToLast();
1955 ASSERT_TRUE(db_iter
->Valid());
1957 ASSERT_EQ(db_iter
->key().ToString(), "c");
1958 ASSERT_EQ(db_iter
->value().ToString(), "merge_4");
1961 ASSERT_TRUE(db_iter
->Valid());
1962 ASSERT_EQ(db_iter
->key().ToString(), "b");
1963 ASSERT_EQ(db_iter
->value().ToString(), "merge_3");
1965 ASSERT_TRUE(db_iter
->Valid());
1967 ASSERT_EQ(db_iter
->key().ToString(), "a");
1968 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
1970 ASSERT_TRUE(!db_iter
->Valid());
1974 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
1975 internal_iter
->AddMerge("a", "merge_1");
1976 internal_iter
->AddPut("b", "val");
1977 internal_iter
->AddMerge("b", "merge_2");
1979 internal_iter
->AddDeletion("b");
1980 internal_iter
->AddMerge("b", "merge_3");
1982 internal_iter
->AddMerge("c", "merge_4");
1983 internal_iter
->AddMerge("c", "merge_5");
1985 internal_iter
->AddDeletion("b");
1986 internal_iter
->AddMerge("b", "merge_6");
1987 internal_iter
->AddMerge("b", "merge_7");
1988 internal_iter
->AddMerge("b", "merge_8");
1989 internal_iter
->AddMerge("b", "merge_9");
1990 internal_iter
->AddMerge("b", "merge_10");
1991 internal_iter
->AddMerge("b", "merge_11");
1993 internal_iter
->AddDeletion("c");
1994 internal_iter
->Finish();
1996 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
1997 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
1998 internal_iter
, 6, options
.max_sequential_skip_in_iterations
,
1999 nullptr /*read_callback*/));
2000 db_iter
->SeekToLast();
2001 ASSERT_TRUE(db_iter
->Valid());
2003 ASSERT_EQ(db_iter
->key().ToString(), "c");
2004 ASSERT_EQ(db_iter
->value().ToString(), "merge_4,merge_5");
2006 ASSERT_TRUE(db_iter
->Valid());
2008 ASSERT_TRUE(db_iter
->Valid());
2009 ASSERT_EQ(db_iter
->key().ToString(), "b");
2010 ASSERT_EQ(db_iter
->value().ToString(), "merge_3");
2012 ASSERT_TRUE(db_iter
->Valid());
2014 ASSERT_EQ(db_iter
->key().ToString(), "a");
2015 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
2017 ASSERT_TRUE(!db_iter
->Valid());
2021 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2022 internal_iter
->AddMerge("a", "merge_1");
2023 internal_iter
->AddPut("b", "val");
2024 internal_iter
->AddMerge("b", "merge_2");
2026 internal_iter
->AddDeletion("b");
2027 internal_iter
->AddMerge("b", "merge_3");
2029 internal_iter
->AddMerge("c", "merge_4");
2030 internal_iter
->AddMerge("c", "merge_5");
2032 internal_iter
->AddDeletion("b");
2033 internal_iter
->AddMerge("b", "merge_6");
2034 internal_iter
->AddMerge("b", "merge_7");
2035 internal_iter
->AddMerge("b", "merge_8");
2036 internal_iter
->AddMerge("b", "merge_9");
2037 internal_iter
->AddMerge("b", "merge_10");
2038 internal_iter
->AddMerge("b", "merge_11");
2040 internal_iter
->AddDeletion("c");
2041 internal_iter
->Finish();
2043 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2044 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
2045 internal_iter
, 7, options
.max_sequential_skip_in_iterations
,
2046 nullptr /*read_callback*/));
2047 db_iter
->SeekToLast();
2048 ASSERT_TRUE(db_iter
->Valid());
2050 ASSERT_EQ(db_iter
->key().ToString(), "c");
2051 ASSERT_EQ(db_iter
->value().ToString(), "merge_4,merge_5");
2053 ASSERT_TRUE(db_iter
->Valid());
2055 ASSERT_EQ(db_iter
->key().ToString(), "a");
2056 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
2058 ASSERT_TRUE(!db_iter
->Valid());
2062 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2063 internal_iter
->AddMerge("a", "merge_1");
2064 internal_iter
->AddPut("b", "val");
2065 internal_iter
->AddMerge("b", "merge_2");
2067 internal_iter
->AddDeletion("b");
2068 internal_iter
->AddMerge("b", "merge_3");
2070 internal_iter
->AddMerge("c", "merge_4");
2071 internal_iter
->AddMerge("c", "merge_5");
2073 internal_iter
->AddDeletion("b");
2074 internal_iter
->AddMerge("b", "merge_6");
2075 internal_iter
->AddMerge("b", "merge_7");
2076 internal_iter
->AddMerge("b", "merge_8");
2077 internal_iter
->AddMerge("b", "merge_9");
2078 internal_iter
->AddMerge("b", "merge_10");
2079 internal_iter
->AddMerge("b", "merge_11");
2081 internal_iter
->AddDeletion("c");
2082 internal_iter
->Finish();
2084 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2085 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
2086 internal_iter
, 9, options
.max_sequential_skip_in_iterations
,
2087 nullptr /*read_callback*/));
2088 db_iter
->SeekToLast();
2089 ASSERT_TRUE(db_iter
->Valid());
2091 ASSERT_EQ(db_iter
->key().ToString(), "c");
2092 ASSERT_EQ(db_iter
->value().ToString(), "merge_4,merge_5");
2094 ASSERT_TRUE(db_iter
->Valid());
2096 ASSERT_TRUE(db_iter
->Valid());
2097 ASSERT_EQ(db_iter
->key().ToString(), "b");
2098 ASSERT_EQ(db_iter
->value().ToString(), "merge_6,merge_7");
2100 ASSERT_TRUE(db_iter
->Valid());
2102 ASSERT_EQ(db_iter
->key().ToString(), "a");
2103 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
2105 ASSERT_TRUE(!db_iter
->Valid());
2109 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2110 internal_iter
->AddMerge("a", "merge_1");
2111 internal_iter
->AddPut("b", "val");
2112 internal_iter
->AddMerge("b", "merge_2");
2114 internal_iter
->AddDeletion("b");
2115 internal_iter
->AddMerge("b", "merge_3");
2117 internal_iter
->AddMerge("c", "merge_4");
2118 internal_iter
->AddMerge("c", "merge_5");
2120 internal_iter
->AddDeletion("b");
2121 internal_iter
->AddMerge("b", "merge_6");
2122 internal_iter
->AddMerge("b", "merge_7");
2123 internal_iter
->AddMerge("b", "merge_8");
2124 internal_iter
->AddMerge("b", "merge_9");
2125 internal_iter
->AddMerge("b", "merge_10");
2126 internal_iter
->AddMerge("b", "merge_11");
2128 internal_iter
->AddDeletion("c");
2129 internal_iter
->Finish();
2131 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2132 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
2133 internal_iter
, 13, options
.max_sequential_skip_in_iterations
,
2134 nullptr /*read_callback*/));
2135 db_iter
->SeekToLast();
2136 ASSERT_TRUE(db_iter
->Valid());
2138 ASSERT_EQ(db_iter
->key().ToString(), "c");
2139 ASSERT_EQ(db_iter
->value().ToString(), "merge_4,merge_5");
2141 ASSERT_TRUE(db_iter
->Valid());
2143 ASSERT_TRUE(db_iter
->Valid());
2144 ASSERT_EQ(db_iter
->key().ToString(), "b");
2145 ASSERT_EQ(db_iter
->value().ToString(),
2146 "merge_6,merge_7,merge_8,merge_9,merge_10,merge_11");
2148 ASSERT_TRUE(db_iter
->Valid());
2150 ASSERT_EQ(db_iter
->key().ToString(), "a");
2151 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
2153 ASSERT_TRUE(!db_iter
->Valid());
2157 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2158 internal_iter
->AddMerge("a", "merge_1");
2159 internal_iter
->AddPut("b", "val");
2160 internal_iter
->AddMerge("b", "merge_2");
2162 internal_iter
->AddDeletion("b");
2163 internal_iter
->AddMerge("b", "merge_3");
2165 internal_iter
->AddMerge("c", "merge_4");
2166 internal_iter
->AddMerge("c", "merge_5");
2168 internal_iter
->AddDeletion("b");
2169 internal_iter
->AddMerge("b", "merge_6");
2170 internal_iter
->AddMerge("b", "merge_7");
2171 internal_iter
->AddMerge("b", "merge_8");
2172 internal_iter
->AddMerge("b", "merge_9");
2173 internal_iter
->AddMerge("b", "merge_10");
2174 internal_iter
->AddMerge("b", "merge_11");
2176 internal_iter
->AddDeletion("c");
2177 internal_iter
->Finish();
2179 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2180 env_
, ro
, cf_options
, mutable_cf_options
, BytewiseComparator(),
2181 internal_iter
, 14, options
.max_sequential_skip_in_iterations
,
2182 nullptr /*read_callback*/));
2183 db_iter
->SeekToLast();
2184 ASSERT_TRUE(db_iter
->Valid());
2186 ASSERT_EQ(db_iter
->key().ToString(), "b");
2187 ASSERT_EQ(db_iter
->value().ToString(),
2188 "merge_6,merge_7,merge_8,merge_9,merge_10,merge_11");
2190 ASSERT_TRUE(db_iter
->Valid());
2192 ASSERT_EQ(db_iter
->key().ToString(), "a");
2193 ASSERT_EQ(db_iter
->value().ToString(), "merge_1");
2195 ASSERT_TRUE(!db_iter
->Valid());
2199 TEST_F(DBIteratorTest
, DBIterator8
) {
2202 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
2204 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2205 internal_iter
->AddDeletion("a");
2206 internal_iter
->AddPut("a", "0");
2207 internal_iter
->AddPut("b", "0");
2208 internal_iter
->Finish();
2210 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2211 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2212 BytewiseComparator(), internal_iter
, 10,
2213 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
2214 db_iter
->SeekToLast();
2215 ASSERT_TRUE(db_iter
->Valid());
2216 ASSERT_EQ(db_iter
->key().ToString(), "b");
2217 ASSERT_EQ(db_iter
->value().ToString(), "0");
2220 ASSERT_TRUE(db_iter
->Valid());
2221 ASSERT_EQ(db_iter
->key().ToString(), "a");
2222 ASSERT_EQ(db_iter
->value().ToString(), "0");
2225 // TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
2226 // return the biggest element smaller than the seek key.
2227 TEST_F(DBIteratorTest
, DBIterator9
) {
2230 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
2232 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2233 internal_iter
->AddMerge("a", "merge_1");
2234 internal_iter
->AddMerge("a", "merge_2");
2235 internal_iter
->AddMerge("b", "merge_3");
2236 internal_iter
->AddMerge("b", "merge_4");
2237 internal_iter
->AddMerge("d", "merge_5");
2238 internal_iter
->AddMerge("d", "merge_6");
2239 internal_iter
->Finish();
2241 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2242 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2243 BytewiseComparator(), internal_iter
, 10,
2244 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
2246 db_iter
->SeekToLast();
2247 ASSERT_TRUE(db_iter
->Valid());
2249 ASSERT_TRUE(db_iter
->Valid());
2250 ASSERT_EQ(db_iter
->key().ToString(), "b");
2251 ASSERT_EQ(db_iter
->value().ToString(), "merge_3,merge_4");
2253 ASSERT_TRUE(db_iter
->Valid());
2254 ASSERT_EQ(db_iter
->key().ToString(), "d");
2255 ASSERT_EQ(db_iter
->value().ToString(), "merge_5,merge_6");
2258 ASSERT_TRUE(db_iter
->Valid());
2259 ASSERT_EQ(db_iter
->key().ToString(), "b");
2260 ASSERT_EQ(db_iter
->value().ToString(), "merge_3,merge_4");
2262 ASSERT_TRUE(db_iter
->Valid());
2263 ASSERT_EQ(db_iter
->key().ToString(), "a");
2264 ASSERT_EQ(db_iter
->value().ToString(), "merge_1,merge_2");
2266 db_iter
->SeekForPrev("b");
2267 ASSERT_TRUE(db_iter
->Valid());
2268 ASSERT_EQ(db_iter
->key().ToString(), "b");
2269 ASSERT_EQ(db_iter
->value().ToString(), "merge_3,merge_4");
2271 ASSERT_TRUE(db_iter
->Valid());
2272 ASSERT_EQ(db_iter
->key().ToString(), "d");
2273 ASSERT_EQ(db_iter
->value().ToString(), "merge_5,merge_6");
2276 ASSERT_TRUE(db_iter
->Valid());
2277 ASSERT_EQ(db_iter
->key().ToString(), "d");
2278 ASSERT_EQ(db_iter
->value().ToString(), "merge_5,merge_6");
2280 ASSERT_TRUE(db_iter
->Valid());
2281 ASSERT_EQ(db_iter
->key().ToString(), "b");
2282 ASSERT_EQ(db_iter
->value().ToString(), "merge_3,merge_4");
2284 db_iter
->SeekForPrev("c");
2285 ASSERT_TRUE(db_iter
->Valid());
2286 ASSERT_EQ(db_iter
->key().ToString(), "b");
2287 ASSERT_EQ(db_iter
->value().ToString(), "merge_3,merge_4");
2289 ASSERT_TRUE(db_iter
->Valid());
2290 ASSERT_EQ(db_iter
->key().ToString(), "d");
2291 ASSERT_EQ(db_iter
->value().ToString(), "merge_5,merge_6");
2295 // TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
2296 // return the biggest element smaller than the seek key.
2297 TEST_F(DBIteratorTest
, DBIterator10
) {
2301 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2302 internal_iter
->AddPut("a", "1");
2303 internal_iter
->AddPut("b", "2");
2304 internal_iter
->AddPut("c", "3");
2305 internal_iter
->AddPut("d", "4");
2306 internal_iter
->Finish();
2308 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2309 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2310 BytewiseComparator(), internal_iter
, 10,
2311 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
2314 ASSERT_TRUE(db_iter
->Valid());
2316 ASSERT_TRUE(db_iter
->Valid());
2317 ASSERT_EQ(db_iter
->key().ToString(), "b");
2318 ASSERT_EQ(db_iter
->value().ToString(), "2");
2321 ASSERT_TRUE(db_iter
->Valid());
2322 ASSERT_EQ(db_iter
->key().ToString(), "c");
2323 ASSERT_EQ(db_iter
->value().ToString(), "3");
2325 db_iter
->SeekForPrev("c");
2326 ASSERT_TRUE(db_iter
->Valid());
2328 ASSERT_TRUE(db_iter
->Valid());
2329 ASSERT_EQ(db_iter
->key().ToString(), "d");
2330 ASSERT_EQ(db_iter
->value().ToString(), "4");
2333 ASSERT_TRUE(db_iter
->Valid());
2334 ASSERT_EQ(db_iter
->key().ToString(), "c");
2335 ASSERT_EQ(db_iter
->value().ToString(), "3");
2338 TEST_F(DBIteratorTest
, SeekToLastOccurrenceSeq0
) {
2341 options
.merge_operator
= nullptr;
2343 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2344 internal_iter
->AddPut("a", "1");
2345 internal_iter
->AddPut("b", "2");
2346 internal_iter
->Finish();
2348 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2349 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2350 BytewiseComparator(), internal_iter
, 10, 0 /* force seek */,
2351 nullptr /*read_callback*/));
2352 db_iter
->SeekToFirst();
2353 ASSERT_TRUE(db_iter
->Valid());
2354 ASSERT_EQ(db_iter
->key().ToString(), "a");
2355 ASSERT_EQ(db_iter
->value().ToString(), "1");
2357 ASSERT_TRUE(db_iter
->Valid());
2358 ASSERT_EQ(db_iter
->key().ToString(), "b");
2359 ASSERT_EQ(db_iter
->value().ToString(), "2");
2361 ASSERT_FALSE(db_iter
->Valid());
2364 TEST_F(DBIteratorTest
, DBIterator11
) {
2367 options
.merge_operator
= MergeOperators::CreateFromStringId("stringappend");
2369 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2370 internal_iter
->AddPut("a", "0");
2371 internal_iter
->AddPut("b", "0");
2372 internal_iter
->AddSingleDeletion("b");
2373 internal_iter
->AddMerge("a", "1");
2374 internal_iter
->AddMerge("b", "2");
2375 internal_iter
->Finish();
2377 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2378 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2379 BytewiseComparator(), internal_iter
, 1,
2380 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
2381 db_iter
->SeekToFirst();
2382 ASSERT_TRUE(db_iter
->Valid());
2383 ASSERT_EQ(db_iter
->key().ToString(), "a");
2384 ASSERT_EQ(db_iter
->value().ToString(), "0");
2386 ASSERT_TRUE(db_iter
->Valid());
2387 ASSERT_EQ(db_iter
->key().ToString(), "b");
2389 ASSERT_FALSE(db_iter
->Valid());
2392 TEST_F(DBIteratorTest
, DBIterator12
) {
2395 options
.merge_operator
= nullptr;
2397 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2398 internal_iter
->AddPut("a", "1");
2399 internal_iter
->AddPut("b", "2");
2400 internal_iter
->AddPut("c", "3");
2401 internal_iter
->AddSingleDeletion("b");
2402 internal_iter
->Finish();
2404 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2405 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2406 BytewiseComparator(), internal_iter
, 10, 0, nullptr /*read_callback*/));
2407 db_iter
->SeekToLast();
2408 ASSERT_TRUE(db_iter
->Valid());
2409 ASSERT_EQ(db_iter
->key().ToString(), "c");
2410 ASSERT_EQ(db_iter
->value().ToString(), "3");
2412 ASSERT_TRUE(db_iter
->Valid());
2413 ASSERT_EQ(db_iter
->key().ToString(), "a");
2414 ASSERT_EQ(db_iter
->value().ToString(), "1");
2416 ASSERT_FALSE(db_iter
->Valid());
2419 TEST_F(DBIteratorTest
, DBIterator13
) {
2422 options
.merge_operator
= nullptr;
2426 key
.assign(9, static_cast<char>(0));
2429 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2430 internal_iter
->AddPut(key
, "0");
2431 internal_iter
->AddPut(key
, "1");
2432 internal_iter
->AddPut(key
, "2");
2433 internal_iter
->AddPut(key
, "3");
2434 internal_iter
->AddPut(key
, "4");
2435 internal_iter
->AddPut(key
, "5");
2436 internal_iter
->AddPut(key
, "6");
2437 internal_iter
->AddPut(key
, "7");
2438 internal_iter
->AddPut(key
, "8");
2439 internal_iter
->Finish();
2441 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2442 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2443 BytewiseComparator(), internal_iter
, 2, 3, nullptr /*read_callback*/));
2445 ASSERT_TRUE(db_iter
->Valid());
2446 ASSERT_EQ(db_iter
->key().ToString(), key
);
2447 ASSERT_EQ(db_iter
->value().ToString(), "2");
2450 TEST_F(DBIteratorTest
, DBIterator14
) {
2453 options
.merge_operator
= nullptr;
2455 std::string
key("b");
2456 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2457 internal_iter
->AddPut("b", "0");
2458 internal_iter
->AddPut("b", "1");
2459 internal_iter
->AddPut("b", "2");
2460 internal_iter
->AddPut("b", "3");
2461 internal_iter
->AddPut("a", "4");
2462 internal_iter
->AddPut("a", "5");
2463 internal_iter
->AddPut("a", "6");
2464 internal_iter
->AddPut("c", "7");
2465 internal_iter
->AddPut("c", "8");
2466 internal_iter
->AddPut("c", "9");
2467 internal_iter
->Finish();
2469 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2470 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2471 BytewiseComparator(), internal_iter
, 4, 1, nullptr /*read_callback*/));
2473 ASSERT_TRUE(db_iter
->Valid());
2474 ASSERT_EQ(db_iter
->key().ToString(), "b");
2475 ASSERT_EQ(db_iter
->value().ToString(), "3");
2476 db_iter
->SeekToFirst();
2477 ASSERT_EQ(db_iter
->key().ToString(), "a");
2478 ASSERT_EQ(db_iter
->value().ToString(), "4");
2481 TEST_F(DBIteratorTest
, DBIteratorTestDifferentialSnapshots
) {
2482 { // test that KVs earlier that iter_start_seqnum are filtered out
2484 ro
.iter_start_seqnum
=5;
2486 options
.statistics
= ROCKSDB_NAMESPACE::CreateDBStatistics();
2488 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2489 for (size_t i
= 0; i
< 10; ++i
) {
2490 internal_iter
->AddPut(std::to_string(i
), std::to_string(i
) + "a");
2491 internal_iter
->AddPut(std::to_string(i
), std::to_string(i
) + "b");
2492 internal_iter
->AddPut(std::to_string(i
), std::to_string(i
) + "c");
2494 internal_iter
->Finish();
2496 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2497 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2498 BytewiseComparator(), internal_iter
, 13,
2499 options
.max_sequential_skip_in_iterations
, nullptr));
2500 // Expecting InternalKeys in [5,8] range with correct type
2501 int seqnums
[4] = {5,8,11,13};
2502 std::string user_keys
[4] = {"1","2","3","4"};
2503 std::string values
[4] = {"1c", "2c", "3c", "4b"};
2505 for (db_iter
->SeekToFirst(); db_iter
->Valid(); db_iter
->Next()) {
2507 ParseFullKey(db_iter
->key(), &fkey
);
2508 ASSERT_EQ(user_keys
[i
], fkey
.user_key
.ToString());
2509 ASSERT_EQ(EntryType::kEntryPut
, fkey
.type
);
2510 ASSERT_EQ(seqnums
[i
], fkey
.sequence
);
2511 ASSERT_EQ(values
[i
], db_iter
->value().ToString());
2517 { // Test that deletes are returned correctly as internal KVs
2519 ro
.iter_start_seqnum
=5;
2521 options
.statistics
= ROCKSDB_NAMESPACE::CreateDBStatistics();
2523 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
2524 for (size_t i
= 0; i
< 10; ++i
) {
2525 internal_iter
->AddPut(std::to_string(i
), std::to_string(i
) + "a");
2526 internal_iter
->AddPut(std::to_string(i
), std::to_string(i
) + "b");
2527 internal_iter
->AddDeletion(std::to_string(i
));
2529 internal_iter
->Finish();
2531 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
2532 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
2533 BytewiseComparator(), internal_iter
, 13,
2534 options
.max_sequential_skip_in_iterations
, nullptr));
2535 // Expecting InternalKeys in [5,8] range with correct type
2536 int seqnums
[4] = {5,8,11,13};
2537 EntryType key_types
[4] = {EntryType::kEntryDelete
,EntryType::kEntryDelete
,
2538 EntryType::kEntryDelete
,EntryType::kEntryPut
};
2539 std::string user_keys
[4] = {"1","2","3","4"};
2540 std::string values
[4] = {"", "", "", "4b"};
2542 for (db_iter
->SeekToFirst(); db_iter
->Valid(); db_iter
->Next()) {
2544 ParseFullKey(db_iter
->key(), &fkey
);
2545 ASSERT_EQ(user_keys
[i
], fkey
.user_key
.ToString());
2546 ASSERT_EQ(key_types
[i
], fkey
.type
);
2547 ASSERT_EQ(seqnums
[i
], fkey
.sequence
);
2548 ASSERT_EQ(values
[i
], db_iter
->value().ToString());
2555 class DBIterWithMergeIterTest
: public testing::Test
{
2557 DBIterWithMergeIterTest()
2558 : env_(Env::Default()), icomp_(BytewiseComparator()) {
2559 options_
.merge_operator
= nullptr;
2561 internal_iter1_
= new TestIterator(BytewiseComparator());
2562 internal_iter1_
->Add("a", kTypeValue
, "1", 3u);
2563 internal_iter1_
->Add("f", kTypeValue
, "2", 5u);
2564 internal_iter1_
->Add("g", kTypeValue
, "3", 7u);
2565 internal_iter1_
->Finish();
2567 internal_iter2_
= new TestIterator(BytewiseComparator());
2568 internal_iter2_
->Add("a", kTypeValue
, "4", 6u);
2569 internal_iter2_
->Add("b", kTypeValue
, "5", 1u);
2570 internal_iter2_
->Add("c", kTypeValue
, "6", 2u);
2571 internal_iter2_
->Add("d", kTypeValue
, "7", 3u);
2572 internal_iter2_
->Finish();
2574 std::vector
<InternalIterator
*> child_iters
;
2575 child_iters
.push_back(internal_iter1_
);
2576 child_iters
.push_back(internal_iter2_
);
2577 InternalKeyComparator
icomp(BytewiseComparator());
2578 InternalIterator
* merge_iter
=
2579 NewMergingIterator(&icomp_
, &child_iters
[0], 2u);
2581 db_iter_
.reset(NewDBIterator(
2582 env_
, ro_
, ImmutableCFOptions(options_
), MutableCFOptions(options_
),
2583 BytewiseComparator(), merge_iter
,
2584 8 /* read data earlier than seqId 8 */,
2585 3 /* max iterators before reseek */, nullptr /*read_callback*/));
2591 TestIterator
* internal_iter1_
;
2592 TestIterator
* internal_iter2_
;
2593 InternalKeyComparator icomp_
;
2594 Iterator
* merge_iter_
;
2595 std::unique_ptr
<Iterator
> db_iter_
;
2598 TEST_F(DBIterWithMergeIterTest
, InnerMergeIterator1
) {
2599 db_iter_
->SeekToFirst();
2600 ASSERT_TRUE(db_iter_
->Valid());
2601 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2602 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2604 ASSERT_TRUE(db_iter_
->Valid());
2605 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2606 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2608 ASSERT_TRUE(db_iter_
->Valid());
2609 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2610 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2612 ASSERT_TRUE(db_iter_
->Valid());
2613 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2614 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2616 ASSERT_TRUE(db_iter_
->Valid());
2617 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2618 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2620 ASSERT_TRUE(db_iter_
->Valid());
2621 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2622 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2624 ASSERT_FALSE(db_iter_
->Valid());
2627 TEST_F(DBIterWithMergeIterTest
, InnerMergeIterator2
) {
2628 // Test Prev() when one child iterator is at its end.
2629 db_iter_
->SeekForPrev("g");
2630 ASSERT_TRUE(db_iter_
->Valid());
2631 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2632 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2634 ASSERT_TRUE(db_iter_
->Valid());
2635 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2636 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2638 ASSERT_TRUE(db_iter_
->Valid());
2639 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2640 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2642 ASSERT_TRUE(db_iter_
->Valid());
2643 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2644 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2646 ASSERT_TRUE(db_iter_
->Valid());
2647 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2648 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2650 ASSERT_TRUE(db_iter_
->Valid());
2651 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2652 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2655 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace1
) {
2656 // Test Prev() when one child iterator is at its end but more rows
2658 db_iter_
->Seek("f");
2659 ASSERT_TRUE(db_iter_
->Valid());
2660 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2661 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2663 // Test call back inserts a key in the end of the mem table after
2664 // MergeIterator::Prev() realized the mem table iterator is at its end
2665 // and before an SeekToLast() is called.
2666 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2667 "MergeIterator::Prev:BeforePrev",
2668 [&](void* /*arg*/) { internal_iter2_
->Add("z", kTypeValue
, "7", 12u); });
2669 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2672 ASSERT_TRUE(db_iter_
->Valid());
2673 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2674 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2676 ASSERT_TRUE(db_iter_
->Valid());
2677 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2678 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2680 ASSERT_TRUE(db_iter_
->Valid());
2681 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2682 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2684 ASSERT_TRUE(db_iter_
->Valid());
2685 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2686 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2688 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2691 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace2
) {
2692 // Test Prev() when one child iterator is at its end but more rows
2694 db_iter_
->Seek("f");
2695 ASSERT_TRUE(db_iter_
->Valid());
2696 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2697 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2699 // Test call back inserts entries for update a key in the end of the
2700 // mem table after MergeIterator::Prev() realized the mem tableiterator is at
2701 // its end and before an SeekToLast() is called.
2702 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2703 "MergeIterator::Prev:BeforePrev", [&](void* /*arg*/) {
2704 internal_iter2_
->Add("z", kTypeValue
, "7", 12u);
2705 internal_iter2_
->Add("z", kTypeValue
, "7", 11u);
2707 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2710 ASSERT_TRUE(db_iter_
->Valid());
2711 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2712 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2714 ASSERT_TRUE(db_iter_
->Valid());
2715 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2716 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2718 ASSERT_TRUE(db_iter_
->Valid());
2719 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2720 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2722 ASSERT_TRUE(db_iter_
->Valid());
2723 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2724 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2726 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2729 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace3
) {
2730 // Test Prev() when one child iterator is at its end but more rows
2731 // are added and max_skipped is triggered.
2732 db_iter_
->Seek("f");
2733 ASSERT_TRUE(db_iter_
->Valid());
2734 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2735 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2737 // Test call back inserts entries for update a key in the end of the
2738 // mem table after MergeIterator::Prev() realized the mem table iterator is at
2739 // its end and before an SeekToLast() is called.
2740 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2741 "MergeIterator::Prev:BeforePrev", [&](void* /*arg*/) {
2742 internal_iter2_
->Add("z", kTypeValue
, "7", 16u, true);
2743 internal_iter2_
->Add("z", kTypeValue
, "7", 15u, true);
2744 internal_iter2_
->Add("z", kTypeValue
, "7", 14u, true);
2745 internal_iter2_
->Add("z", kTypeValue
, "7", 13u, true);
2746 internal_iter2_
->Add("z", kTypeValue
, "7", 12u, true);
2747 internal_iter2_
->Add("z", kTypeValue
, "7", 11u, true);
2749 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2752 ASSERT_TRUE(db_iter_
->Valid());
2753 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2754 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2756 ASSERT_TRUE(db_iter_
->Valid());
2757 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2758 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2760 ASSERT_TRUE(db_iter_
->Valid());
2761 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2762 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2764 ASSERT_TRUE(db_iter_
->Valid());
2765 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2766 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2768 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2771 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace4
) {
2772 // Test Prev() when one child iterator has more rows inserted
2773 // between Seek() and Prev() when changing directions.
2774 internal_iter2_
->Add("z", kTypeValue
, "9", 4u);
2776 db_iter_
->Seek("g");
2777 ASSERT_TRUE(db_iter_
->Valid());
2778 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2779 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2781 // Test call back inserts entries for update a key before "z" in
2782 // mem table after MergeIterator::Prev() calls mem table iterator's
2783 // Seek() and before calling Prev()
2784 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2785 "MergeIterator::Prev:BeforePrev", [&](void* arg
) {
2786 IteratorWrapper
* it
= reinterpret_cast<IteratorWrapper
*>(arg
);
2787 if (it
->key().starts_with("z")) {
2788 internal_iter2_
->Add("x", kTypeValue
, "7", 16u, true);
2789 internal_iter2_
->Add("x", kTypeValue
, "7", 15u, true);
2790 internal_iter2_
->Add("x", kTypeValue
, "7", 14u, true);
2791 internal_iter2_
->Add("x", kTypeValue
, "7", 13u, true);
2792 internal_iter2_
->Add("x", kTypeValue
, "7", 12u, true);
2793 internal_iter2_
->Add("x", kTypeValue
, "7", 11u, true);
2796 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2799 ASSERT_TRUE(db_iter_
->Valid());
2800 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2801 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2803 ASSERT_TRUE(db_iter_
->Valid());
2804 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2805 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2807 ASSERT_TRUE(db_iter_
->Valid());
2808 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2809 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2811 ASSERT_TRUE(db_iter_
->Valid());
2812 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2813 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2815 ASSERT_TRUE(db_iter_
->Valid());
2816 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2817 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2819 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2822 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace5
) {
2823 internal_iter2_
->Add("z", kTypeValue
, "9", 4u);
2825 // Test Prev() when one child iterator has more rows inserted
2826 // between Seek() and Prev() when changing directions.
2827 db_iter_
->Seek("g");
2828 ASSERT_TRUE(db_iter_
->Valid());
2829 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2830 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2832 // Test call back inserts entries for update a key before "z" in
2833 // mem table after MergeIterator::Prev() calls mem table iterator's
2834 // Seek() and before calling Prev()
2835 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2836 "MergeIterator::Prev:BeforePrev", [&](void* arg
) {
2837 IteratorWrapper
* it
= reinterpret_cast<IteratorWrapper
*>(arg
);
2838 if (it
->key().starts_with("z")) {
2839 internal_iter2_
->Add("x", kTypeValue
, "7", 16u, true);
2840 internal_iter2_
->Add("x", kTypeValue
, "7", 15u, true);
2843 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2846 ASSERT_TRUE(db_iter_
->Valid());
2847 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2848 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2850 ASSERT_TRUE(db_iter_
->Valid());
2851 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2852 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2854 ASSERT_TRUE(db_iter_
->Valid());
2855 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2856 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2858 ASSERT_TRUE(db_iter_
->Valid());
2859 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2860 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2862 ASSERT_TRUE(db_iter_
->Valid());
2863 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2864 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2866 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2869 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace6
) {
2870 internal_iter2_
->Add("z", kTypeValue
, "9", 4u);
2872 // Test Prev() when one child iterator has more rows inserted
2873 // between Seek() and Prev() when changing directions.
2874 db_iter_
->Seek("g");
2875 ASSERT_TRUE(db_iter_
->Valid());
2876 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2877 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2879 // Test call back inserts an entry for update a key before "z" in
2880 // mem table after MergeIterator::Prev() calls mem table iterator's
2881 // Seek() and before calling Prev()
2882 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2883 "MergeIterator::Prev:BeforePrev", [&](void* arg
) {
2884 IteratorWrapper
* it
= reinterpret_cast<IteratorWrapper
*>(arg
);
2885 if (it
->key().starts_with("z")) {
2886 internal_iter2_
->Add("x", kTypeValue
, "7", 16u, true);
2889 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2892 ASSERT_TRUE(db_iter_
->Valid());
2893 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2894 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2896 ASSERT_TRUE(db_iter_
->Valid());
2897 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2898 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2900 ASSERT_TRUE(db_iter_
->Valid());
2901 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2902 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2904 ASSERT_TRUE(db_iter_
->Valid());
2905 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2906 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2908 ASSERT_TRUE(db_iter_
->Valid());
2909 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2910 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2912 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2915 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace7
) {
2916 internal_iter1_
->Add("u", kTypeValue
, "10", 4u);
2917 internal_iter1_
->Add("v", kTypeValue
, "11", 4u);
2918 internal_iter1_
->Add("w", kTypeValue
, "12", 4u);
2919 internal_iter2_
->Add("z", kTypeValue
, "9", 4u);
2921 // Test Prev() when one child iterator has more rows inserted
2922 // between Seek() and Prev() when changing directions.
2923 db_iter_
->Seek("g");
2924 ASSERT_TRUE(db_iter_
->Valid());
2925 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2926 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2928 // Test call back inserts entries for update a key before "z" in
2929 // mem table after MergeIterator::Prev() calls mem table iterator's
2930 // Seek() and before calling Prev()
2931 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2932 "MergeIterator::Prev:BeforePrev", [&](void* arg
) {
2933 IteratorWrapper
* it
= reinterpret_cast<IteratorWrapper
*>(arg
);
2934 if (it
->key().starts_with("z")) {
2935 internal_iter2_
->Add("x", kTypeValue
, "7", 16u, true);
2936 internal_iter2_
->Add("x", kTypeValue
, "7", 15u, true);
2937 internal_iter2_
->Add("x", kTypeValue
, "7", 14u, true);
2938 internal_iter2_
->Add("x", kTypeValue
, "7", 13u, true);
2939 internal_iter2_
->Add("x", kTypeValue
, "7", 12u, true);
2940 internal_iter2_
->Add("x", kTypeValue
, "7", 11u, true);
2943 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2946 ASSERT_TRUE(db_iter_
->Valid());
2947 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2948 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2950 ASSERT_TRUE(db_iter_
->Valid());
2951 ASSERT_EQ(db_iter_
->key().ToString(), "d");
2952 ASSERT_EQ(db_iter_
->value().ToString(), "7");
2954 ASSERT_TRUE(db_iter_
->Valid());
2955 ASSERT_EQ(db_iter_
->key().ToString(), "c");
2956 ASSERT_EQ(db_iter_
->value().ToString(), "6");
2958 ASSERT_TRUE(db_iter_
->Valid());
2959 ASSERT_EQ(db_iter_
->key().ToString(), "b");
2960 ASSERT_EQ(db_iter_
->value().ToString(), "5");
2962 ASSERT_TRUE(db_iter_
->Valid());
2963 ASSERT_EQ(db_iter_
->key().ToString(), "a");
2964 ASSERT_EQ(db_iter_
->value().ToString(), "4");
2966 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2969 TEST_F(DBIterWithMergeIterTest
, InnerMergeIteratorDataRace8
) {
2970 // internal_iter1_: a, f, g
2971 // internal_iter2_: a, b, c, d, adding (z)
2972 internal_iter2_
->Add("z", kTypeValue
, "9", 4u);
2974 // Test Prev() when one child iterator has more rows inserted
2975 // between Seek() and Prev() when changing directions.
2976 db_iter_
->Seek("g");
2977 ASSERT_TRUE(db_iter_
->Valid());
2978 ASSERT_EQ(db_iter_
->key().ToString(), "g");
2979 ASSERT_EQ(db_iter_
->value().ToString(), "3");
2981 // Test call back inserts two keys before "z" in mem table after
2982 // MergeIterator::Prev() calls mem table iterator's Seek() and
2983 // before calling Prev()
2984 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2985 "MergeIterator::Prev:BeforePrev", [&](void* arg
) {
2986 IteratorWrapper
* it
= reinterpret_cast<IteratorWrapper
*>(arg
);
2987 if (it
->key().starts_with("z")) {
2988 internal_iter2_
->Add("x", kTypeValue
, "7", 16u, true);
2989 internal_iter2_
->Add("y", kTypeValue
, "7", 17u, true);
2992 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2995 ASSERT_TRUE(db_iter_
->Valid());
2996 ASSERT_EQ(db_iter_
->key().ToString(), "f");
2997 ASSERT_EQ(db_iter_
->value().ToString(), "2");
2999 ASSERT_TRUE(db_iter_
->Valid());
3000 ASSERT_EQ(db_iter_
->key().ToString(), "d");
3001 ASSERT_EQ(db_iter_
->value().ToString(), "7");
3003 ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3007 TEST_F(DBIteratorTest
, SeekPrefixTombstones
) {
3010 options
.prefix_extractor
.reset(NewNoopTransform());
3011 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
3012 internal_iter
->AddDeletion("b");
3013 internal_iter
->AddDeletion("c");
3014 internal_iter
->AddDeletion("d");
3015 internal_iter
->AddDeletion("e");
3016 internal_iter
->AddDeletion("f");
3017 internal_iter
->AddDeletion("g");
3018 internal_iter
->Finish();
3020 ro
.prefix_same_as_start
= true;
3021 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
3022 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
3023 BytewiseComparator(), internal_iter
, 10,
3024 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
3026 int skipped_keys
= 0;
3028 get_perf_context()->Reset();
3029 db_iter
->SeekForPrev("z");
3031 static_cast<int>(get_perf_context()->internal_key_skipped_count
);
3032 ASSERT_EQ(skipped_keys
, 0);
3034 get_perf_context()->Reset();
3037 static_cast<int>(get_perf_context()->internal_key_skipped_count
);
3038 ASSERT_EQ(skipped_keys
, 0);
3041 TEST_F(DBIteratorTest
, SeekToFirstLowerBound
) {
3042 const int kNumKeys
= 3;
3043 for (int i
= 0; i
< kNumKeys
+ 2; ++i
) {
3044 // + 2 for two special cases: lower bound before and lower bound after the
3045 // internal iterator's keys
3046 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
3047 for (int j
= 1; j
<= kNumKeys
; ++j
) {
3048 internal_iter
->AddPut(std::to_string(j
), "val");
3050 internal_iter
->Finish();
3053 auto lower_bound_str
= std::to_string(i
);
3054 Slice
lower_bound(lower_bound_str
);
3055 ro
.iterate_lower_bound
= &lower_bound
;
3057 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
3058 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
3059 BytewiseComparator(), internal_iter
, 10 /* sequence */,
3060 options
.max_sequential_skip_in_iterations
,
3061 nullptr /* read_callback */));
3063 db_iter
->SeekToFirst();
3064 if (i
== kNumKeys
+ 1) {
3065 // lower bound was beyond the last key
3066 ASSERT_FALSE(db_iter
->Valid());
3068 ASSERT_TRUE(db_iter
->Valid());
3071 // lower bound was before the first key
3074 // lower bound was at the ith key
3077 ASSERT_EQ(std::to_string(expected
), db_iter
->key().ToString());
3082 TEST_F(DBIteratorTest
, PrevLowerBound
) {
3083 const int kNumKeys
= 3;
3084 const int kLowerBound
= 2;
3085 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
3086 for (int j
= 1; j
<= kNumKeys
; ++j
) {
3087 internal_iter
->AddPut(std::to_string(j
), "val");
3089 internal_iter
->Finish();
3092 auto lower_bound_str
= std::to_string(kLowerBound
);
3093 Slice
lower_bound(lower_bound_str
);
3094 ro
.iterate_lower_bound
= &lower_bound
;
3096 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
3097 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
3098 BytewiseComparator(), internal_iter
, 10 /* sequence */,
3099 options
.max_sequential_skip_in_iterations
, nullptr /* read_callback */));
3101 db_iter
->SeekToLast();
3102 for (int i
= kNumKeys
; i
>= kLowerBound
; --i
) {
3103 ASSERT_TRUE(db_iter
->Valid());
3104 ASSERT_EQ(std::to_string(i
), db_iter
->key().ToString());
3107 ASSERT_FALSE(db_iter
->Valid());
3110 TEST_F(DBIteratorTest
, SeekLessLowerBound
) {
3111 const int kNumKeys
= 3;
3112 const int kLowerBound
= 2;
3113 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
3114 for (int j
= 1; j
<= kNumKeys
; ++j
) {
3115 internal_iter
->AddPut(std::to_string(j
), "val");
3117 internal_iter
->Finish();
3120 auto lower_bound_str
= std::to_string(kLowerBound
);
3121 Slice
lower_bound(lower_bound_str
);
3122 ro
.iterate_lower_bound
= &lower_bound
;
3124 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
3125 env_
, ro
, ImmutableCFOptions(options
), MutableCFOptions(options
),
3126 BytewiseComparator(), internal_iter
, 10 /* sequence */,
3127 options
.max_sequential_skip_in_iterations
, nullptr /* read_callback */));
3129 auto before_lower_bound_str
= std::to_string(kLowerBound
- 1);
3130 Slice
before_lower_bound(lower_bound_str
);
3132 db_iter
->Seek(before_lower_bound
);
3133 ASSERT_TRUE(db_iter
->Valid());
3134 ASSERT_EQ(lower_bound_str
, db_iter
->key().ToString());
3137 TEST_F(DBIteratorTest
, ReverseToForwardWithDisappearingKeys
) {
3139 options
.prefix_extractor
.reset(NewCappedPrefixTransform(0));
3141 TestIterator
* internal_iter
= new TestIterator(BytewiseComparator());
3142 internal_iter
->AddPut("a", "A");
3143 internal_iter
->AddPut("b", "B");
3144 for (int i
= 0; i
< 100; ++i
) {
3145 internal_iter
->AddPut("c" + ToString(i
), "");
3147 internal_iter
->Finish();
3149 std::unique_ptr
<Iterator
> db_iter(NewDBIterator(
3150 env_
, ReadOptions(), ImmutableCFOptions(options
),
3151 MutableCFOptions(options
), BytewiseComparator(), internal_iter
, 10,
3152 options
.max_sequential_skip_in_iterations
, nullptr /*read_callback*/));
3154 db_iter
->SeekForPrev("a");
3155 ASSERT_TRUE(db_iter
->Valid());
3156 ASSERT_OK(db_iter
->status());
3157 ASSERT_EQ("a", db_iter
->key().ToString());
3159 internal_iter
->Vanish("a");
3161 ASSERT_TRUE(db_iter
->Valid());
3162 ASSERT_OK(db_iter
->status());
3163 ASSERT_EQ("b", db_iter
->key().ToString());
3165 // A (sort of) bug used to cause DBIter to pointlessly drag the internal
3166 // iterator all the way to the end. But this doesn't really matter at the time
3167 // of writing because the only iterator that can see disappearing keys is
3168 // ForwardIterator, which doesn't support SeekForPrev().
3169 EXPECT_LT(internal_iter
->steps(), 20);
3172 } // namespace ROCKSDB_NAMESPACE
3174 int main(int argc
, char** argv
) {
3175 ::testing::InitGoogleTest(&argc
, argv
);
3176 return RUN_ALL_TESTS();