]> git.apps.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>
Tue, 18 Jun 2019 02:14:06 +0000 (10:14 +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>
(cherry picked from commit 0d51266c45f4b2a9b0ab6b34b622dc76fbfd4bd2)

 Conflicts:
src/mds/Server.cc

src/mds/Server.cc

index 8d9993a31c448f18d93fcc6c4c736abab2e0854d..b509077431a388995351bfccd78b93c48c550edd 100644 (file)
@@ -1109,9 +1109,14 @@ void Server::kill_session(Session *session, Context *on_safe)
 
 size_t Server::apply_blacklist(const std::set<entity_addr_t> &blacklist)
 {
-  std::list<Session*> victims;
+  bool prenautilus = mds->objecter->with_osdmap(
+      [&](const OSDMap& o) {
+       return o.require_osd_release < CEPH_RELEASE_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.
@@ -1119,8 +1124,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);
+      }
     }
   }