From: Xiubo Li Date: Mon, 23 Nov 2020 12:55:01 +0000 (+0800) Subject: common: do not dup the options when reexpanding X-Git-Tag: v15.2.9~127^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4b4aa87d6a7be6312a34064dea627d082dc4832f;p=ceph.git 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 (cherry picked from commit 56ca87ae3b3c341a78a8df8f95d3bf31828c9108) --- diff --git a/src/common/config.cc b/src/common/config.cc index dd4958d401cba..53007f925146d 100644 --- a/src/common/config.cc +++ b/src/common/config.cc @@ -1107,17 +1107,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( @@ -1201,7 +1203,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 e07993701ef0f..7bbf8bb74764c 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;