]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: don't mark unresponsive sessions holding no caps stale
authorRishabh Dave <ridave@redhat.com>
Wed, 17 Oct 2018 12:42:43 +0000 (12:42 +0000)
committerYan, Zheng <zyan@redhat.com>
Sat, 8 Jun 2019 13:14:21 +0000 (21:14 +0800)
When an unresponsive MDS session holds no caps, do not mark it stale
even after session_timeout; at session_autoclose, evict it directly.

Fixes: http://tracker.ceph.com/issues/17854
Signed-off-by: Rishabh Dave <ridave@redhat.com>
src/mds/Locker.cc
src/mds/Locker.h
src/mds/Server.cc
src/mds/SessionMap.h

index 31d941de892453d17c30de7f5b829fcf8ca7319d..2d5bfb88501c043b614e1ed47a3aa57f77e4d791 100644 (file)
@@ -2622,6 +2622,14 @@ void Locker::mark_need_snapflush_inode(CInode *in)
   }
 }
 
+bool Locker::is_revoking_any_caps_from(client_t client)
+{
+  auto it = revoking_caps_by_client.find(client);
+  if (it == revoking_caps_by_client.end())
+    return false;
+  return !it->second.empty();
+}
+
 void Locker::_do_null_snapflush(CInode *head_in, client_t client, snapid_t last)
 {
   dout(10) << "_do_null_snapflush client." << client << " on " << *head_in << dendl;
index 7ed6e7a1dc643c94e353976d5ecc1221f87e7d03..dd8494816debb5479231c4a4c13f42e4c61050eb 100644 (file)
@@ -208,6 +208,7 @@ protected:
 public:
   void snapflush_nudge(CInode *in);
   void mark_need_snapflush_inode(CInode *in);
+  bool is_revoking_any_caps_from(client_t client);
 
   // local
 public:
index d4392d1b604339d85b36e2fe235694d0cf7dad5d..b23dbd89bfdb888a5608bd29b82a78e1c1fd56ab 100644 (file)
@@ -956,6 +956,21 @@ void Server::find_idle_sessions()
        }
       }
 
+      if (last_cap_renew_span >= mds->mdsmap->get_session_autoclose()) {
+       dout(20) << "evicting session " << session->info.inst << " since autoclose "
+                   "has arrived" << dendl;
+       // evict session without marking it stale
+       to_evict.push_back(session);
+       continue;
+      }
+
+      if (!session->is_any_flush_waiter() &&
+         !mds->locker->is_revoking_any_caps_from(session->get_client())) {
+       dout(20) << "deferring marking session " << session->info.inst << " stale "
+                   "since it holds no caps" << dendl;
+       continue;
+      }
+
       auto it = session->info.client_metadata.find("timeout");
       if (it != session->info.client_metadata.end()) {
        unsigned timeout = strtoul(it->second.c_str(), nullptr, 0);
index abcaab679d04562a801b5183a1e8156f564c0a2c..0dfbc51b5ac7ca7a92a53e1d194e0487fdc4814b 100644 (file)
@@ -300,13 +300,19 @@ public:
   void touch_cap(Capability *cap) {
     caps.push_front(&cap->item_session_caps);
   }
+
   void touch_cap_bottom(Capability *cap) {
     caps.push_back(&cap->item_session_caps);
   }
+
   void touch_lease(ClientLease *r) {
     leases.push_back(&r->item_session_lease);
   }
 
+  bool is_any_flush_waiter() {
+    return !waitfor_flush.empty();
+  }
+
   // -- leases --
   uint32_t lease_seq = 0;