Browse Source

fix fast remove bug for GC

xxy
小人鱼 9 months ago
parent
commit
bc2c969fe3
3 changed files with 24 additions and 8 deletions
  1. +11
    -8
      db/db_impl.cc
  2. +8
    -0
      db/version_set.cc
  3. +5
    -0
      db/version_set.h

+ 11
- 8
db/db_impl.cc View File

@ -1742,14 +1742,14 @@ void DBImpl::GarbageCollect() {
valuelog_set.emplace(filename); 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) { 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); uint64_t cur_log_number = GetValueLogID(valuelog_name);
valuelog_name = ValueLogFileName(dbname_, cur_log_number); valuelog_name = ValueLogFileName(dbname_, cur_log_number);
if (cur_log_number == valuelogfile_number_) { if (cur_log_number == valuelogfile_number_) {
@ -1936,7 +1936,10 @@ void DBImpl::GarbageCollect() {
// 清理旧文件(如果需要) // 清理旧文件(如果需要)
cur_valuelog.close(); 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()); Log(options_.info_log, "remove file during gc %s", valuelog_name.c_str());

+ 8
- 0
db/version_set.cc View File

@ -82,6 +82,10 @@ Version::~Version() {
} }
} }
} }
for(auto valuelog_name:old_valuelog_names){
vset_->env_->RemoveFile(valuelog_name);
}
} }
int FindFile(const InternalKeyComparator& icmp, 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, bool Version::OverlapInLevel(int level, const Slice* smallest_user_key,
const Slice* largest_user_key) { const Slice* largest_user_key) {
return SomeFileOverlapsRange(vset_->icmp_, (level > 0), files_[level], return SomeFileOverlapsRange(vset_->icmp_, (level > 0), files_[level],

+ 5
- 0
db/version_set.h View File

@ -90,6 +90,9 @@ class Version {
// under live iterators) // under live iterators)
void Ref(); void Ref();
void Unref(); 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( void GetOverlappingInputs(
int level, int level,
@ -153,6 +156,8 @@ class Version {
// List of files per level // List of files per level
std::vector<FileMetaData*> files_[config::kNumLevels]; std::vector<FileMetaData*> files_[config::kNumLevels];
std::vector<std::string> old_valuelog_names;
// Next file to compact based on seek stats. // Next file to compact based on seek stats.
FileMetaData* file_to_compact_; FileMetaData* file_to_compact_;
int file_to_compact_level_; int file_to_compact_level_;

Loading…
Cancel
Save