From: Sage Weil Date: Mon, 5 Mar 2018 14:35:45 +0000 (-0600) Subject: mon/ConfigMap: add ConfigChangeSet X-Git-Tag: v13.1.0~385^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a4673e50686bd32616246921b3f90c8df678ffb7;p=ceph.git mon/ConfigMap: add ConfigChangeSet Signed-off-by: Sage Weil --- diff --git a/src/mon/ConfigMap.cc b/src/mon/ConfigMap.cc index 3ac72f6dd342..bd4fd0c0bef6 100644 --- a/src/mon/ConfigMap.cc +++ b/src/mon/ConfigMap.cc @@ -168,3 +168,43 @@ bool ConfigMap::parse_mask( } return true; } + + +// -------------- + +void ConfigChangeSet::dump(Formatter *f) const +{ + f->dump_int("version", version); + f->dump_stream("timestamp") << stamp; + f->dump_string("name", name); + f->open_array_section("changes"); + for (auto& i : diff) { + f->open_object_section("change"); + f->dump_string("name", i.first); + if (i.second.first) { + f->dump_string("previous_value", *i.second.first); + } + if (i.second.second) { + f->dump_string("new_value", *i.second.second); + } + f->close_section(); + } + f->close_section(); +} + +void ConfigChangeSet::print(ostream& out) const +{ + out << "--- " << version << " --- " << stamp; + if (name.size()) { + out << " --- " << name; + } + out << " ---\n"; + for (auto& i : diff) { + if (i.second.first) { + out << "- " << i.first << " = " << *i.second.first << "\n"; + } + if (i.second.second) { + out << "+ " << i.first << " = " << *i.second.second << "\n"; + } + } +} diff --git a/src/mon/ConfigMap.h b/src/mon/ConfigMap.h index 02b4d9d9e7c5..c4b1abf7f7a3 100644 --- a/src/mon/ConfigMap.h +++ b/src/mon/ConfigMap.h @@ -7,6 +7,7 @@ #include #include +#include "include/utime.h" #include "common/options.h" #include "common/entity_name.h" @@ -125,3 +126,16 @@ struct ConfigMap { std::string *section, OptionMask *mask); }; + + +struct ConfigChangeSet { + version_t version; + utime_t stamp; + string name; + + // key -> (old value, new value) + map,boost::optional>> diff; + + void dump(Formatter *f) const; + void print(ostream& out) const; +}; diff --git a/src/mon/ConfigMonitor.cc b/src/mon/ConfigMonitor.cc index 85b45c8deb05..da2de3cd7fb8 100644 --- a/src/mon/ConfigMonitor.cc +++ b/src/mon/ConfigMonitor.cc @@ -630,6 +630,36 @@ void ConfigMonitor::load_config() } } +void ConfigMonitor::load_changeset(version_t v, ConfigChangeSet *ch) +{ + ch->version = v; + string prefix = HISTORY_PREFIX + stringify(v) + "/"; + KeyValueDB::Iterator it = mon->store->get_iterator(CONFIG_PREFIX); + it->lower_bound(prefix); + while (it->valid() && it->key().find(prefix) == 0) { + if (it->key() == prefix) { + bufferlist bl = it->value(); + auto p = bl.begin(); + try { + decode(ch->stamp, p); + decode(ch->name, p); + } + catch (buffer::error& e) { + derr << __func__ << " failure decoding changeset " << v << dendl; + } + } else { + char op = it->key()[prefix.length()]; + string key = it->key().substr(prefix.length() + 1); + if (op == '-') { + ch->diff[key].first = it->value().to_str(); + } else if (op == '+') { + ch->diff[key].second = it->value().to_str(); + } + } + it->next(); + } +} + bool ConfigMonitor::refresh_config(MonSession *s) { const OSDMap& osdmap = mon->osdmon()->osdmap;