From 56ca87ae3b3c341a78a8df8f95d3bf31828c9108 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 23 Nov 2020 20:55:01 +0800 Subject: [PATCH] common: do not dup the options when reexpanding The old code will store all the options, which has `$pid` in them, in may_reexpand_meta map. And when reexpanding later, the reexpand code will dup them with a higher priority(CONF_OVERRIDE). This will be a problem, if the default value has `$pid` and be stored in the may_reexpand_meta map, and then the code set a new different value, which may have no `$pid`, from CLI or config file. The reexpand will override it with the default value always. This will do not duplicate the options with CONF_OVERRIDE priority when reexpanding, just refresh them and call the observers. And the finalize_reexpand_meta() will always be called after the fork() is done in child processes. Fixes: https://tracker.ceph.com/issues/48240 Signed-off-by: Xiubo Li --- src/common/config.cc | 24 +++++++++++++----------- src/common/config.h | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/common/config.cc b/src/common/config.cc index fcfa689a76de0..9cd42c6a5d8a8 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -1124,17 +1124,19 @@ void md_config_t::early_expand_meta( bool md_config_t::finalize_reexpand_meta(ConfigValues& values, const ConfigTracker& tracker) { - for (auto& [name, value] : may_reexpand_meta) { - set_val(values, tracker, name, value); - } - - if (!may_reexpand_meta.empty()) { - // meta expands could have modified anything. Copy it all out again. - update_legacy_vals(values); - return true; - } else { - return false; + std::vector reexpands; + reexpands.swap(may_reexpand_meta); + for (auto& name : reexpands) { + // always refresh the options if they are in the may_reexpand_meta + // map, because the options may have already been expanded with old + // meta. + const auto &opt_iter = schema.find(name); + ceph_assert(opt_iter != schema.end()); + const Option &opt = opt_iter->second; + _refresh(values, opt); } + + return !may_reexpand_meta.empty(); } Option::value_t md_config_t::_expand_meta( @@ -1218,7 +1220,7 @@ Option::value_t md_config_t::_expand_meta( } else if (var == "pid") { out += stringify(getpid()); if (o) { - may_reexpand_meta[o->name] = *str; + may_reexpand_meta.push_back(o->name); } } else if (var == "cctid") { out += stringify((unsigned long long)this); diff --git a/src/common/config.h b/src/common/config.h index a44fab0a4ee52..bb3410e617d15 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -100,7 +100,7 @@ public: std::map ignored_mon_values; /// original raw values saved that may need to re-expand at certain time - mutable std::map may_reexpand_meta; + mutable std::vector may_reexpand_meta; /// encoded, cached copy of of values + ignored_mon_values ceph::bufferlist values_bl; -- 2.39.5