From: Yueh-Hsuan Chiang Date: Thu, 2 Jul 2015 23:10:31 +0000 (-0700) Subject: Fixed endless loop in DBIter::FindPrevUserKey() X-Git-Tag: rocksdb-3.12~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b565228e1ef75b8192b2124e75237309f6b43acb;p=rocksdb.git 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 (cherry picked from commit acee2b08a2d37154b8f9e2dc74b1966202c15ec5) --- diff --git a/table/merger.cc b/table/merger.cc index b418b88a..9781d0dc 100644 --- a/table/merger.cc +++ b/table/merger.cc @@ -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);