From eca68581a1cfe0ebe1c7c4b0dd503b6876d9e794 Mon Sep 17 00:00:00 2001 From: Or Friedmann Date: Wed, 7 Feb 2024 14:40:31 +0200 Subject: [PATCH] fix rangedelete error --- db/db_impl/db_impl_write.cc | 1 + db/db_iter.cc | 6 ++++-- examples/simple_example.cc | 6 ++++-- table/merging_iterator.cc | 5 ++++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/db/db_impl/db_impl_write.cc b/db/db_impl/db_impl_write.cc index 6270f9001..44b03bf23 100644 --- a/db/db_impl/db_impl_write.cc +++ b/db/db_impl/db_impl_write.cc @@ -132,6 +132,7 @@ bool DBImpl::DeleteRangeSeek(const WriteOptions& options, std::cout << "missed seq" << std::endl; return false; } + std::cout << "begin_key: " << begin_key.ToString(true) << " end_key: " << end_key.ToString(true) << " end key size: " << end_key.size() << std::endl; auto cfh = GetColumnFamilyHandle(column_family->GetID()); Status s = DeleteRange(options, cfh, begin_key, end_key); assert(s.ok()); diff --git a/db/db_iter.cc b/db/db_iter.cc index 7b73aacfa..03e8c7f49 100644 --- a/db/db_iter.cc +++ b/db/db_iter.cc @@ -1511,8 +1511,10 @@ void DBIter::Seek(const Slice& target) { } PERF_COUNTER_ADD(iter_read_bytes, key().size() + value().size()); if(able_to_optimize && cfd_->is_delete_range_supported()) { - if(target != iter_.key() && (num_internal_keys_skipped_ + local_stats_.skip_count_) > 1) { - able_to_optimize = db_impl_->DeleteRangeSeek(WriteOptions(), cfd_, target, iter_.key(), sequence_); + ParsedInternalKey ikey; + bool check = ParseKey(&ikey); + if(check && target != ikey.user_key && (num_internal_keys_skipped_ + local_stats_.skip_count_) > 1) { + able_to_optimize = db_impl_->DeleteRangeSeek(WriteOptions(), cfd_, target, ikey.user_key, sequence_); } } } diff --git a/examples/simple_example.cc b/examples/simple_example.cc index 4fb8331ab..2957a4daf 100644 --- a/examples/simple_example.cc +++ b/examples/simple_example.cc @@ -60,8 +60,6 @@ int main() { } printf ("insert completed %lu micros\n", clock->NowMicros() - t); t = clock->NowMicros(); - // disable the auto compaction - options.disable_auto_compactions=true; // now the delete (10% we delete using a normal delete) for (uint32_t i = 0; i < prime/10 ; ++i) { @@ -81,8 +79,12 @@ int main() { for (size_t i = 0; i < 10000 ; i++) { auto iter = db->NewIterator(ReadOptions()); iter->Seek(std::string((char *)&key, 8)); + if(!iter->Valid()) { + printf("Invalid\n"); + } delete iter; } + printf("time to get 10000 keys after delete is %lu micros\n", clock->NowMicros() - t); t = clock->NowMicros(); diff --git a/table/merging_iterator.cc b/table/merging_iterator.cc index c74ec0e35..d81b67016 100644 --- a/table/merging_iterator.cc +++ b/table/merging_iterator.cc @@ -1039,15 +1039,18 @@ bool MergingIterator::SkipNextDeleted() { // range tombstone is from the same level as current, check sequence // number. By `active_` we know current key is between start key and end // key. + // Enter here! assert(comparator_->Compare(range_tombstone_iters_[i]->start_key(), pik) <= 0); assert(comparator_->Compare(pik, range_tombstone_iters_[i]->end_key()) < 0); if (pik.sequence < range_tombstone_iters_[current->level]->seq()) { // covered by range tombstone + // Enter here! current->iter.Next(); // Invariant (children_) - if (current->iter.Valid()) { + if (false && current->iter.Valid()) { + // Enter here! minHeap_.replace_top(current); } else { considerStatus(current->iter.status());