bg_cv_.Wait();
}
}
- return wal_manager_.GetSortedWalFiles(files);
+
+ // Disable deletion in order to avoid the case where a file is deleted in
+ // the middle of the process so IO error is returned.
+ Status s = DisableFileDeletions();
+ bool file_deletion_supported = !s.IsNotSupported();
+ if (s.ok() || !file_deletion_supported) {
+ s = wal_manager_.GetSortedWalFiles(files);
+ if (file_deletion_supported) {
+ Status s2 = EnableFileDeletions(false);
+ if (!s2.ok() && s.ok()) {
+ s = s2;
+ }
+ }
+ }
+
+ return s;
}
Status DBImpl::GetCurrentWalFile(std::unique_ptr<LogFile>* current_log_file) {
}
Status DBImpl::DisableFileDeletions() {
- InstrumentedMutexLock l(&mutex_);
- return DisableFileDeletionsWithLock();
-}
-
-Status DBImpl::DisableFileDeletionsWithLock() {
- mutex_.AssertHeld();
- ++disable_delete_obsolete_files_;
- if (disable_delete_obsolete_files_ == 1) {
+ Status s;
+ int my_disable_delete_obsolete_files;
+ {
+ InstrumentedMutexLock l(&mutex_);
+ s = DisableFileDeletionsWithLock();
+ my_disable_delete_obsolete_files = disable_delete_obsolete_files_;
+ }
+ if (my_disable_delete_obsolete_files == 1) {
ROCKS_LOG_INFO(immutable_db_options_.info_log, "File Deletions Disabled");
} else {
ROCKS_LOG_WARN(immutable_db_options_.info_log,
"File Deletions Disabled, but already disabled. Counter: %d",
- disable_delete_obsolete_files_);
+ my_disable_delete_obsolete_files);
}
+ return s;
+}
+
+Status DBImpl::DisableFileDeletionsWithLock() {
+ mutex_.AssertHeld();
+ ++disable_delete_obsolete_files_;
return Status::OK();
}
if (BackgroundErrorReason::kManifestWrite == reason ||
BackgroundErrorReason::kManifestWriteNoWAL == reason) {
// Always returns ok
+ ROCKS_LOG_INFO(db_options_.info_log, "Disabling File Deletions");
db_->DisableFileDeletionsWithLock().PermitUncheckedError();
}