Преглед изворни кода

reduce lock's range in DeleteObsoleteFiles

main
ivanabc пре 8 година
committed by 司靖
родитељ
комит
e5f0a51fa4
1 измењених фајлова са 12 додато и 3 уклоњено
  1. +12
    -3
      db/db_impl.cc

+ 12
- 3
db/db_impl.cc Прегледај датотеку

@ -216,18 +216,26 @@ void DBImpl::MaybeIgnoreError(Status* s) const {
}
void DBImpl::DeleteObsoleteFiles() {
mutex_.AssertHeld();
if (!bg_error_.ok()) {
// After a background error, we don't know whether a new version may
// or may not have been committed, so we cannot safely garbage collect.
return;
}
uint64_t log_number = versions_->LogNumber();
uint64_t prev_log_number = versions_->PrevLogNumber();
uint64_t manifest_file_number = versions_->ManifestFileNumber();
// Make a set of all of the live files
std::set<uint64_t> live = pending_outputs_;
versions_->AddLiveFiles(&live);
std::vector<std::string> filenames;
env_->GetChildren(dbname_, &filenames); // Ignoring errors on purpose
mutex_.Unlock();
uint64_t number;
FileType type;
for (size_t i = 0; i < filenames.size(); i++) {
@ -235,13 +243,13 @@ void DBImpl::DeleteObsoleteFiles() {
bool keep = true;
switch (type) {
case kLogFile:
keep = ((number >= versions_->LogNumber()) ||
(number == versions_->PrevLogNumber()));
keep = ((number >= log_number) ||
(number == prev_log_number));
break;
case kDescriptorFile:
// Keep my manifest file, and any newer incarnations'
// (in case there is a race that allows other incarnations)
keep = (number >= versions_->ManifestFileNumber());
keep = (number >= manifest_file_number);
break;
case kTableFile:
keep = (live.find(number) != live.end());
@ -269,6 +277,7 @@ void DBImpl::DeleteObsoleteFiles() {
}
}
}
mutex_.Lock();
}
Status DBImpl::Recover(VersionEdit* edit) {

Loading…
Откажи
Сачувај