From: Yan, Zheng Date: Mon, 19 Nov 2018 09:08:30 +0000 (+0800) Subject: mds: renew client session when receiving any message X-Git-Tag: v13.2.5~22^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=444e89e5aa74ca0747ed38e092e144efcaeb84fb;p=ceph.git mds: renew client session when receiving any message Signed-off-by: "Yan, Zheng" (cherry picked from commit 593dfee07334668a912abd9732a5d138eb27058a) Conflicts: src/mds/MDSRank.cc src/mds/Server.cc src/mds/SessionMap.h --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 9ef53b14f50..882b894eaae 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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(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; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 161f2902618..e61c70c5252 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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(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 new_stale; + + for (auto session : *(sessions_p1->second)) { + auto last_cap_renew_span = std::chrono::duration(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(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 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) { diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index 55fee82dd25..850432b948c 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -246,6 +246,7 @@ public: xlist caps; // inodes with caps; front=most recently used xlist 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; }