From bc2c969fe333bfe4551f24439f82f8abfabd243e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=BA=BA=E9=B1=BC?= <1823748191@qq.com> Date: Tue, 10 Dec 2024 20:46:04 +0800 Subject: [PATCH] fix fast remove bug for GC --- db/db_impl.cc | 19 +++++++++++-------- db/version_set.cc | 8 ++++++++ db/version_set.h | 5 +++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index c8e5ea2..27a4019 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -1742,14 +1742,14 @@ void DBImpl::GarbageCollect() { valuelog_set.emplace(filename); } } - bool tmp_judge=false;//only clean one file + //bool tmp_judge=false;//only clean one file for (std::string valuelog_name : valuelog_set) { - if(tmp_judge){ - break; - } - else{ - tmp_judge=true; - } + // if(tmp_judge){ + // break; + // } + // else{ + // tmp_judge=true; + // } uint64_t cur_log_number = GetValueLogID(valuelog_name); valuelog_name = ValueLogFileName(dbname_, cur_log_number); if (cur_log_number == valuelogfile_number_) { @@ -1936,7 +1936,10 @@ void DBImpl::GarbageCollect() { // 清理旧文件(如果需要) cur_valuelog.close(); - env_->RemoveFile(valuelog_name); + mutex_.Lock(); + versions_->current()->addOldValueLog(valuelog_name); + + mutex_.Unlock(); Log(options_.info_log, "remove file during gc %s", valuelog_name.c_str()); diff --git a/db/version_set.cc b/db/version_set.cc index dcce922..b2df47d 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -82,6 +82,10 @@ Version::~Version() { } } } + + for(auto valuelog_name:old_valuelog_names){ + vset_->env_->RemoveFile(valuelog_name); + } } int FindFile(const InternalKeyComparator& icmp, @@ -461,6 +465,10 @@ void Version::Unref() { } } +void Version::addOldValueLog(std::string valuelog_name){ + old_valuelog_names.push_back(valuelog_name); +} + bool Version::OverlapInLevel(int level, const Slice* smallest_user_key, const Slice* largest_user_key) { return SomeFileOverlapsRange(vset_->icmp_, (level > 0), files_[level], diff --git a/db/version_set.h b/db/version_set.h index ea0c925..0568b6c 100644 --- a/db/version_set.h +++ b/db/version_set.h @@ -90,6 +90,9 @@ class Version { // under live iterators) void Ref(); void Unref(); + + // Add old valuelog to current version, delete them when current version is no more used + void addOldValueLog(std::string valuelog_name); void GetOverlappingInputs( int level, @@ -153,6 +156,8 @@ class Version { // List of files per level std::vector files_[config::kNumLevels]; + std::vector old_valuelog_names; + // Next file to compact based on seek stats. FileMetaData* file_to_compact_; int file_to_compact_level_;