diff --git a/db/db_basic_test.cc b/db/db_basic_test.cc index 55258434e14fcb04f255725ebfb69ba9ad8a46d6..55fff5d7b351a6d2f5fd52c28ad28190929c8443 100644 --- a/db/db_basic_test.cc +++ b/db/db_basic_test.cc @@ -4143,7 +4143,7 @@ TEST_F(DBBasicTest, FailOpenIfLoggerCreationFail) { Status s = TryReopen(options); ASSERT_EQ(nullptr, options.info_log); - ASSERT_TRUE(s.IsAborted()); + ASSERT_TRUE(s.IsIOError()); SyncPoint::GetInstance()->DisableProcessing(); SyncPoint::GetInstance()->ClearAllCallBacks(); diff --git a/db/db_impl/db_impl.cc b/db/db_impl/db_impl.cc index 1aa315efc8b3e15c4737d617c3a48b6a0a7074b3..15be4dcd87d1646308e0e9ae5070806509a86d1d 100644 --- a/db/db_impl/db_impl.cc +++ b/db/db_impl/db_impl.cc @@ -156,7 +156,9 @@ DBImpl::DBImpl(const DBOptions& options, const std::string& dbname, bool read_only) : dbname_(dbname), own_info_log_(options.info_log == nullptr), - initial_db_options_(SanitizeOptions(dbname, options, read_only)), + init_logger_creation_s_(), + initial_db_options_(SanitizeOptions(dbname, options, read_only, + &init_logger_creation_s_)), env_(initial_db_options_.env), io_tracer_(std::make_shared()), immutable_db_options_(initial_db_options_), @@ -747,6 +749,9 @@ Status DBImpl::CloseHelper() { Status DBImpl::CloseImpl() { return CloseHelper(); } DBImpl::~DBImpl() { + // TODO: remove this. + init_logger_creation_s_.PermitUncheckedError(); + InstrumentedMutexLock closing_lock_guard(&closing_mutex_); if (closed_) { return; diff --git a/db/db_impl/db_impl.h b/db/db_impl/db_impl.h index 6c0543f0012cf95a8a306254c437d0374a9dd35b..2008085fdaa6ed2601eded994e788949486b8d66 100644 --- a/db/db_impl/db_impl.h +++ b/db/db_impl/db_impl.h @@ -1248,6 +1248,7 @@ class DBImpl : public DB { std::unique_ptr versions_; // Flag to check whether we allocated and own the info log file bool own_info_log_; + Status init_logger_creation_s_; const DBOptions initial_db_options_; Env* const env_; std::shared_ptr io_tracer_; @@ -2600,10 +2601,12 @@ class GetWithTimestampReadCallback : public ReadCallback { }; extern Options SanitizeOptions(const std::string& db, const Options& src, - bool read_only = false); + bool read_only = false, + Status* logger_creation_s = nullptr); extern DBOptions SanitizeOptions(const std::string& db, const DBOptions& src, - bool read_only = false); + bool read_only = false, + Status* logger_creation_s = nullptr); extern CompressionType GetCompressionFlush( const ImmutableCFOptions& ioptions, diff --git a/db/db_impl/db_impl_open.cc b/db/db_impl/db_impl_open.cc index c7d67779275124b95f4ad5d8dd5e4e59660bc421..0bd773fbe60eabe275c9871d2539b1b9c2d0bae3 100644 --- a/db/db_impl/db_impl_open.cc +++ b/db/db_impl/db_impl_open.cc @@ -27,8 +27,9 @@ namespace ROCKSDB_NAMESPACE { Options SanitizeOptions(const std::string& dbname, const Options& src, - bool read_only) { - auto db_options = SanitizeOptions(dbname, DBOptions(src), read_only); + bool read_only, Status* logger_creation_s) { + auto db_options = + SanitizeOptions(dbname, DBOptions(src), read_only, logger_creation_s); ImmutableDBOptions immutable_db_options(db_options); auto cf_options = SanitizeOptions(immutable_db_options, ColumnFamilyOptions(src)); @@ -36,7 +37,7 @@ Options SanitizeOptions(const std::string& dbname, const Options& src, } DBOptions SanitizeOptions(const std::string& dbname, const DBOptions& src, - bool read_only) { + bool read_only, Status* logger_creation_s) { DBOptions result(src); if (result.env == nullptr) { @@ -59,6 +60,9 @@ DBOptions SanitizeOptions(const std::string& dbname, const DBOptions& src, if (!s.ok()) { // No place suitable for logging result.info_log = nullptr; + if (logger_creation_s) { + *logger_creation_s = s; + } } } @@ -1790,9 +1794,11 @@ Status DBImpl::Open(const DBOptions& db_options, const std::string& dbname, DBImpl* impl = new DBImpl(db_options, dbname, seq_per_batch, batch_per_txn); if (!impl->immutable_db_options_.info_log) { - s = Status::Aborted("Failed to create logger"); + s = impl->init_logger_creation_s_; delete impl; return s; + } else { + assert(impl->init_logger_creation_s_.ok()); } s = impl->env_->CreateDirIfMissing(impl->immutable_db_options_.GetWalDir()); if (s.ok()) { diff --git a/utilities/backup/backup_engine_test.cc b/utilities/backup/backup_engine_test.cc index 6e47af89f4b21188e44217ef5faa3ce9c97aa0d8..3b939c5ec276c8f0c16095040364d37861344518 100644 --- a/utilities/backup/backup_engine_test.cc +++ b/utilities/backup/backup_engine_test.cc @@ -3066,7 +3066,7 @@ TEST_F(BackupEngineTest, OpenBackupAsReadOnlyDB) { db = nullptr; // Now try opening read-write and make sure it fails, for safety. - ASSERT_TRUE(DB::Open(opts, name, &db).IsAborted()); + ASSERT_TRUE(DB::Open(opts, name, &db).IsIOError()); } TEST_F(BackupEngineTest, ProgressCallbackDuringBackup) {