Set max_background_flushes dynamically (#6701)

Summary:
1. Add changes so that max_background_flushes can be set dynamically.
                   2. Add a testcase DBOptionsTest.SetBackgroundFlushThreads which set the
                        max_background_flushes dynamically using SetDBOptions.

TestPlan:  1. make -j64 check
                  2. Using new testcase DBOptionsTest.SetBackgroundFlushThreads
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6701

Reviewed By: ajkr

Differential Revision: D21028010

Pulled By: akankshamahajan15

fbshipit-source-id: 5f949e4a8fd3c32537b637947b7ee09a69cfc7c1
This commit is contained in:
Akanksha Mahajan 2020-04-20 16:17:25 -07:00 committed by Facebook GitHub Bot
parent 31da5e34c1
commit 03a1d95db0
7 changed files with 28 additions and 11 deletions

View File

@ -11,6 +11,7 @@
### New Features ### New Features
* Added support for pipelined & parallel compression optimization for `BlockBasedTableBuilder`. This optimization makes block building, block compression and block appending a pipeline, and uses multiple threads to accelerate block compression. Users can set `CompressionOptions::parallel_threads` greater than 1 to enable compression parallelism. * Added support for pipelined & parallel compression optimization for `BlockBasedTableBuilder`. This optimization makes block building, block compression and block appending a pipeline, and uses multiple threads to accelerate block compression. Users can set `CompressionOptions::parallel_threads` greater than 1 to enable compression parallelism.
* Provide an allocator for memkind to be used with block cache. This is to work with memory technologies (Intel DCPMM is one such technology currently available) that require different libraries for allocation and management (such as PMDK and memkind). The high capacities available make it possible to provision large caches (up to several TBs in size) beyond what is achievable with DRAM. * Provide an allocator for memkind to be used with block cache. This is to work with memory technologies (Intel DCPMM is one such technology currently available) that require different libraries for allocation and management (such as PMDK and memkind). The high capacities available make it possible to provision large caches (up to several TBs in size) beyond what is achievable with DRAM.
* Option `max_background_flushes` can be set dynamically using DB::SetDBOptions().
### Bug Fixes ### Bug Fixes
* Fix a bug when making options.bottommost_compression, options.compression_opts and options.bottommost_compression_opts dynamically changeable: the modified values are not written to option files or returned back to users when being queried. * Fix a bug when making options.bottommost_compression, options.compression_opts and options.bottommost_compression_opts dynamically changeable: the modified values are not written to option files or returned back to users when being queried.

View File

@ -1010,12 +1010,12 @@ Status DBImpl::SetDBOptions(
} }
if (s.ok()) { if (s.ok()) {
const BGJobLimits current_bg_job_limits = const BGJobLimits current_bg_job_limits =
GetBGJobLimits(immutable_db_options_.max_background_flushes, GetBGJobLimits(mutable_db_options_.max_background_flushes,
mutable_db_options_.max_background_compactions, mutable_db_options_.max_background_compactions,
mutable_db_options_.max_background_jobs, mutable_db_options_.max_background_jobs,
/* parallelize_compactions */ true); /* parallelize_compactions */ true);
const BGJobLimits new_bg_job_limits = GetBGJobLimits( const BGJobLimits new_bg_job_limits = GetBGJobLimits(
immutable_db_options_.max_background_flushes, new_options.max_background_flushes,
new_options.max_background_compactions, new_options.max_background_compactions,
new_options.max_background_jobs, /* parallelize_compactions */ true); new_options.max_background_jobs, /* parallelize_compactions */ true);

View File

@ -2030,7 +2030,7 @@ void DBImpl::MaybeScheduleFlushOrCompaction() {
DBImpl::BGJobLimits DBImpl::GetBGJobLimits() const { DBImpl::BGJobLimits DBImpl::GetBGJobLimits() const {
mutex_.AssertHeld(); mutex_.AssertHeld();
return GetBGJobLimits(immutable_db_options_.max_background_flushes, return GetBGJobLimits(mutable_db_options_.max_background_flushes,
mutable_db_options_.max_background_compactions, mutable_db_options_.max_background_compactions,
mutable_db_options_.max_background_jobs, mutable_db_options_.max_background_jobs,
write_controller_.NeedSpeedupCompaction()); write_controller_.NeedSpeedupCompaction());

View File

@ -402,6 +402,20 @@ TEST_F(DBOptionsTest, SetBackgroundCompactionThreads) {
ASSERT_EQ(3, dbfull()->TEST_BGCompactionsAllowed()); ASSERT_EQ(3, dbfull()->TEST_BGCompactionsAllowed());
} }
TEST_F(DBOptionsTest, SetBackgroundFlushThreads) {
Options options;
options.create_if_missing = true;
options.max_background_flushes = 1;
options.env = env_;
Reopen(options);
ASSERT_EQ(1, dbfull()->TEST_BGFlushesAllowed());
ASSERT_EQ(1, env_->GetBackgroundThreads(Env::Priority::HIGH));
ASSERT_OK(dbfull()->SetDBOptions({{"max_background_flushes", "3"}}));
ASSERT_EQ(3, env_->GetBackgroundThreads(Env::Priority::HIGH));
ASSERT_EQ(3, dbfull()->TEST_BGFlushesAllowed());
}
TEST_F(DBOptionsTest, SetBackgroundJobs) { TEST_F(DBOptionsTest, SetBackgroundJobs) {
Options options; Options options;
options.create_if_missing = true; options.create_if_missing = true;

View File

@ -133,7 +133,8 @@ std::unordered_map<std::string, OptionTypeInfo>
offsetof(struct MutableDBOptions, base_background_compactions)}}, offsetof(struct MutableDBOptions, base_background_compactions)}},
{"max_background_flushes", {"max_background_flushes",
{offsetof(struct DBOptions, max_background_flushes), OptionType::kInt, {offsetof(struct DBOptions, max_background_flushes), OptionType::kInt,
OptionVerificationType::kNormal, OptionTypeFlags::kNone, 0}}, OptionVerificationType::kNormal, OptionTypeFlags::kMutable,
offsetof(struct MutableDBOptions, max_background_flushes)}},
{"max_file_opening_threads", {"max_file_opening_threads",
{offsetof(struct DBOptions, max_file_opening_threads), {offsetof(struct DBOptions, max_file_opening_threads),
OptionType::kInt, OptionVerificationType::kNormal, OptionType::kInt, OptionVerificationType::kNormal,
@ -354,7 +355,6 @@ ImmutableDBOptions::ImmutableDBOptions(const DBOptions& options)
db_log_dir(options.db_log_dir), db_log_dir(options.db_log_dir),
wal_dir(options.wal_dir), wal_dir(options.wal_dir),
max_subcompactions(options.max_subcompactions), max_subcompactions(options.max_subcompactions),
max_background_flushes(options.max_background_flushes),
max_log_file_size(options.max_log_file_size), max_log_file_size(options.max_log_file_size),
log_file_time_to_roll(options.log_file_time_to_roll), log_file_time_to_roll(options.log_file_time_to_roll),
keep_log_file_num(options.keep_log_file_num), keep_log_file_num(options.keep_log_file_num),
@ -472,8 +472,6 @@ void ImmutableDBOptions::Dump(Logger* log) const {
ROCKS_LOG_HEADER(log, ROCKS_LOG_HEADER(log,
" Options.max_subcompactions: %" PRIu32, " Options.max_subcompactions: %" PRIu32,
max_subcompactions); max_subcompactions);
ROCKS_LOG_HEADER(log, " Options.max_background_flushes: %d",
max_background_flushes);
ROCKS_LOG_HEADER(log, ROCKS_LOG_HEADER(log,
" Options.WAL_ttl_seconds: %" PRIu64, " Options.WAL_ttl_seconds: %" PRIu64,
wal_ttl_seconds); wal_ttl_seconds);
@ -587,7 +585,8 @@ MutableDBOptions::MutableDBOptions()
bytes_per_sync(0), bytes_per_sync(0),
wal_bytes_per_sync(0), wal_bytes_per_sync(0),
strict_bytes_per_sync(false), strict_bytes_per_sync(false),
compaction_readahead_size(0) {} compaction_readahead_size(0),
max_background_flushes(-1) {}
MutableDBOptions::MutableDBOptions(const DBOptions& options) MutableDBOptions::MutableDBOptions(const DBOptions& options)
: max_background_jobs(options.max_background_jobs), : max_background_jobs(options.max_background_jobs),
@ -606,7 +605,8 @@ MutableDBOptions::MutableDBOptions(const DBOptions& options)
bytes_per_sync(options.bytes_per_sync), bytes_per_sync(options.bytes_per_sync),
wal_bytes_per_sync(options.wal_bytes_per_sync), wal_bytes_per_sync(options.wal_bytes_per_sync),
strict_bytes_per_sync(options.strict_bytes_per_sync), strict_bytes_per_sync(options.strict_bytes_per_sync),
compaction_readahead_size(options.compaction_readahead_size) {} compaction_readahead_size(options.compaction_readahead_size),
max_background_flushes(options.max_background_flushes) {}
void MutableDBOptions::Dump(Logger* log) const { void MutableDBOptions::Dump(Logger* log) const {
ROCKS_LOG_HEADER(log, " Options.max_background_jobs: %d", ROCKS_LOG_HEADER(log, " Options.max_background_jobs: %d",
@ -647,6 +647,8 @@ void MutableDBOptions::Dump(Logger* log) const {
ROCKS_LOG_HEADER(log, ROCKS_LOG_HEADER(log,
" Options.compaction_readahead_size: %" ROCKSDB_PRIszt, " Options.compaction_readahead_size: %" ROCKSDB_PRIszt,
compaction_readahead_size); compaction_readahead_size);
ROCKS_LOG_HEADER(log, " Options.max_background_flushes: %d",
max_background_flushes);
} }
} // namespace ROCKSDB_NAMESPACE } // namespace ROCKSDB_NAMESPACE

View File

@ -35,7 +35,6 @@ struct ImmutableDBOptions {
std::string db_log_dir; std::string db_log_dir;
std::string wal_dir; std::string wal_dir;
uint32_t max_subcompactions; uint32_t max_subcompactions;
int max_background_flushes;
size_t max_log_file_size; size_t max_log_file_size;
size_t log_file_time_to_roll; size_t log_file_time_to_roll;
size_t keep_log_file_num; size_t keep_log_file_num;
@ -114,6 +113,7 @@ struct MutableDBOptions {
uint64_t wal_bytes_per_sync; uint64_t wal_bytes_per_sync;
bool strict_bytes_per_sync; bool strict_bytes_per_sync;
size_t compaction_readahead_size; size_t compaction_readahead_size;
int max_background_flushes;
}; };
} // namespace ROCKSDB_NAMESPACE } // namespace ROCKSDB_NAMESPACE

View File

@ -61,7 +61,7 @@ DBOptions BuildDBOptions(const ImmutableDBOptions& immutable_db_options,
options.wal_bytes_per_sync = mutable_db_options.wal_bytes_per_sync; options.wal_bytes_per_sync = mutable_db_options.wal_bytes_per_sync;
options.strict_bytes_per_sync = mutable_db_options.strict_bytes_per_sync; options.strict_bytes_per_sync = mutable_db_options.strict_bytes_per_sync;
options.max_subcompactions = immutable_db_options.max_subcompactions; options.max_subcompactions = immutable_db_options.max_subcompactions;
options.max_background_flushes = immutable_db_options.max_background_flushes; options.max_background_flushes = mutable_db_options.max_background_flushes;
options.max_log_file_size = immutable_db_options.max_log_file_size; options.max_log_file_size = immutable_db_options.max_log_file_size;
options.log_file_time_to_roll = immutable_db_options.log_file_time_to_roll; options.log_file_time_to_roll = immutable_db_options.log_file_time_to_roll;
options.keep_log_file_num = immutable_db_options.keep_log_file_num; options.keep_log_file_num = immutable_db_options.keep_log_file_num;