From: Jan Fajerski Date: Tue, 13 Mar 2018 15:21:27 +0000 (+0100) Subject: mgr: add mgr daemon to DaemonStateIndex with metadata (hostname) X-Git-Tag: v13.1.0~128^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5c9db7200eb0274e1d87c4ce0ab5ca32e090f1ea;p=ceph.git mgr: add mgr daemon to DaemonStateIndex with metadata (hostname) This commit changes when (and how) the mgr daemons are added to the DaemonStateIndex. A change in the mgr map now doesn't immediately trigger the addition of a mgr daemon, but triggers a MetadataUpdate operation so that the mgr daemon is added with metadata queried from the mon (most notably the hostname). Fixes: http://tracker.ceph.com/issues/23286 Signed-off-by: Jan Fajerski --- diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 5684ec669641..dfbd5915fa11 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -1810,24 +1810,27 @@ void DaemonServer::got_mgr_map() Mutex::Locker l(lock); set 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(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(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; } } }); diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index be39b5753427..5e74350d93fc 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -72,7 +72,7 @@ void MetadataUpdate::finish(int r) { 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); @@ -97,7 +97,7 @@ void MetadataUpdate::finish(int r) 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"); @@ -112,7 +112,7 @@ void MetadataUpdate::finish(int r) 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");