From: Kefu Chai Date: Tue, 13 Feb 2018 07:56:47 +0000 (+0800) Subject: common/config: specialize the settings for size X-Git-Tag: v13.0.2~25^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7c25de3799da8cdb12f0eaf28b187c5ea9ba5803;p=ceph.git common/config: specialize the settings for size Signed-off-by: Kefu Chai --- diff --git a/src/common/config.cc b/src/common/config.cc index a1f0fbdbf2ed..b0912f90ae92 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 88fb0689521f..a2a61f13c1d4 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