summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Mumford <cmumford@google.com>2019-05-30 09:56:33 -0700
committerChris Mumford <cmumford@google.com>2019-05-30 09:56:34 -0700
commit4cb80b7ddce6ff6089b15d8cfebf746fc1572477 (patch)
tree8922e8209eefec5906acfbf7f902ec8f7f60e85f
parent72a38ff7f206b3924ac009a12a1838d6a0bdab03 (diff)
parent63d5315e1c224e52da8ec68d118c5b73ba2a63fc (diff)
downloadleveldb-4cb80b7ddce6ff6089b15d8cfebf746fc1572477.tar.gz
Merge pull request #386 from ivanabc:master
PiperOrigin-RevId: 250702492
-rw-r--r--db/db_impl.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/db/db_impl.cc b/db/db_impl.cc
index 94b5d4c..7695d0b 100644
--- a/db/db_impl.cc
+++ b/db/db_impl.cc
@@ -229,12 +229,19 @@ void DBImpl::DeleteObsoleteFiles() {
return;
}
+ const uint64_t log_number = versions_->LogNumber();
+ const uint64_t prev_log_number = versions_->PrevLogNumber();
+ const 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
+
+ // Unlock while deleting obsolete files
+ mutex_.Unlock();
uint64_t number;
FileType type;
for (size_t i = 0; i < filenames.size(); i++) {
@@ -242,13 +249,12 @@ 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());
@@ -275,6 +281,7 @@ void DBImpl::DeleteObsoleteFiles() {
}
}
}
+ mutex_.Lock();
}
Status DBImpl::Recover(VersionEdit* edit, bool* save_manifest) {