]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: renew client session when receiving any message
authorYan, Zheng <zyan@redhat.com>
Mon, 19 Nov 2018 09:08:30 +0000 (17:08 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 7 Jan 2019 08:40:50 +0000 (16:40 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 593dfee07334668a912abd9732a5d138eb27058a)

 Conflicts:
src/mds/MDSRank.cc
src/mds/Server.cc
src/mds/SessionMap.h

src/mds/MDSRank.cc
src/mds/Server.cc
src/mds/SessionMap.h

index ce82e3707e568c90b08346ec9670f109ee08fa04..a97846200971855856dcb612ce6268e02dcf2558 100644 (file)
@@ -910,9 +910,14 @@ void MDSRank::ProgressThread::shutdown()
 
 bool MDSRankDispatcher::ms_dispatch(Message *m)
 {
-  bool ret;
+  if (m->get_source().is_client()) {
+    Session *session = static_cast<Session*>(m->get_connection()->get_priv());
+    if (session)
+      session->last_seen = Session::clock::now();
+  }
+
   inc_dispatch_depth();
-  ret = _dispatch(m, true);
+  bool ret = _dispatch(m, true);
   dec_dispatch_depth();
   return ret;
 }
@@ -1257,6 +1262,7 @@ Session *MDSRank::get_session(Message *m)
         imported_session->auth_caps = session->auth_caps;
         assert(session->get_nref() == 1);
         imported_session->connection->set_priv(imported_session->get());
+        imported_session->last_seen = session->last_seen;
         session = imported_session;
       }
     }
index 88a163df946fb891f5a83baf382acf2dcef999f1..3cb08b15e7157f2487d222653336b9df828cba27 100644 (file)
@@ -731,21 +731,40 @@ void Server::find_idle_sessions()
   //  (caps go stale, lease die)
   double queue_max_age = mds->get_dispatch_queue_max_age(ceph_clock_now());
   double cutoff = queue_max_age + mds->mdsmap->get_session_timeout();
-  while (1) {
-    Session *session = mds->sessionmap.get_oldest_session(Session::STATE_OPEN);
-    if (!session) break;
-    auto last_cap_renew_span = std::chrono::duration<double>(now-session->last_cap_renew).count();
-    if (last_cap_renew_span < cutoff) {
-      dout(20) << "laggiest active session is " << session->info.inst << " and renewed caps recently (" << last_cap_renew_span << "s ago)" << dendl;
-      break;
+
+  const auto sessions_p1 = mds->sessionmap.by_state.find(Session::STATE_OPEN);
+  if (sessions_p1 != mds->sessionmap.by_state.end() && !sessions_p1->second->empty()) {
+    std::vector<Session*> new_stale;
+
+    for (auto session : *(sessions_p1->second)) {
+      auto last_cap_renew_span = std::chrono::duration<double>(now - session->last_cap_renew).count();
+      if (last_cap_renew_span < cutoff) {
+       dout(20) << "laggiest active session is " << session->info.inst
+                << " and renewed caps recently (" << last_cap_renew_span << "s ago)" << dendl;
+       break;
+      }
+
+      if (session->last_seen > session->last_cap_renew) {
+       last_cap_renew_span = std::chrono::duration<double>(now - session->last_seen).count();
+       if (last_cap_renew_span < cutoff) {
+         dout(20) << "laggiest active session is " << session->info.inst
+                  << " and renewed caps recently (" << last_cap_renew_span << "s ago)" << dendl;
+         continue;
+       }
+      }
+
+      dout(10) << "new stale session " << session->info.inst
+              << " last renewed caps " << last_cap_renew_span << "s ago" << dendl;
+      new_stale.push_back(session);
     }
 
-    dout(10) << "new stale session " << session->info.inst << " last renewed caps " << last_cap_renew_span << "s ago" << dendl;
-    mds->sessionmap.set_state(session, Session::STATE_STALE);
-    mds->locker->revoke_stale_caps(session);
-    mds->locker->remove_stale_leases(session);
-    mds->send_message_client(new MClientSession(CEPH_SESSION_STALE, session->get_push_seq()), session);
-    finish_flush_session(session, session->get_push_seq());
+    for (auto session : new_stale) {
+      mds->sessionmap.set_state(session, Session::STATE_STALE);
+      mds->locker->revoke_stale_caps(session);
+      mds->locker->remove_stale_leases(session);
+      mds->send_message_client(new MClientSession(CEPH_SESSION_STALE, session->get_push_seq()), session);
+      finish_flush_session(session, session->get_push_seq());
+    }
   }
 
   // autoclose
@@ -765,11 +784,11 @@ void Server::find_idle_sessions()
 
   // Collect a list of sessions exceeding the autoclose threshold
   std::vector<Session *> to_evict;
-  const auto sessions_p = mds->sessionmap.by_state.find(Session::STATE_STALE);
-  if (sessions_p == mds->sessionmap.by_state.end() || sessions_p->second->empty()) {
+  const auto sessions_p2 = mds->sessionmap.by_state.find(Session::STATE_STALE);
+  if (sessions_p2 == mds->sessionmap.by_state.end() || sessions_p2->second->empty()) {
     return;
   }
-  const auto &stale_sessions = sessions_p->second;
+  const auto &stale_sessions = sessions_p2->second;
   assert(stale_sessions != nullptr);
 
   for (const auto &session: *stale_sessions) {
index 217b4ba1511ef78aa312086dc8ddb4e441f315af..eee382f4af7849033909b0610f5182c00fa91ef8 100644 (file)
@@ -246,6 +246,7 @@ public:
   xlist<Capability*> caps;     // inodes with caps; front=most recently used
   xlist<ClientLease*> leases;  // metadata leases to clients
   time last_cap_renew = time::min();
+  time last_seen = time::min();
 
 public:
   version_t inc_push_seq() { return ++cap_push_seq; }