Fixed endless loop in DBIter::FindPrevUserKey()
Summary: Fixed endless loop in DBIter::FindPrevUserKey() Test Plan: ./db_stress --test_batches_snapshots=1 --threads=32 --write_buffer_size=4194304 --destroy_db_initially=0 --reopen=20 --readpercent=45 --prefixpercent=5 --writepercent=35 --delpercent=5 --iterpercent=10 --db=/tmp/rocksdb_crashtest_KdCI5F --max_key=100000000 --mmap_read=0 --block_size=16384 --cache_size=1048576 --open_files=500000 --verify_checksum=1 --sync=0 --progress_reports=0 --disable_wal=0 --disable_data_sync=1 --target_file_size_base=2097152 --target_file_size_multiplier=2 --max_write_buffer_number=3 --max_background_compactions=20 --max_bytes_for_level_base=10485760 --filter_deletes=0 --memtablerep=prefix_hash --prefix_size=7 --ops_per_thread=200 --kill_random_test=97 Reviewers: tnovak, igor, sdong Reviewed By: sdong Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D41085
This commit is contained in:
parent
218487d8dc
commit
acee2b08a2
@ -208,6 +208,19 @@ class MergingIterator : public Iterator {
|
||||
} else {
|
||||
// Child has no entries >= key(). Position at last entry.
|
||||
child.SeekToLast();
|
||||
if (child.Valid() && comparator_->Compare(child.key(), key()) > 0) {
|
||||
// Prefix bloom or prefix hash may return !Valid() if one of the
|
||||
// following condition happens: 1. when prefix doesn't match.
|
||||
// 2. Does not exist any row larger than the key within the prefix
|
||||
// while SeekToLast() may return larger keys.
|
||||
//
|
||||
// Temporarily remove this child to avoid Prev() to return a key
|
||||
// larger than the original keys. However, this can cause missing
|
||||
// rows.
|
||||
//
|
||||
// TODO(3.13): need to fix.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (child.Valid()) {
|
||||
maxHeap_.push(&child);
|
||||
|
Loading…
Reference in New Issue
Block a user