@@ -306,7 +306,8 @@ class DBTest {
306
306
kSkipUniversalCompaction = 2 ,
307
307
kSkipMergePut = 4 ,
308
308
kSkipPlainTable = 8 ,
309
- kSkipHashIndex = 16
309
+ kSkipHashIndex = 16 ,
310
+ kSkipNoSeekToLast = 32
310
311
};
311
312
312
313
DBTest () : option_config_(kDefault ),
@@ -341,6 +342,11 @@ class DBTest {
341
342
if ((skip_mask & kSkipMergePut ) && option_config_ == kMergePut ) {
342
343
continue ;
343
344
}
345
+ if ((skip_mask & kSkipNoSeekToLast ) &&
346
+ (option_config_ == kHashLinkList ||
347
+ option_config_ == kHashSkipList )) {;
348
+ continue ;
349
+ }
344
350
if ((skip_mask & kSkipPlainTable )
345
351
&& (option_config_ == kPlainTableAllBytesPrefix
346
352
|| option_config_ == kPlainTableFirstBytePrefix )) {
@@ -862,10 +868,11 @@ class DBTest {
862
868
863
869
void VerifyIterLast (std::string expected_key, int cf = 0 ) {
864
870
Iterator* iter;
871
+ ReadOptions ro;
865
872
if (cf == 0 ) {
866
- iter = db_->NewIterator (ReadOptions () );
873
+ iter = db_->NewIterator (ro );
867
874
} else {
868
- iter = db_->NewIterator (ReadOptions () , handles_[cf]);
875
+ iter = db_->NewIterator (ro , handles_[cf]);
869
876
}
870
877
iter->SeekToLast ();
871
878
ASSERT_EQ (IterStatus (iter), expected_key);
@@ -1463,7 +1470,7 @@ TEST(DBTest, NonBlockingIteration) {
1463
1470
1464
1471
// This test verifies block cache behaviors, which is not used by plain
1465
1472
// table format.
1466
- } while (ChangeOptions (kSkipPlainTable ));
1473
+ } while (ChangeOptions (kSkipPlainTable | kSkipNoSeekToLast ));
1467
1474
}
1468
1475
1469
1476
// A delete is skipped for key if KeyMayExist(key) returns False
@@ -1907,19 +1914,23 @@ TEST(DBTest, IterSmallAndLargeMix) {
1907
1914
TEST (DBTest, IterMultiWithDelete) {
1908
1915
do {
1909
1916
CreateAndReopenWithCF ({" pikachu" });
1910
- ASSERT_OK (Put (1 , " a " , " va" ));
1911
- ASSERT_OK (Put (1 , " b " , " vb" ));
1912
- ASSERT_OK (Put (1 , " c " , " vc" ));
1913
- ASSERT_OK (Delete (1 , " b " ));
1914
- ASSERT_EQ (" NOT_FOUND" , Get (1 , " b " ));
1917
+ ASSERT_OK (Put (1 , " ka " , " va" ));
1918
+ ASSERT_OK (Put (1 , " kb " , " vb" ));
1919
+ ASSERT_OK (Put (1 , " kc " , " vc" ));
1920
+ ASSERT_OK (Delete (1 , " kb " ));
1921
+ ASSERT_EQ (" NOT_FOUND" , Get (1 , " kb " ));
1915
1922
1916
1923
Iterator* iter = db_->NewIterator (ReadOptions (), handles_[1 ]);
1917
- iter->Seek (" c " );
1918
- ASSERT_EQ (IterStatus (iter), " c ->vc" );
1924
+ iter->Seek (" kc " );
1925
+ ASSERT_EQ (IterStatus (iter), " kc ->vc" );
1919
1926
if (!CurrentOptions ().merge_operator ) {
1920
1927
// TODO: merge operator does not support backward iteration yet
1921
- iter->Prev ();
1922
- ASSERT_EQ (IterStatus (iter), " a->va" );
1928
+ if (kPlainTableAllBytesPrefix != option_config_&&
1929
+ kBlockBasedTableWithWholeKeyHashIndex != option_config_ &&
1930
+ kHashLinkList != option_config_) {
1931
+ iter->Prev ();
1932
+ ASSERT_EQ (IterStatus (iter), " ka->va" );
1933
+ }
1923
1934
}
1924
1935
delete iter;
1925
1936
} while (ChangeOptions ());
@@ -1952,7 +1963,7 @@ TEST(DBTest, IterPrevMaxSkip) {
1952
1963
1953
1964
ASSERT_OK (Delete (1 , " key1" ));
1954
1965
VerifyIterLast (" (invalid)" , 1 );
1955
- } while (ChangeOptions (kSkipMergePut ));
1966
+ } while (ChangeOptions (kSkipMergePut | kSkipNoSeekToLast ));
1956
1967
}
1957
1968
1958
1969
TEST (DBTest, IterWithSnapshot) {
@@ -1977,15 +1988,19 @@ TEST(DBTest, IterWithSnapshot) {
1977
1988
ASSERT_EQ (IterStatus (iter), " key5->val5" );
1978
1989
if (!CurrentOptions ().merge_operator ) {
1979
1990
// TODO: merge operator does not support backward iteration yet
1980
- iter->Prev ();
1981
- ASSERT_EQ (IterStatus (iter), " key4->val4" );
1982
- iter->Prev ();
1983
- ASSERT_EQ (IterStatus (iter), " key3->val3" );
1991
+ if (kPlainTableAllBytesPrefix != option_config_&&
1992
+ kBlockBasedTableWithWholeKeyHashIndex != option_config_ &&
1993
+ kHashLinkList != option_config_) {
1994
+ iter->Prev ();
1995
+ ASSERT_EQ (IterStatus (iter), " key4->val4" );
1996
+ iter->Prev ();
1997
+ ASSERT_EQ (IterStatus (iter), " key3->val3" );
1984
1998
1985
- iter->Next ();
1986
- ASSERT_EQ (IterStatus (iter), " key4->val4" );
1987
- iter->Next ();
1988
- ASSERT_EQ (IterStatus (iter), " key5->val5" );
1999
+ iter->Next ();
2000
+ ASSERT_EQ (IterStatus (iter), " key4->val4" );
2001
+ iter->Next ();
2002
+ ASSERT_EQ (IterStatus (iter), " key5->val5" );
2003
+ }
1989
2004
iter->Next ();
1990
2005
ASSERT_TRUE (!iter->Valid ());
1991
2006
}
@@ -5944,7 +5959,7 @@ TEST(DBTest, GroupCommitTest) {
5944
5959
ASSERT_TRUE (!itr->Valid ());
5945
5960
delete itr;
5946
5961
5947
- } while (ChangeOptions ());
5962
+ } while (ChangeOptions (kSkipNoSeekToLast ));
5948
5963
}
5949
5964
5950
5965
namespace {
@@ -6313,7 +6328,7 @@ TEST(DBTest, Randomized) {
6313
6328
}
6314
6329
if (model_snap != nullptr ) model.ReleaseSnapshot (model_snap);
6315
6330
if (db_snap != nullptr ) db_->ReleaseSnapshot (db_snap);
6316
- } while (ChangeOptions (kSkipDeletesFilterFirst ));
6331
+ } while (ChangeOptions (kSkipDeletesFilterFirst | kSkipNoSeekToLast ));
6317
6332
}
6318
6333
6319
6334
TEST (DBTest, MultiGetSimple) {
@@ -6429,7 +6444,6 @@ void PrefixScanInit(DBTest *dbtest) {
6429
6444
} // namespace
6430
6445
6431
6446
TEST (DBTest, PrefixScan) {
6432
- ReadOptions ro = ReadOptions ();
6433
6447
int count;
6434
6448
Slice prefix;
6435
6449
Slice key;
@@ -6450,45 +6464,9 @@ TEST(DBTest, PrefixScan) {
6450
6464
options.max_background_compactions = 2 ;
6451
6465
options.create_if_missing = true ;
6452
6466
options.disable_seek_compaction = true ;
6453
- // Tricky: options.prefix_extractor will be released by
6454
- // NewHashSkipListRepFactory after use.
6455
6467
options.memtable_factory .reset (NewHashSkipListRepFactory ());
6456
6468
6457
- // prefix specified, with blooms: 2 RAND I/Os
6458
- // SeekToFirst
6459
- DestroyAndReopen (&options);
6460
- PrefixScanInit (this );
6461
- count = 0 ;
6462
- env_->random_read_counter_ .Reset ();
6463
- ro.prefix = &prefix;
6464
- iter = db_->NewIterator (ro);
6465
- for (iter->SeekToFirst (); iter->Valid (); iter->Next ()) {
6466
- assert (iter->key ().starts_with (prefix));
6467
- count++;
6468
- }
6469
- ASSERT_OK (iter->status ());
6470
- delete iter;
6471
- ASSERT_EQ (count, 2 );
6472
- ASSERT_EQ (env_->random_read_counter_ .Read (), 2 );
6473
-
6474
- // prefix specified, with blooms: 2 RAND I/Os
6475
- // Seek
6476
- DestroyAndReopen (&options);
6477
- PrefixScanInit (this );
6478
- count = 0 ;
6479
- env_->random_read_counter_ .Reset ();
6480
- ro.prefix = &prefix;
6481
- iter = db_->NewIterator (ro);
6482
- for (iter->Seek (key); iter->Valid (); iter->Next ()) {
6483
- assert (iter->key ().starts_with (prefix));
6484
- count++;
6485
- }
6486
- ASSERT_OK (iter->status ());
6487
- delete iter;
6488
- ASSERT_EQ (count, 2 );
6489
- ASSERT_EQ (env_->random_read_counter_ .Read (), 2 );
6490
-
6491
- // no prefix specified: 11 RAND I/Os
6469
+ // 11 RAND I/Os
6492
6470
DestroyAndReopen (&options);
6493
6471
PrefixScanInit (this );
6494
6472
count = 0 ;
@@ -6652,7 +6630,6 @@ TEST(DBTest, TailingIteratorDeletes) {
6652
6630
TEST (DBTest, TailingIteratorPrefixSeek) {
6653
6631
ReadOptions read_options;
6654
6632
read_options.tailing = true ;
6655
- read_options.prefix_seek = true ;
6656
6633
6657
6634
Options options = CurrentOptions ();
6658
6635
options.env = env_;
0 commit comments