From 6908e24b5636fc458c450e713928c4ec2b76e0d3 Mon Sep 17 00:00:00 2001 From: Raza Hussain Date: Mon, 20 Mar 2017 22:50:56 -0700 Subject: [PATCH] dynamic setting of stats_dump_period_sec through SetDBOption() Summary: Resolved the following issue: https://github.com/facebook/rocksdb/issues/1930 Closes https://github.com/facebook/rocksdb/pull/2004 Differential Revision: D4736764 Pulled By: yiwu-arbug fbshipit-source-id: 64fe0b7 --- HISTORY.md | 2 ++ db/db_impl.cc | 9 ++++++--- db/db_options_test.cc | 16 ++++++++++++++++ .../java/org/rocksdb/DBOptionsInterface.java | 4 ++-- util/db_options.cc | 11 ++++++----- util/db_options.h | 2 +- util/options_helper.cc | 2 +- util/options_helper.h | 3 ++- 8 files changed, 36 insertions(+), 13 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 0a0cd4fec..91c7751eb 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,7 @@ # Rocksdb Change Log ## Unreleased +### Public API Change +* Support dynamically change `stats_dump_period_sec` option via SetDBOptions(). ## 5.3.0 (03/08/2017) ### Public API Change diff --git a/db/db_impl.cc b/db/db_impl.cc index 852e16deb..48983bf03 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -618,12 +618,15 @@ static void DumpMallocStats(std::string* stats) { #endif // !ROCKSDB_LITE void DBImpl::MaybeDumpStats() { - if (immutable_db_options_.stats_dump_period_sec == 0) return; + mutex_.Lock(); + unsigned int stats_dump_period_sec = + mutable_db_options_.stats_dump_period_sec; + mutex_.Unlock(); + if (stats_dump_period_sec == 0) return; const uint64_t now_micros = env_->NowMicros(); - if (last_stats_dump_time_microsec_ + - immutable_db_options_.stats_dump_period_sec * 1000000 <= + if (last_stats_dump_time_microsec_ + stats_dump_period_sec * 1000000 <= now_micros) { // Multiple threads could race in here simultaneously. // However, the last one will update last_stats_dump_time_microsec_ diff --git a/db/db_options_test.cc b/db/db_options_test.cc index dd733cc8e..1a4ad5eb1 100644 --- a/db/db_options_test.cc +++ b/db/db_options_test.cc @@ -326,6 +326,22 @@ TEST_F(DBOptionsTest, MaxTotalWalSizeChange) { } } +TEST_F(DBOptionsTest, SetStatsDumpPeriodSec) { + Options options; + options.create_if_missing = true; + options.stats_dump_period_sec = 5; + options.env = env_; + Reopen(options); + ASSERT_EQ(5, dbfull()->GetDBOptions().stats_dump_period_sec); + + for (int i = 0; i < 20; i++) { + int num = rand() % 5000 + 1; + ASSERT_OK(dbfull()->SetDBOptions( + {{"stats_dump_period_sec", std::to_string(num)}})); + ASSERT_EQ(num, dbfull()->GetDBOptions().stats_dump_period_sec); + } +} + static void assert_candidate_files_empty(DBImpl* dbfull, const bool empty) { dbfull->TEST_LockMutex(); JobContext job_context(0); diff --git a/java/src/main/java/org/rocksdb/DBOptionsInterface.java b/java/src/main/java/org/rocksdb/DBOptionsInterface.java index 1e7b4fda4..1af9b7ced 100644 --- a/java/src/main/java/org/rocksdb/DBOptionsInterface.java +++ b/java/src/main/java/org/rocksdb/DBOptionsInterface.java @@ -715,7 +715,7 @@ public interface DBOptionsInterface { /** * if not zero, dump rocksdb.stats to LOG every stats_dump_period_sec - * Default: 3600 (1 hour) + * Default: 600 (10 minutes) * * @param statsDumpPeriodSec time interval in seconds. * @return the instance of the current Object. @@ -724,7 +724,7 @@ public interface DBOptionsInterface { /** * If not zero, dump rocksdb.stats to LOG every stats_dump_period_sec - * Default: 3600 (1 hour) + * Default: 600 (10 minutes) * * @return time interval in seconds. */ diff --git a/util/db_options.cc b/util/db_options.cc index f5ccebbf7..bdb92e849 100644 --- a/util/db_options.cc +++ b/util/db_options.cc @@ -56,7 +56,6 @@ ImmutableDBOptions::ImmutableDBOptions(const DBOptions& options) use_direct_writes(options.use_direct_writes), allow_fallocate(options.allow_fallocate), is_fd_close_on_exec(options.is_fd_close_on_exec), - stats_dump_period_sec(options.stats_dump_period_sec), advise_random_on_open(options.advise_random_on_open), db_write_buffer_size(options.db_write_buffer_size), write_buffer_manager(options.write_buffer_manager), @@ -154,8 +153,6 @@ void ImmutableDBOptions::Dump(Logger* log) const { manifest_preallocation_size); ROCKS_LOG_HEADER(log, " Options.is_fd_close_on_exec: %d", is_fd_close_on_exec); - ROCKS_LOG_HEADER(log, " Options.stats_dump_period_sec: %u", - stats_dump_period_sec); ROCKS_LOG_HEADER(log, " Options.advise_random_on_open: %d", advise_random_on_open); ROCKS_LOG_HEADER( @@ -223,7 +220,8 @@ MutableDBOptions::MutableDBOptions() avoid_flush_during_shutdown(false), delayed_write_rate(2 * 1024U * 1024U), max_total_wal_size(0), - delete_obsolete_files_period_micros(6ULL * 60 * 60 * 1000000) {} + delete_obsolete_files_period_micros(6ULL * 60 * 60 * 1000000), + stats_dump_period_sec(600) {} MutableDBOptions::MutableDBOptions(const DBOptions& options) : base_background_compactions(options.base_background_compactions), @@ -232,7 +230,8 @@ MutableDBOptions::MutableDBOptions(const DBOptions& options) delayed_write_rate(options.delayed_write_rate), max_total_wal_size(options.max_total_wal_size), delete_obsolete_files_period_micros( - options.delete_obsolete_files_period_micros) {} + options.delete_obsolete_files_period_micros), + stats_dump_period_sec(options.stats_dump_period_sec) {} void MutableDBOptions::Dump(Logger* log) const { ROCKS_LOG_HEADER(log, " Options.base_background_compactions: %d", @@ -248,6 +247,8 @@ void MutableDBOptions::Dump(Logger* log) const { ROCKS_LOG_HEADER( log, " Options.delete_obsolete_files_period_micros: %" PRIu64, delete_obsolete_files_period_micros); + ROCKS_LOG_HEADER(log, " Options.stats_dump_period_sec: %u", + stats_dump_period_sec); } } // namespace rocksdb diff --git a/util/db_options.h b/util/db_options.h index c7edb13c0..8b0135aca 100644 --- a/util/db_options.h +++ b/util/db_options.h @@ -51,7 +51,6 @@ struct ImmutableDBOptions { bool use_direct_writes; bool allow_fallocate; bool is_fd_close_on_exec; - unsigned int stats_dump_period_sec; bool advise_random_on_open; size_t db_write_buffer_size; std::shared_ptr write_buffer_manager; @@ -94,6 +93,7 @@ struct MutableDBOptions { uint64_t delayed_write_rate; uint64_t max_total_wal_size; uint64_t delete_obsolete_files_period_micros; + unsigned int stats_dump_period_sec; }; } // namespace rocksdb diff --git a/util/options_helper.cc b/util/options_helper.cc index 18fae4234..a035a6bc0 100644 --- a/util/options_helper.cc +++ b/util/options_helper.cc @@ -76,7 +76,7 @@ DBOptions BuildDBOptions(const ImmutableDBOptions& immutable_db_options, options.use_direct_writes = immutable_db_options.use_direct_writes; options.allow_fallocate = immutable_db_options.allow_fallocate; options.is_fd_close_on_exec = immutable_db_options.is_fd_close_on_exec; - options.stats_dump_period_sec = immutable_db_options.stats_dump_period_sec; + options.stats_dump_period_sec = mutable_db_options.stats_dump_period_sec; options.advise_random_on_open = immutable_db_options.advise_random_on_open; options.db_write_buffer_size = immutable_db_options.db_write_buffer_size; options.write_buffer_manager = immutable_db_options.write_buffer_manager; diff --git a/util/options_helper.h b/util/options_helper.h index 13d1855ee..f3d7d7d38 100644 --- a/util/options_helper.h +++ b/util/options_helper.h @@ -330,7 +330,8 @@ static std::unordered_map db_options_type_info = { OptionVerificationType::kNormal, false, 0}}, {"stats_dump_period_sec", {offsetof(struct DBOptions, stats_dump_period_sec), OptionType::kUInt, - OptionVerificationType::kNormal, false, 0}}, + OptionVerificationType::kNormal, true, + offsetof(struct MutableDBOptions, stats_dump_period_sec)}}, {"fail_if_options_file_error", {offsetof(struct DBOptions, fail_if_options_file_error), OptionType::kBoolean, OptionVerificationType::kNormal, false, 0}},