From: cfanz Date: Sun, 30 Dec 2018 03:49:58 +0000 (+0800) Subject: mgr: request mon metadata when receiving a report msg from an unknown monitor X-Git-Tag: v13.2.5~37^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=314c9e0cf093262d131a80f5682799b3d87c56d8;p=ceph.git mgr: request mon metadata when receiving a report msg from an unknown monitor * Mgr needs to issue an metadata request when receiving a report message from a monitor who hasn't been in the mgr's daemon_state. Otherwise the connection between mgr and monitor cannot be established. Fixes: http://tracker.ceph.com/issues/37753 Signed-off-by: Xinying Song (cherry picked from commit 430ba5e231d6929a004a9758d31b426ecbe43951) Conflicts: src/mgr/Mgr.cc : Resolved in finish --- diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 19c59a38d75..89b1e43d9a3 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -491,7 +491,7 @@ bool DaemonServer::handle_report(MMgrReport *m) // issue metadata request in background if (!daemon_state.is_updating(key) && - (key.first == "osd" || key.first == "mds")) { + (key.first == "osd" || key.first == "mds" || key.first == "mon")) { std::ostringstream oss; auto c = new MetadataUpdate(daemon_state, key); @@ -504,6 +504,9 @@ bool DaemonServer::handle_report(MMgrReport *m) oss << "{\"prefix\": \"mds metadata\", \"who\": \"" << key.second << "\"}"; + } else if (key.first == "mon") { + oss << "{\"prefix\": \"mon metadata\", \"id\": \"" + << key.second << "\"}"; } else { ceph_abort(); } diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index 75f1877931a..17389d3de5e 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -72,7 +72,8 @@ void MetadataUpdate::finish(int r) { daemon_state.clear_updating(key); if (r == 0) { - if (key.first == "mds" || key.first == "osd" || key.first == "mgr") { + if (key.first == "mds" || key.first == "osd" || + key.first == "mgr" || key.first == "mon") { json_spirit::mValue json_result; bool read_ok = json_spirit::read( outbl.to_str(), json_result); @@ -97,7 +98,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" || key.first == "mgr") { + if (key.first == "mds" || key.first == "mgr" || key.first == "mon") { daemon_meta.erase("name"); } else if (key.first == "osd") { daemon_meta.erase("id"); @@ -112,7 +113,7 @@ void MetadataUpdate::finish(int r) state->key = key; state->hostname = daemon_meta.at("hostname").get_str(); - if (key.first == "mds" || key.first == "mgr") { + if (key.first == "mds" || key.first == "mgr" || key.first == "mon") { daemon_meta.erase("name"); } else if (key.first == "osd") { daemon_meta.erase("id"); @@ -466,6 +467,19 @@ void Mgr::handle_service_map(MServiceMap *m) server.got_service_map(); } +void Mgr::handle_mon_map() +{ + dout(20) << __func__ << dendl; + assert(lock.is_locked_by_me()); + std::set names_exist; + cluster_state.with_monmap([&] (auto &monmap) { + for (unsigned int i = 0; i < monmap.size(); i++) { + names_exist.insert(monmap.get_name(i)); + } + }); + daemon_state.cull("mon", names_exist); +} + bool Mgr::ms_dispatch(Message *m) { dout(4) << *m << dendl; @@ -477,6 +491,7 @@ bool Mgr::ms_dispatch(Message *m) break; case CEPH_MSG_MON_MAP: py_module_registry->notify_all("mon_map", ""); + handle_mon_map(); m->put(); break; case CEPH_MSG_FS_MAP: diff --git a/src/mgr/Mgr.h b/src/mgr/Mgr.h index e5b558a791b..40cd8d7fdd4 100644 --- a/src/mgr/Mgr.h +++ b/src/mgr/Mgr.h @@ -85,6 +85,7 @@ public: void handle_osd_map(); void handle_log(MLog *m); void handle_service_map(MServiceMap *m); + void handle_mon_map(); bool got_mgr_map(const MgrMap& m); diff --git a/src/mgr/MgrStandby.cc b/src/mgr/MgrStandby.cc index 5e267feab69..cdb0f8239d8 100644 --- a/src/mgr/MgrStandby.cc +++ b/src/mgr/MgrStandby.cc @@ -158,6 +158,11 @@ int MgrStandby::init() client_messenger->wait(); return r; } + // only forward monmap updates after authentication finishes, otherwise + // monc.authenticate() will be waiting for MgrStandy::ms_dispatch() + // to acquire the lock forever, as it is already locked in the beginning of + // this method. + monc.set_passthrough_monmap(); client_t whoami = monc.get_global_id(); client_messenger->set_myname(entity_name_t::MGR(whoami.v));