If we can't set a mon config value, report that back to the mgr.
Signed-off-by: Sage Weil <sage@redhat.com>
int md_config_t::set_mon_vals(CephContext *cct, const map<string,string>& kv)
{
Mutex::Locker l(lock);
+ ignored_mon_values.clear();
for (auto& i : kv) {
const Option *o = find_option(i.first);
if (!o) {
continue;
}
if (o->has_flag(Option::FLAG_NO_MON_UPDATE)) {
+ ignored_mon_values.emplace(i);
continue;
}
std::string err;
if (r < 0) {
lderr(cct) << __func__ << " failed to set " << i.first << " = "
<< i.second << ": " << err << dendl;
+ ignored_mon_values.emplace(i);
} else if (r == 0) {
ldout(cct,20) << __func__ << " " << i.first << " = " << i.second
<< " (no change)" << dendl;
::encode(stringify(j.second), bl);
}
}
+ // make sure overridden items appear, and include the default value
+ for (auto& i : ignored_mon_values) {
+ if (values.count(i.first)) {
+ continue;
+ }
+ if (i.first == "fsid" ||
+ i.first == "host") {
+ continue;
+ }
+ const Option *opt = find_option(i.first);
+ if (!opt) {
+ continue;
+ }
+ ++n;
+ ::encode(i.first, bl);
+ ::encode((uint32_t)1, bl);
+ ::encode((int32_t)CONF_DEFAULT, bl);
+ string val;
+ conf_stringify(_get_val_default(*opt), &val);
+ ::encode(val, bl);
+ }
::encode(n, values_bl);
values_bl.claim_append(bl);
+ ::encode(ignored_mon_values, values_bl);
}
*bl = values_bl;
}
*/
std::map<std::string, map<int32_t,Option::value_t>> values;
- /// encoded, cached copy of of values
+ /// values from mon that we failed to set
+ std::map<std::string,std::string> ignored_mon_values;
+
+ /// encoded, cached copy of of values + ignored_mon_values
bufferlist values_bl;
/// encoded copy of defaults (map<string,string>)
auto p = m->config_bl.begin();
if (p != m->config_bl.end()) {
::decode(daemon->config, p);
- dout(20) << " got config " << daemon->config << dendl;
+ ::decode(daemon->ignored_mon_config, p);
+ dout(20) << " got config " << daemon->config
+ << " ignored " << daemon->ignored_mon_config << dendl;
}
daemon->config_defaults_bl = m->config_defaults_bl;
daemon->config_defaults.clear();
auto p = m->config_bl.begin();
if (p != m->config_bl.end()) {
::decode(daemon->config, p);
- dout(20) << " got config " << daemon->config << dendl;
+ ::decode(daemon->ignored_mon_config, p);
+ dout(20) << " got config " << daemon->config
+ << " ignored " << daemon->ignored_mon_config << dendl;
}
if (daemon->service_daemon) {
// running config
std::map<std::string,std::map<int32_t,std::string>> config;
+ // mon config values we failed to set
+ std::map<std::string,std::string> ignored_mon_config;
+
// compiled-in config defaults (rarely used, so we leave them encoded!)
bufferlist config_defaults_bl;
std::map<std::string,std::string> config_defaults;