}
}
+TEST_F(DBRangeDelTest, UnorderedTombstones) {
+ // Regression test for #2752. Range delete tombstones between
+ // different snapshot stripes are not stored in order, so the first
+ // tombstone of each snapshot stripe should be checked as a smallest
+ // candidate.
+ Options options = CurrentOptions();
+ DestroyAndReopen(options);
+
+ auto cf = db_->DefaultColumnFamily();
+
+ ASSERT_OK(db_->Put(WriteOptions(), cf, "a", "a"));
+ ASSERT_OK(db_->Flush(FlushOptions(), cf));
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr));
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
+
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), cf, "b", "c"));
+ // Hold a snapshot to separate these two delete ranges.
+ auto snapshot = db_->GetSnapshot();
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), cf, "a", "b"));
+ ASSERT_OK(db_->Flush(FlushOptions(), cf));
+ db_->ReleaseSnapshot(snapshot);
+
+ std::vector<std::vector<FileMetaData>> files;
+ dbfull()->TEST_GetFilesMetaData(cf, &files);
+ ASSERT_EQ(1, files[0].size());
+ ASSERT_EQ("a", files[0][0].smallest.user_key());
+ ASSERT_EQ("c", files[0][0].largest.user_key());
+
+ std::string v;
+ auto s = db_->Get(ReadOptions(), "a", &v);
+ ASSERT_TRUE(s.IsNotFound());
+}
+
#endif // ROCKSDB_LITE
} // namespace rocksdb
// Note the order in which tombstones are stored is insignificant since we
// insert them into a std::map on the read path.
- bool first_added = false;
while (stripe_map_iter != rep_->stripe_map_.end()) {
+ bool first_added = false;
for (auto tombstone_map_iter = stripe_map_iter->second.raw_map.begin();
tombstone_map_iter != stripe_map_iter->second.raw_map.end();
++tombstone_map_iter) {
builder->Add(ikey_and_end_key.first.Encode(), ikey_and_end_key.second);
if (!first_added) {
first_added = true;
- InternalKey smallest_candidate = std::move(ikey_and_end_key.first);;
+ InternalKey smallest_candidate = std::move(ikey_and_end_key.first);
if (lower_bound != nullptr &&
icmp_.user_comparator()->Compare(smallest_candidate.user_key(),
*lower_bound) <= 0) {