From: Venky Shankar Date: Fri, 3 Aug 2018 11:11:09 +0000 (-0400) Subject: mds: pass timeout argument for fetching late clients X-Git-Tag: v14.0.1~486^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=005cf6c76f2d25ee88dd6ac9d0c67cfa88a9d58e;p=ceph.git mds: pass timeout argument for fetching late clients This would be required when fetching clients that have not responded to cap revoke by MDS for a configured timeout value. Additionally, make member functions private which are called from the Locker class itself. Signed-off-by: Venky Shankar --- diff --git a/src/mds/Beacon.cc b/src/mds/Beacon.cc index a7e0a9fc8fa7e..fd72603af32c2 100644 --- a/src/mds/Beacon.cc +++ b/src/mds/Beacon.cc @@ -351,7 +351,8 @@ void Beacon::notify_health(MDSRank const *mds) // CLIENT_CAPS messages. { std::list late_clients; - mds->locker->get_late_revoking_clients(&late_clients); + mds->locker->get_late_revoking_clients(&late_clients, + mds->mdsmap->get_session_timeout()); std::list late_cap_metrics; for (std::list::iterator i = late_clients.begin(); i != late_clients.end(); ++i) { diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 5c6e22c07f156..affb7ae2d1257 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3565,7 +3565,8 @@ void Locker::remove_client_cap(CInode *in, client_t client) * Return true if any currently revoking caps exceed the * session_timeout threshold. */ -bool Locker::any_late_revoking_caps(xlist const &revoking) const +bool Locker::any_late_revoking_caps(xlist const &revoking, + double timeout) const { xlist::const_iterator p = revoking.begin(); if (p.end()) { @@ -3574,7 +3575,7 @@ bool Locker::any_late_revoking_caps(xlist const &revoking) const } else { utime_t now = ceph_clock_now(); utime_t age = now - (*p)->get_last_revoke_stamp(); - if (age <= mds->mdsmap->get_session_timeout()) { + if (age <= timeout) { return false; } else { return true; @@ -3582,22 +3583,18 @@ bool Locker::any_late_revoking_caps(xlist const &revoking) const } } - -void Locker::get_late_revoking_clients(std::list *result) const +void Locker::get_late_revoking_clients(std::list *result, + double timeout) const { - if (!any_late_revoking_caps(revoking_caps)) { + if (!any_late_revoking_caps(revoking_caps, timeout)) { // Fast path: no misbehaving clients, execute in O(1) return; } // Slow path: execute in O(N_clients) - std::map >::const_iterator client_rc_iter; - for (client_rc_iter = revoking_caps_by_client.begin(); - client_rc_iter != revoking_caps_by_client.end(); ++client_rc_iter) { - xlist const &client_rc = client_rc_iter->second; - bool any_late = any_late_revoking_caps(client_rc); - if (any_late) { - result->push_back(client_rc_iter->first); + for (auto &p : revoking_caps_by_client) { + if (any_late_revoking_caps(p.second, timeout)) { + result->push_back(p.first); } } } diff --git a/src/mds/Locker.h b/src/mds/Locker.h index c5fb9d9f3c4b9..1678f5c010476 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -188,8 +188,10 @@ public: void remove_client_cap(CInode *in, client_t client); - void get_late_revoking_clients(std::list *result) const; - bool any_late_revoking_caps(xlist const &revoking) const; + void get_late_revoking_clients(std::list *result, double timeout) const; + +private: + bool any_late_revoking_caps(xlist const &revoking, double timeout) const; protected: bool _need_flush_mdlog(CInode *in, int wanted_caps);