]> git-server-git.apps.pok.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:45:00 +0000 (16:45 +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 9ef53b14f5002869f33ddcd5f1548b30c6eed792..882b894eaaee23fd732d2680327e57a52df81b64 100644 (file)
@@ -965,9 +965,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().get());
+    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;
 }
@@ -1308,6 +1313,7 @@ Session *MDSRank::get_session(Message *m)
           session->preopen_out_queue.pop_front();
         }
         imported_session->auth_caps = session->auth_caps;
+        imported_session->last_seen = session->last_seen;
         assert(session->get_nref() == 1);
         imported_session->connection->set_priv(imported_session->get());
         session = imported_session;
index 161f29026184c57acb8d2e1fa2e4f413a3d85df8..e61c70c5252803880cb6b5869bb2c979cd5d40ed 100644 (file)
@@ -780,21 +780,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
@@ -814,11 +833,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_p->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 55fee82dd25518dc2c12b00d8f3d1b859b88192c..850432b948c00711cb2d4a11134583324dbbb7c9 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; }