diff --git a/db/db_tailing_iter_test.cc b/db/db_tailing_iter_test.cc index d36f2bb0a..e95841c58 100644 --- a/db/db_tailing_iter_test.cc +++ b/db/db_tailing_iter_test.cc @@ -68,6 +68,7 @@ TEST_F(DBTestTailingIterator, TailingIteratorSeekToNext) { read_options.tailing = true; std::unique_ptr iter(db_->NewIterator(read_options, handles_[1])); + std::unique_ptr itern(db_->NewIterator(read_options, handles_[1])); std::string value(1024, 'a'); const int num_records = 1000; @@ -88,6 +89,13 @@ TEST_F(DBTestTailingIterator, TailingIteratorSeekToNext) { iter->Seek(target); ASSERT_TRUE(iter->Valid()); ASSERT_EQ(iter->key().compare(key), 0); + if (i == 1) { + itern->SeekToFirst(); + } else { + itern->Next(); + } + ASSERT_TRUE(itern->Valid()); + ASSERT_EQ(itern->key().compare(key), 0); } for (int i = 2 * num_records; i > 0; --i) { char buf1[32]; diff --git a/db/forward_iterator.cc b/db/forward_iterator.cc index 32efe8090..cd745b7f0 100644 --- a/db/forward_iterator.cc +++ b/db/forward_iterator.cc @@ -341,6 +341,7 @@ void ForwardIterator::SeekInternal(const Slice& internal_key, void ForwardIterator::Next() { assert(valid_); + bool update_prev_key = false; if (sv_ == nullptr || sv_->version_number != cfd_->GetSuperVersionNumber()) { @@ -355,14 +356,16 @@ void ForwardIterator::Next() { } else if (current_ != mutable_iter_) { // It is going to advance immutable iterator - bool update_prev_key = true; if (is_prev_set_ && prefix_extractor_) { // advance prev_key_ to current_ only if they share the same prefix update_prev_key = prefix_extractor_->Transform(prev_key_.GetKey()).compare( prefix_extractor_->Transform(current_->key())) == 0; + } else { + update_prev_key = true; } + if (update_prev_key) { prev_key_.SetKey(current_->key()); is_prev_set_ = true; @@ -376,6 +379,8 @@ void ForwardIterator::Next() { immutable_status_ = current_->status(); } else if (current_->Valid()) { immutable_min_heap_.push(current_); + } else if ((!mutable_iter_->Valid()) && update_prev_key) { + mutable_iter_->Seek(prev_key_.GetKey()); } }