// CLIENT_CAPS messages.
{
std::list<client_t> 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<MDSHealthMetric> late_cap_metrics;
for (std::list<client_t>::iterator i = late_clients.begin(); i != late_clients.end(); ++i) {
* Return true if any currently revoking caps exceed the
* session_timeout threshold.
*/
-bool Locker::any_late_revoking_caps(xlist<Capability*> const &revoking) const
+bool Locker::any_late_revoking_caps(xlist<Capability*> const &revoking,
+ double timeout) const
{
xlist<Capability*>::const_iterator p = revoking.begin();
if (p.end()) {
} 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;
}
}
-
-void Locker::get_late_revoking_clients(std::list<client_t> *result) const
+void Locker::get_late_revoking_clients(std::list<client_t> *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<client_t, xlist<Capability*> >::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<Capability*> 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);
}
}
}
void remove_client_cap(CInode *in, client_t client);
- void get_late_revoking_clients(std::list<client_t> *result) const;
- bool any_late_revoking_caps(xlist<Capability*> const &revoking) const;
+ void get_late_revoking_clients(std::list<client_t> *result, double timeout) const;
+
+private:
+ bool any_late_revoking_caps(xlist<Capability*> const &revoking, double timeout) const;
protected:
bool _need_flush_mdlog(CInode *in, int wanted_caps);