Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4fda92684a | ||
|
77b6870769 | ||
|
5c02676461 | ||
|
73cd3da055 | ||
|
da5c117dd8 | ||
|
5a81a48ba9 | ||
|
d21bd42116 | ||
|
8020306d35 | ||
|
b01e9b52ea | ||
|
1db81809d5 | ||
|
a752fe311d |
@ -1427,6 +1427,47 @@ TEST_F(DBRangeDelTest, SnapshotPreventsDroppedKeys) {
|
|||||||
db_->ReleaseSnapshot(snapshot);
|
db_->ReleaseSnapshot(snapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DBRangeDelTest, SnapshotPreventsDroppedKeysInImmMemTables) {
|
||||||
|
const int kFileBytes = 1 << 20;
|
||||||
|
|
||||||
|
Options options = CurrentOptions();
|
||||||
|
options.compression = kNoCompression;
|
||||||
|
options.disable_auto_compactions = true;
|
||||||
|
options.target_file_size_base = kFileBytes;
|
||||||
|
Reopen(options);
|
||||||
|
|
||||||
|
// block flush thread -> pin immtables in memory
|
||||||
|
SyncPoint::GetInstance()->DisableProcessing();
|
||||||
|
SyncPoint::GetInstance()->LoadDependency({
|
||||||
|
{"SnapshotPreventsDroppedKeysInImmMemTables:AfterNewIterator",
|
||||||
|
"DBImpl::BGWorkFlush"},
|
||||||
|
});
|
||||||
|
SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
|
||||||
|
ASSERT_OK(Put(Key(0), "a"));
|
||||||
|
std::unique_ptr<const Snapshot, std::function<void(const Snapshot*)>>
|
||||||
|
snapshot(db_->GetSnapshot(),
|
||||||
|
[this](const Snapshot* s) { db_->ReleaseSnapshot(s); });
|
||||||
|
|
||||||
|
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
|
||||||
|
Key(10)));
|
||||||
|
|
||||||
|
ASSERT_OK(dbfull()->TEST_SwitchMemtable());
|
||||||
|
|
||||||
|
ReadOptions read_opts;
|
||||||
|
read_opts.snapshot = snapshot.get();
|
||||||
|
std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
|
||||||
|
|
||||||
|
TEST_SYNC_POINT("SnapshotPreventsDroppedKeysInImmMemTables:AfterNewIterator");
|
||||||
|
|
||||||
|
iter->SeekToFirst();
|
||||||
|
ASSERT_TRUE(iter->Valid());
|
||||||
|
ASSERT_EQ(Key(0), iter->key());
|
||||||
|
|
||||||
|
iter->Next();
|
||||||
|
ASSERT_FALSE(iter->Valid());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(DBRangeDelTest, RangeTombstoneWrittenToMinimalSsts) {
|
TEST_F(DBRangeDelTest, RangeTombstoneWrittenToMinimalSsts) {
|
||||||
// Adapted from
|
// Adapted from
|
||||||
// https://github.com/cockroachdb/cockroach/blob/de8b3ea603dd1592d9dc26443c2cc92c356fbc2f/pkg/storage/engine/rocksdb_test.go#L1267-L1398.
|
// https://github.com/cockroachdb/cockroach/blob/de8b3ea603dd1592d9dc26443c2cc92c356fbc2f/pkg/storage/engine/rocksdb_test.go#L1267-L1398.
|
||||||
|
@ -186,11 +186,14 @@ Status MemTableListVersion::AddRangeTombstoneIterators(
|
|||||||
const ReadOptions& read_opts, Arena* /*arena*/,
|
const ReadOptions& read_opts, Arena* /*arena*/,
|
||||||
RangeDelAggregator* range_del_agg) {
|
RangeDelAggregator* range_del_agg) {
|
||||||
assert(range_del_agg != nullptr);
|
assert(range_del_agg != nullptr);
|
||||||
|
// Except for snapshot read, using kMaxSequenceNumber is OK because these
|
||||||
|
// are immutable memtables.
|
||||||
|
SequenceNumber read_seq = read_opts.snapshot != nullptr
|
||||||
|
? read_opts.snapshot->GetSequenceNumber()
|
||||||
|
: kMaxSequenceNumber;
|
||||||
for (auto& m : memlist_) {
|
for (auto& m : memlist_) {
|
||||||
// Using kMaxSequenceNumber is OK because these are immutable memtables.
|
|
||||||
std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
|
std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
|
||||||
m->NewRangeTombstoneIterator(read_opts,
|
m->NewRangeTombstoneIterator(read_opts, read_seq));
|
||||||
kMaxSequenceNumber /* read_seq */));
|
|
||||||
range_del_agg->AddTombstones(std::move(range_del_iter));
|
range_del_agg->AddTombstones(std::move(range_del_iter));
|
||||||
}
|
}
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user