]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix 'is session in blacklist' check in Server::apply_blacklist()
authorYan, Zheng <zyan@redhat.com>
Wed, 29 May 2019 08:25:28 +0000 (16:25 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 29 May 2019 13:55:47 +0000 (21:55 +0800)
Blacklist entries are always TYPE_ANY for nautilus+, but client's
entity addr type can be legacy.

Fixes: http://tracker.ceph.com/issues/40061
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/Server.cc

index 3cb2f977589c10b7b7a42ccfcd730314fa3248a3..fd4b900c56fa6a6c23f179eb413b1ed414b9b4ef 100644 (file)
@@ -1108,9 +1108,14 @@ void Server::kill_session(Session *session, Context *on_safe)
 
 size_t Server::apply_blacklist(const std::set<entity_addr_t> &blacklist)
 {
+  bool prenautilus = mds->objecter->with_osdmap(
+      [&](const OSDMap& o) {
+       return o.require_osd_release < ceph_release_t::nautilus;
+      });
+
   std::vector<Session*> victims;
   const auto& sessions = mds->sessionmap.get_sessions();
-  for (const auto& p : sessions)  {
+  for (const auto& p : sessions) {
     if (!p.first.is_client()) {
       // Do not apply OSDMap blacklist to MDS daemons, we find out
       // about their death via MDSMap.
@@ -1118,8 +1123,19 @@ size_t Server::apply_blacklist(const std::set<entity_addr_t> &blacklist)
     }
 
     Session *s = p.second;
-    if (blacklist.count(s->info.inst.addr)) {
+    auto inst_addr = s->info.inst.addr;
+    // blacklist entries are always TYPE_ANY for nautilus+
+    inst_addr.set_type(entity_addr_t::TYPE_ANY);
+    if (blacklist.count(inst_addr)) {
       victims.push_back(s);
+      continue;
+    }
+    if (prenautilus) {
+      // ...except pre-nautilus, they were TYPE_LEGACY
+      inst_addr.set_type(entity_addr_t::TYPE_LEGACY);
+      if (blacklist.count(inst_addr)) {
+       victims.push_back(s);
+      }
     }
   }