]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: kill MgrSession when MMgrReport come from daemon without metadata info
authorliuchang0812 <liuchang0812@gmail.com>
Thu, 24 Aug 2017 02:56:29 +0000 (10:56 +0800)
committerNathan Cutler <ncutler@suse.com>
Thu, 25 Jan 2018 16:09:55 +0000 (17:09 +0100)
Signed-off-by: liuchang0812 <liuchang0812@gmail.com>
(cherry picked from commit 29080134339e5e64d50af1db9fe50df7ea55c1d0)

src/mgr/DaemonServer.cc
src/mgr/Mgr.cc

index 321a38ad5349496154d1b4c6338e98fef52f0338..e612086ad3ec262b158b40ba42673b7b020ecb3c 100644 (file)
@@ -416,14 +416,18 @@ bool DaemonServer::handle_report(MMgrReport *m)
     dout(20) << "updating existing DaemonState for " << key << dendl;
     daemon = daemon_state.get(key);
   } else {
-    dout(4) << "constructing new DaemonState for " << key << dendl;
-    daemon = std::make_shared<DaemonState>(daemon_state.types);
-    // FIXME: crap, we don't know the hostname at this stage.
-    daemon->key = key;
-    daemon_state.insert(daemon);
-    // FIXME: we should avoid this case by rejecting MMgrReport from
-    // daemons without sessions, and ensuring that session open
-    // always contains metadata.
+    // we don't know the hostname at this stage, reject MMgrReport here.
+    dout(1) << "rejecting report from " << key << ", since we do not have its metadata now."
+           << dendl;
+    // kill session
+    MgrSessionRef session(static_cast<MgrSession*>(m->get_connection()->get_priv()));
+    if (!session) {
+      return false;
+    }
+    m->get_connection()->mark_down();
+    session->put();
+
+    return false;
   }
 
   // Update the DaemonState
index 2ed89636f6b9139c1d0a8e5814911f6446c6d523..7615bd647cd1f549bd3020d59769ac63ca6d2f10 100644 (file)
@@ -412,7 +412,7 @@ void Mgr::handle_osd_map()
    * reload the metadata.
    */
   objecter->with_osdmap([this, &names_exist](const OSDMap &osd_map) {
-    for (unsigned int osd_id = 0; osd_id < osd_map.get_num_osds(); ++osd_id) {
+    for (unsigned int osd_id = 0; osd_id < osd_map.get_max_osd(); ++osd_id) {
       if (!osd_map.exists(osd_id)) {
         continue;
       }