diff --git a/db/db_iterator_test.cc b/db/db_iterator_test.cc index 67a97b20b..997b38602 100644 --- a/db/db_iterator_test.cc +++ b/db/db_iterator_test.cc @@ -2821,6 +2821,32 @@ TEST_P(DBIteratorTest, IterateBoundChangedBeforeSeek) { delete iter; } +TEST_P(DBIteratorTest, IterateWithLowerBoundAcrossFileBoundary) { + ASSERT_OK(Put("aaa", "v")); + ASSERT_OK(Put("bbb", "v")); + ASSERT_OK(Flush()); + ASSERT_OK(Put("ccc", "v")); + ASSERT_OK(Put("ddd", "v")); + ASSERT_OK(Flush()); + // Move both files to bottom level. + ASSERT_OK(dbfull()->CompactRange(CompactRangeOptions(), nullptr, nullptr)); + Slice lower_bound("b"); + ReadOptions read_opts; + read_opts.iterate_lower_bound = &lower_bound; + std::unique_ptr iter(NewIterator(read_opts)); + iter->SeekForPrev("d"); + ASSERT_TRUE(iter->Valid()); + ASSERT_OK(iter->status()); + ASSERT_EQ("ccc", iter->key()); + iter->Prev(); + ASSERT_TRUE(iter->Valid()); + ASSERT_OK(iter->status()); + ASSERT_EQ("bbb", iter->key()); + iter->Prev(); + ASSERT_FALSE(iter->Valid()); + ASSERT_OK(iter->status()); +} + INSTANTIATE_TEST_CASE_P(DBIteratorTestInstance, DBIteratorTest, testing::Values(true, false)); diff --git a/db/version_set.cc b/db/version_set.cc index 226ba0e7e..32dd61db8 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -984,7 +984,8 @@ class LevelIterator final : public InternalIterator { // Note MyRocks may update iterate bounds between seek. To workaround it, // we need to check and update may_be_out_of_lower_bound_ accordingly. void CheckMayBeOutOfLowerBound() { - if (Valid() && read_options_.iterate_lower_bound != nullptr) { + if (read_options_.iterate_lower_bound != nullptr && + file_index_ < flevel_->num_files) { may_be_out_of_lower_bound_ = user_comparator_.Compare( ExtractUserKey(file_smallest_key(file_index_)),