]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: request mon metadata when receiving a report msg from an unknown monitor
authorcfanz <songxinying@sensetime.com>
Sun, 30 Dec 2018 03:49:58 +0000 (11:49 +0800)
committerPrashant D <pdhange@redhat.com>
Thu, 31 Jan 2019 23:20:42 +0000 (18:20 -0500)
* 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 <songxinying@sensetime.com>
(cherry picked from commit 430ba5e231d6929a004a9758d31b426ecbe43951)

Conflicts:
src/mgr/Mgr.cc : Resolved in finish

src/mgr/DaemonServer.cc
src/mgr/Mgr.cc
src/mgr/Mgr.h
src/mgr/MgrStandby.cc

index 19c59a38d757492b42931f17b74a1bf664907a55..89b1e43d9a325996004412d11cc36d7382b11fea 100644 (file)
@@ -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();
       }
index 75f1877931aa4c483556e21ac3717ea668fd0b3a..17389d3de5e1ea98e03cde1093ae68420aa60907 100644 (file)
@@ -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<std::string> 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:
index e5b558a791b477feca898b1afb1a836cb2eda8fc..40cd8d7fdd450604c5724e5c89e63a84faffecac 100644 (file)
@@ -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);
 
index 5e267feab693a7572c4873dbed6952bea2fb1237..cdb0f8239d86709b592276c46f8d6be81e145e34 100644 (file)
@@ -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));