From 98af31d10f362c05ea8ed57495973b08599431e7 Mon Sep 17 00:00:00 2001 From: Rishabh Dave Date: Wed, 17 Oct 2018 12:42:43 +0000 Subject: [PATCH] mds: don't mark unresponsive sessions holding no caps stale 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 --- src/mds/Locker.cc | 8 ++++++++ src/mds/Locker.h | 1 + src/mds/Server.cc | 15 +++++++++++++++ src/mds/SessionMap.h | 6 ++++++ 4 files changed, 30 insertions(+) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 31d941de892..2d5bfb88501 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 7ed6e7a1dc6..dd8494816de 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -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: diff --git a/src/mds/Server.cc b/src/mds/Server.cc index d4392d1b604..b23dbd89bfd 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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); diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index abcaab679d0..0dfbc51b5ac 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -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; -- 2.39.5