diff --git a/HISTORY.md b/HISTORY.md index 64458d95f..887079f3d 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,7 @@ * Fix sst_dump to return non-zero exit code if the specified file is not a recognized SST file or fails requested checks. * Fix incorrect results from batched MultiGet for duplicate keys, when the duplicate key matches the largest key of an SST file and the value type for the key in the file is a merge value. * Best-efforts recovery ignores CURRENT file completely. If CURRENT file is missing during recovery, best-efforts recovery still proceeds with MANIFEST file(s). +* In best-efforts recovery, an error that is not Corruption or IOError::kNotFound or IOError::kPathNotFound will be overwritten silently. Fix this by checking all non-ok cases and return early. ### Public API Change * Flush(..., column_family) may return Status::ColumnFamilyDropped() instead of Status::InvalidArgument() if column_family is dropped while processing the flush request. diff --git a/db/version_edit_handler.cc b/db/version_edit_handler.cc index 62296e76f..0d7ec8bc5 100644 --- a/db/version_edit_handler.cc +++ b/db/version_edit_handler.cc @@ -404,13 +404,12 @@ Status VersionEditHandler::LoadTables(ColumnFamilyData* cfd, bool is_initial_load) { assert(cfd != nullptr); assert(!cfd->IsDropped()); - Status s; auto builder_iter = builders_.find(cfd->GetID()); assert(builder_iter != builders_.end()); assert(builder_iter->second != nullptr); VersionBuilder* builder = builder_iter->second->version_builder(); assert(builder); - s = builder->LoadTableHandlers( + Status s = builder->LoadTableHandlers( cfd->internal_stats(), version_set_->db_options_->max_file_opening_threads, prefetch_index_and_filter_in_cache, is_initial_load, @@ -551,6 +550,8 @@ Status VersionEditHandlerPointInTime::MaybeCreateVersion( if (s.IsPathNotFound() || s.IsNotFound() || s.IsCorruption()) { missing_files.insert(file_num); s = Status::OK(); + } else if (!s.ok()) { + break; } } bool missing_info = !version_edit_params_.has_log_number_ || @@ -558,8 +559,9 @@ Status VersionEditHandlerPointInTime::MaybeCreateVersion( !version_edit_params_.has_last_sequence_; // Create version before apply edit - if (!missing_info && ((!missing_files.empty() && !prev_has_missing_files) || - (missing_files.empty() && force_create_version))) { + if (s.ok() && !missing_info && + ((!missing_files.empty() && !prev_has_missing_files) || + (missing_files.empty() && force_create_version))) { auto builder_iter = builders_.find(cfd->GetID()); assert(builder_iter != builders_.end()); auto* builder = builder_iter->second->version_builder();