diff --git a/HISTORY.md b/HISTORY.md index 990f7c071ecc3a68ffc0718eead449710fd1fdb1..ba21dd4021fdc7b6933188920601c140be5f355f 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -6,6 +6,7 @@ * The need-compaction hint given by TablePropertiesCollector::NeedCompact() will be persistent and recoverable after DB recovery. This introduces a breaking format change. If you use this experimental feature, including NewCompactOnDeletionCollectorFactory() in the new version, you may not be able to directly downgrade the DB back to version 4.0 or lower. * TablePropertiesCollectorFactory::CreateTablePropertiesCollector() now takes an option Context, containing the information of column family ID for the file being written. * Remove DefaultCompactionFilterFactory. +* Introduce CreateLoggerFromOptions(), this function create a Logger for provided DBOptions. ## 4.1.0 (10/8/2015) ### New Features diff --git a/db/db_impl.cc b/db/db_impl.cc index c5ba6f59d8edba1c40ac8adf7d67c12b4e4a393d..7f6d12eeaf1ac070e4bc4d2c115ef56a889a0a4b 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -133,8 +133,7 @@ DBOptions SanitizeOptions(const std::string& dbname, const DBOptions& src) { } if (result.info_log == nullptr) { - Status s = CreateLoggerFromOptions(dbname, result.db_log_dir, src.env, - result, &result.info_log); + Status s = CreateLoggerFromOptions(dbname, result, &result.info_log); if (!s.ok()) { // No place suitable for logging result.info_log = nullptr; diff --git a/include/rocksdb/options.h b/include/rocksdb/options.h index eb0bc679f511aadc4e194ba8ebb2d25118debf22..acd0016ac5ae9c33248c52014e01a0bcc18b23bc 100644 --- a/include/rocksdb/options.h +++ b/include/rocksdb/options.h @@ -1346,6 +1346,11 @@ extern Options GetOptions(size_t total_write_buffer_limit, int write_amplification_threshold = 32, uint64_t target_db_size = 68719476736 /* 64GB */); +// Create a Logger from provided DBOptions +extern Status CreateLoggerFromOptions(const std::string& dbname, + const DBOptions& options, + std::shared_ptr* logger); + // CompactionOptions are used in CompactFiles() call. struct CompactionOptions { // Compaction output compression type diff --git a/util/auto_roll_logger.cc b/util/auto_roll_logger.cc index 4ea035679641bf37fed047c54b46711935b4d122..e9b13d10998c865311241874df2737596ed59f68 100644 --- a/util/auto_roll_logger.cc +++ b/util/auto_roll_logger.cc @@ -122,22 +122,25 @@ bool AutoRollLogger::LogExpired() { return cached_now >= ctime_ + kLogFileTimeToRoll; } -Status CreateLoggerFromOptions( - const std::string& dbname, - const std::string& db_log_dir, - Env* env, - const DBOptions& options, - std::shared_ptr* logger) { +Status CreateLoggerFromOptions(const std::string& dbname, + const DBOptions& options, + std::shared_ptr* logger) { + if (options.info_log) { + *logger = options.info_log; + return Status::OK(); + } + + Env* env = options.env; std::string db_absolute_path; env->GetAbsolutePath(dbname, &db_absolute_path); - std::string fname = InfoLogFileName(dbname, db_absolute_path, db_log_dir); + std::string fname = + InfoLogFileName(dbname, db_absolute_path, options.db_log_dir); env->CreateDirIfMissing(dbname); // In case it does not exist // Currently we only support roll by time-to-roll and log size if (options.log_file_time_to_roll > 0 || options.max_log_file_size > 0) { AutoRollLogger* result = new AutoRollLogger( - env, dbname, db_log_dir, - options.max_log_file_size, + env, dbname, options.db_log_dir, options.max_log_file_size, options.log_file_time_to_roll, options.info_log_level); Status s = result->GetStatus(); if (!s.ok()) { @@ -148,8 +151,9 @@ Status CreateLoggerFromOptions( return s; } else { // Open a log file in the same directory as the db - env->RenameFile(fname, OldInfoLogFileName(dbname, env->NowMicros(), - db_absolute_path, db_log_dir)); + env->RenameFile( + fname, OldInfoLogFileName(dbname, env->NowMicros(), db_absolute_path, + options.db_log_dir)); auto s = env->NewLogger(fname, logger); if (logger->get() != nullptr) { (*logger)->SetInfoLogLevel(options.info_log_level); diff --git a/util/auto_roll_logger.h b/util/auto_roll_logger.h index 5b6dff6ae5bb03322b0393d727ed46e59b6b0d03..1288cdf3a3b4bfbd932951dca8720a1678b23c44 100644 --- a/util/auto_roll_logger.h +++ b/util/auto_roll_logger.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include "db/filename.h" #include "port/port.h" @@ -104,11 +105,8 @@ class AutoRollLogger : public Logger { }; // Facade to craete logger automatically -Status CreateLoggerFromOptions( - const std::string& dbname, - const std::string& db_log_dir, - Env* env, - const DBOptions& options, - std::shared_ptr* logger); +Status CreateLoggerFromOptions(const std::string& dbname, + const DBOptions& options, + std::shared_ptr* logger); } // namespace rocksdb diff --git a/util/auto_roll_logger_test.cc b/util/auto_roll_logger_test.cc index 138eb6eb47fdc3fbb7cddd0b206b96bec52105e7..c26be2bd2c408a54d465698cd27d2d3d650303f6 100644 --- a/util/auto_roll_logger_test.cc +++ b/util/auto_roll_logger_test.cc @@ -221,13 +221,13 @@ TEST_F(AutoRollLoggerTest, CreateLoggerFromOptions) { shared_ptr logger; // Normal logger - ASSERT_OK(CreateLoggerFromOptions(kTestDir, "", env, options, &logger)); + ASSERT_OK(CreateLoggerFromOptions(kTestDir, options, &logger)); ASSERT_TRUE(dynamic_cast(logger.get())); // Only roll by size InitTestDb(); options.max_log_file_size = 1024; - ASSERT_OK(CreateLoggerFromOptions(kTestDir, "", env, options, &logger)); + ASSERT_OK(CreateLoggerFromOptions(kTestDir, options, &logger)); AutoRollLogger* auto_roll_logger = dynamic_cast(logger.get()); ASSERT_TRUE(auto_roll_logger); @@ -239,7 +239,7 @@ TEST_F(AutoRollLoggerTest, CreateLoggerFromOptions) { InitTestDb(); options.max_log_file_size = 0; options.log_file_time_to_roll = 2; - ASSERT_OK(CreateLoggerFromOptions(kTestDir, "", env, options, &logger)); + ASSERT_OK(CreateLoggerFromOptions(kTestDir, options, &logger)); auto_roll_logger = dynamic_cast(logger.get()); RollLogFileByTimeTest( @@ -250,7 +250,7 @@ TEST_F(AutoRollLoggerTest, CreateLoggerFromOptions) { InitTestDb(); options.max_log_file_size = 1024 * 5; options.log_file_time_to_roll = 2; - ASSERT_OK(CreateLoggerFromOptions(kTestDir, "", env, options, &logger)); + ASSERT_OK(CreateLoggerFromOptions(kTestDir, options, &logger)); auto_roll_logger = dynamic_cast(logger.get()); RollLogFileBySizeTest( diff --git a/utilities/backupable/backupable_db_test.cc b/utilities/backupable/backupable_db_test.cc index 5e4d6905d99146cad4efcc420a4aca7385de3f88..cf5b77ac60ac2716392b04b638293a03278ba32f 100644 --- a/utilities/backupable/backupable_db_test.cc +++ b/utilities/backupable/backupable_db_test.cc @@ -424,9 +424,14 @@ class BackupableDBTest : public testing::Test { options_.write_buffer_size = 1 << 17; // 128KB options_.env = test_db_env_.get(); options_.wal_dir = dbname_; + + // Create logger + DBOptions logger_options; + logger_options.env = env_; + logger_options.db_log_dir = backupdir_; + CreateLoggerFromOptions(dbname_, logger_options, &logger_); + // set up backup db options - CreateLoggerFromOptions(dbname_, backupdir_, env_, - DBOptions(), &logger_); backupable_options_.reset(new BackupableDBOptions( backupdir_, test_backup_env_.get(), true, logger_.get(), true));