Mutex::Locker l(lock);
set<std::string> have;
cluster_state.with_mgrmap([&](const MgrMap& mgrmap) {
+ auto md_update = [&] (DaemonKey key) {
+ std::ostringstream oss;
+ auto c = new MetadataUpdate(daemon_state, key);
+ oss << "{\"prefix\": \"mgr metadata\", \"who\": \""
+ << key.second << "\"}";
+ monc->start_mon_command({oss.str()}, {}, &c->outbl, &c->outs, c);
+ };
if (mgrmap.active_name.size()) {
DaemonKey key("mgr", mgrmap.active_name);
have.insert(mgrmap.active_name);
- if (!daemon_state.exists(key)) {
- auto daemon = std::make_shared<DaemonState>(daemon_state.types);
- daemon->key = key;
- daemon_state.insert(daemon);
- dout(10) << "added missing " << key << dendl;
+ if (!daemon_state.exists(key) && !daemon_state.is_updating(key)) {
+ md_update(key);
+ dout(10) << "triggered addition of " << key << " via metadata update" << dendl;
}
}
for (auto& i : mgrmap.standbys) {
- DaemonKey key("mgr", i.second.name);
+ DaemonKey key("mgr", i.second.name);
have.insert(i.second.name);
- if (!daemon_state.exists(key)) {
- auto daemon = std::make_shared<DaemonState>(daemon_state.types);
- daemon->key = key;
- daemon_state.insert(daemon);
- dout(10) << "added missing " << key << dendl;
+ if (!daemon_state.exists(key) && !daemon_state.is_updating(key)) {
+ md_update(key);
+ dout(10) << "triggered addition of " << key << " via metadata update" << dendl;
}
}
});
{
daemon_state.clear_updating(key);
if (r == 0) {
- if (key.first == "mds" || key.first == "osd") {
+ if (key.first == "mds" || key.first == "osd" || key.first == "mgr") {
json_spirit::mValue json_result;
bool read_ok = json_spirit::read(
outbl.to_str(), json_result);
if (daemon_state.exists(key)) {
state = daemon_state.get(key);
Mutex::Locker l(state->lock);
- if (key.first == "mds") {
+ if (key.first == "mds" || key.first == "mgr") {
daemon_meta.erase("name");
} else if (key.first == "osd") {
daemon_meta.erase("id");
state->key = key;
state->hostname = daemon_meta.at("hostname").get_str();
- if (key.first == "mds") {
+ if (key.first == "mds" || key.first == "mgr") {
daemon_meta.erase("name");
} else if (key.first == "osd") {
daemon_meta.erase("id");