From 7c25de3799da8cdb12f0eaf28b187c5ea9ba5803 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 13 Feb 2018 15:56:47 +0800 Subject: [PATCH] common/config: specialize the settings for size Signed-off-by: Kefu Chai --- src/common/config.cc | 29 ++++++++++++++ src/common/options.cc | 17 +++++++-- src/common/options.h | 70 ++++++++++++++++++++++------------ src/mgr/DaemonServer.cc | 8 ++-- src/test/common/test_config.cc | 8 ++++ 5 files changed, 99 insertions(+), 33 deletions(-) diff --git a/src/common/config.cc b/src/common/config.cc index a1f0fbdbf2e..b0912f90ae9 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -1413,6 +1413,22 @@ int md_config_t::_rm_val(const std::string& key, int level) return 0; } +namespace { +template +struct get_size_visitor : public boost::static_visitor +{ + template + Size operator()(const T&) const { + return -1; + } + Size operator()(const Option::size_t& sz) const { + return static_cast(sz.value); + } + Size operator()(const Size& v) const { + return v; + } +}; + /** * Handles assigning from a variant-of-types to a variant-of-pointers-to-types */ @@ -1433,7 +1449,20 @@ class assign_visitor : public boost::static_visitor<> *member = boost::get(val); } + void operator()(uint64_t md_config_t::* ptr) const + { + using T = uint64_t; + auto member = const_cast(&(conf->*(boost::get(ptr)))); + *member = boost::apply_visitor(get_size_visitor{}, val); + } + void operator()(int64_t md_config_t::* ptr) const + { + using T = int64_t; + auto member = const_cast(&(conf->*(boost::get(ptr)))); + *member = boost::apply_visitor(get_size_visitor{}, val); + } }; +} // anonymous namespace void md_config_t::update_legacy_vals() { diff --git a/src/common/options.cc b/src/common/options.cc index 88fb0689521..a2a61f13c1d 100644 --- a/src/common/options.cc +++ b/src/common/options.cc @@ -34,6 +34,9 @@ void Option::dump_value(const char *field_name, f->dump_float(field_name, boost::get(v)); } else if (type == TYPE_BOOL) { f->dump_bool(field_name, boost::get(v)); + } else if (type == TYPE_SIZE) { + auto bytes = boost::get(v); + f->dump_stream(field_name) << prettybyte_t(bytes.value); } else { f->dump_stream(field_name) << v; } @@ -146,6 +149,12 @@ int Option::parse_value( return -EINVAL; } *out = uuid; + } else if (type == Option::TYPE_SIZE) { + Option::size_t sz{strict_sistrtoll(val.c_str(), error_message)}; + if (!error_message->empty()) { + return -EINVAL; + } + *out = sz; } else { ceph_abort(); } @@ -4611,7 +4620,7 @@ std::vector