mirror of https://github.com/facebook/rocksdb.git
Avoid updating option if there's no value updated (#8518)
Summary: Try avoid expensive updating options operation if `SetDBOptions()` does not change any option value. Skip updating is not guaranteed, for example, changing `bytes_per_sync` to `0` may still trigger updating, as the value could be sanitized. Pull Request resolved: https://github.com/facebook/rocksdb/pull/8518 Test Plan: added unittest Reviewed By: riversand963 Differential Revision: D29672639 Pulled By: jay-zhuang fbshipit-source-id: b7931de62ceea6f1bdff0d1209adf1197d3ed1f4
This commit is contained in:
parent
6b4cdacf41
commit
42eaa45c1b
|
@ -21,6 +21,10 @@
|
||||||
### Public API change
|
### Public API change
|
||||||
* Added APIs to the Customizable class to allow developers to create their own Customizable classes. Created the utilities/customizable_util.h file to contain helper methods for developing new Customizable classes.
|
* Added APIs to the Customizable class to allow developers to create their own Customizable classes. Created the utilities/customizable_util.h file to contain helper methods for developing new Customizable classes.
|
||||||
* Change signature of SecondaryCache::Name(). Make SecondaryCache customizable and add SecondaryCache::CreateFromString method.
|
* Change signature of SecondaryCache::Name(). Make SecondaryCache customizable and add SecondaryCache::CreateFromString method.
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
* Try to avoid updating DBOptions if `SetDBOptions()` does not change any option value.
|
||||||
|
|
||||||
## 6.22.0 (2021-06-18)
|
## 6.22.0 (2021-06-18)
|
||||||
### Behavior Changes
|
### Behavior Changes
|
||||||
* Added two additional tickers, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH and MEMTABLE_GARBAGE_BYTES_AT_FLUSH. These stats can be used to estimate the ratio of "garbage" (outdated) bytes in the memtable that are discarded at flush time.
|
* Added two additional tickers, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH and MEMTABLE_GARBAGE_BYTES_AT_FLUSH. These stats can be used to estimate the ratio of "garbage" (outdated) bytes in the memtable that are discarded at flush time.
|
||||||
|
|
|
@ -1136,9 +1136,19 @@ Status DBImpl::SetDBOptions(
|
||||||
InstrumentedMutexLock l(&mutex_);
|
InstrumentedMutexLock l(&mutex_);
|
||||||
s = GetMutableDBOptionsFromStrings(mutable_db_options_, options_map,
|
s = GetMutableDBOptionsFromStrings(mutable_db_options_, options_map,
|
||||||
&new_options);
|
&new_options);
|
||||||
|
|
||||||
if (new_options.bytes_per_sync == 0) {
|
if (new_options.bytes_per_sync == 0) {
|
||||||
new_options.bytes_per_sync = 1024 * 1024;
|
new_options.bytes_per_sync = 1024 * 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MutableDBOptionsAreEqual(mutable_db_options_, new_options)) {
|
||||||
|
ROCKS_LOG_INFO(immutable_db_options_.info_log,
|
||||||
|
"SetDBOptions(), input option value is not changed, "
|
||||||
|
"skipping updating.");
|
||||||
|
persist_options_status.PermitUncheckedError();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
DBOptions new_db_options =
|
DBOptions new_db_options =
|
||||||
BuildDBOptions(immutable_db_options_, new_options);
|
BuildDBOptions(immutable_db_options_, new_options);
|
||||||
if (s.ok()) {
|
if (s.ok()) {
|
||||||
|
@ -4194,6 +4204,8 @@ Status DBImpl::WriteOptionsFile(bool need_mutex_lock,
|
||||||
|
|
||||||
TEST_SYNC_POINT("DBImpl::WriteOptionsFile:1");
|
TEST_SYNC_POINT("DBImpl::WriteOptionsFile:1");
|
||||||
TEST_SYNC_POINT("DBImpl::WriteOptionsFile:2");
|
TEST_SYNC_POINT("DBImpl::WriteOptionsFile:2");
|
||||||
|
TEST_SYNC_POINT_CALLBACK("DBImpl::WriteOptionsFile:PersistOptions",
|
||||||
|
&db_options);
|
||||||
|
|
||||||
std::string file_name =
|
std::string file_name =
|
||||||
TempOptionsFileName(GetName(), versions_->NewFileNumber());
|
TempOptionsFileName(GetName(), versions_->NewFileNumber());
|
||||||
|
|
|
@ -98,6 +98,66 @@ TEST_F(DBOptionsTest, ImmutableTrackAndVerifyWalsInManifest) {
|
||||||
// RocksDB lite don't support dynamic options.
|
// RocksDB lite don't support dynamic options.
|
||||||
#ifndef ROCKSDB_LITE
|
#ifndef ROCKSDB_LITE
|
||||||
|
|
||||||
|
TEST_F(DBOptionsTest, AvoidUpdatingOptions) {
|
||||||
|
Options options;
|
||||||
|
options.env = env_;
|
||||||
|
options.max_background_jobs = 4;
|
||||||
|
options.delayed_write_rate = 1024;
|
||||||
|
|
||||||
|
Reopen(options);
|
||||||
|
|
||||||
|
SyncPoint::GetInstance()->DisableProcessing();
|
||||||
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
||||||
|
bool is_changed_stats = false;
|
||||||
|
SyncPoint::GetInstance()->SetCallBack(
|
||||||
|
"DBImpl::WriteOptionsFile:PersistOptions", [&](void* /*arg*/) {
|
||||||
|
ASSERT_FALSE(is_changed_stats); // should only save options file once
|
||||||
|
is_changed_stats = true;
|
||||||
|
});
|
||||||
|
SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
|
||||||
|
// helper function to check the status and reset after each check
|
||||||
|
auto is_changed = [&] {
|
||||||
|
bool ret = is_changed_stats;
|
||||||
|
is_changed_stats = false;
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
// without changing the value, but it's sanitized to a different value
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions({{"bytes_per_sync", "0"}}));
|
||||||
|
ASSERT_TRUE(is_changed());
|
||||||
|
|
||||||
|
// without changing the value
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions({{"max_background_jobs", "4"}}));
|
||||||
|
ASSERT_FALSE(is_changed());
|
||||||
|
|
||||||
|
// changing the value
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions({{"bytes_per_sync", "123"}}));
|
||||||
|
ASSERT_TRUE(is_changed());
|
||||||
|
|
||||||
|
// update again
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions({{"bytes_per_sync", "123"}}));
|
||||||
|
ASSERT_FALSE(is_changed());
|
||||||
|
|
||||||
|
// without changing a default value
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions({{"strict_bytes_per_sync", "false"}}));
|
||||||
|
ASSERT_FALSE(is_changed());
|
||||||
|
|
||||||
|
// now change
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions({{"strict_bytes_per_sync", "true"}}));
|
||||||
|
ASSERT_TRUE(is_changed());
|
||||||
|
|
||||||
|
// multiple values without change
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions(
|
||||||
|
{{"max_total_wal_size", "0"}, {"stats_dump_period_sec", "600"}}));
|
||||||
|
ASSERT_FALSE(is_changed());
|
||||||
|
|
||||||
|
// multiple values with change
|
||||||
|
ASSERT_OK(dbfull()->SetDBOptions(
|
||||||
|
{{"max_open_files", "100"}, {"stats_dump_period_sec", "600"}}));
|
||||||
|
ASSERT_TRUE(is_changed());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(DBOptionsTest, GetLatestDBOptions) {
|
TEST_F(DBOptionsTest, GetLatestDBOptions) {
|
||||||
// GetOptions should be able to get latest option changed by SetOptions.
|
// GetOptions should be able to get latest option changed by SetOptions.
|
||||||
Options options;
|
Options options;
|
||||||
|
|
|
@ -872,6 +872,15 @@ Status GetMutableDBOptionsFromStrings(
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MutableDBOptionsAreEqual(const MutableDBOptions& this_options,
|
||||||
|
const MutableDBOptions& that_options) {
|
||||||
|
ConfigOptions config_options;
|
||||||
|
std::string mismatch;
|
||||||
|
return OptionTypeInfo::StructsAreEqual(
|
||||||
|
config_options, "MutableDBOptions", &db_mutable_options_type_info,
|
||||||
|
"MutableDBOptions", &this_options, &that_options, &mismatch);
|
||||||
|
}
|
||||||
|
|
||||||
Status GetStringFromMutableDBOptions(const ConfigOptions& config_options,
|
Status GetStringFromMutableDBOptions(const ConfigOptions& config_options,
|
||||||
const MutableDBOptions& mutable_opts,
|
const MutableDBOptions& mutable_opts,
|
||||||
std::string* opt_string) {
|
std::string* opt_string) {
|
||||||
|
|
|
@ -141,6 +141,9 @@ Status GetMutableDBOptionsFromStrings(
|
||||||
const MutableDBOptions& base_options,
|
const MutableDBOptions& base_options,
|
||||||
const std::unordered_map<std::string, std::string>& options_map,
|
const std::unordered_map<std::string, std::string>& options_map,
|
||||||
MutableDBOptions* new_options);
|
MutableDBOptions* new_options);
|
||||||
|
|
||||||
|
bool MutableDBOptionsAreEqual(const MutableDBOptions& this_options,
|
||||||
|
const MutableDBOptions& that_options);
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
|
|
||||||
} // namespace ROCKSDB_NAMESPACE
|
} // namespace ROCKSDB_NAMESPACE
|
||||||
|
|
Loading…
Reference in New Issue