if (version) {
if (last_tombstone_start_user_key.empty() ||
ucmp->CompareWithoutTimestamp(last_tombstone_start_user_key,
- tombstone.start_key_) < 0) {
+ range_del_it->start_key()) < 0) {
SizeApproximationOptions approx_opts;
approx_opts.files_size_error_margin = 0.1;
meta->compensated_range_deletion_size += versions->ApproximateSize(
0 /* start_level */, -1 /* end_level */,
TableReaderCaller::kFlush);
}
- last_tombstone_start_user_key = tombstone.start_key_;
+ last_tombstone_start_user_key = range_del_it->start_key();
}
}
}
bool start_user_key_changed =
last_tombstone_start_user_key.empty() ||
ucmp->CompareWithoutTimestamp(last_tombstone_start_user_key,
- tombstone.start_key_) < 0;
- last_tombstone_start_user_key = tombstone.start_key_;
+ it->start_key()) < 0;
+ last_tombstone_start_user_key = it->start_key();
// Range tombstones are truncated at file boundaries
if (icmp.Compare(tombstone_start, meta.smallest) < 0) {
tombstone_start = meta.smallest;
Close();
}
+
+TEST_F(DBBasicTestWithTimestamp, RangeTombstoneApproximateSize) {
+ // Test code path for calculating range tombstone compensated size
+ // during flush and compaction.
+ Options options = CurrentOptions();
+ const size_t kTimestampSize = Timestamp(0, 0).size();
+ TestComparator test_cmp(kTimestampSize);
+ options.comparator = &test_cmp;
+ DestroyAndReopen(options);
+ // So that the compaction below is non-bottommost and will calcualte
+ // compensated range tombstone size.
+ ASSERT_OK(db_->Put(WriteOptions(), Key(1), Timestamp(1, 0), "val"));
+ ASSERT_OK(Flush());
+ MoveFilesToLevel(5);
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
+ Key(1), Timestamp(1, 0)));
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(1),
+ Key(2), Timestamp(2, 0)));
+ ASSERT_OK(Flush());
+ ASSERT_OK(dbfull()->RunManualCompaction(
+ static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
+ ->cfd(),
+ 0 /* input_level */, 1 /* output_level */, CompactRangeOptions(),
+ nullptr /* begin */, nullptr /* end */, true /* exclusive */,
+ true /* disallow_trivial_move */,
+ std::numeric_limits<uint64_t>::max() /* max_file_num_to_ignore */,
+ "" /*trim_ts*/));
+}
} // namespace ROCKSDB_NAMESPACE
int main(int argc, char** argv) {