}
}
+// Hard-code instead of surfacing a config settings because this is
+// really a hack that should go away at some point when we have better
+// inspection tools for getting at detailed cap state (#7316)
+#define MAX_WARN_CAPS 100
void Locker::caps_tick()
{
dout(20) << __func__ << " " << revoking_caps.size() << " revoking caps" << dendl;
+ int i = 0;
for (xlist<Capability*>::iterator p = revoking_caps.begin(); !p.end(); ++p) {
Capability *cap = *p;
if (age <= g_conf->mds_revoke_cap_timeout) {
dout(20) << __func__ << " age below timeout " << g_conf->mds_revoke_cap_timeout << dendl;
break;
+ } else {
+ ++i;
+ if (i > MAX_WARN_CAPS) {
+ dout(1) << __func__ << " more than " << MAX_WARN_CAPS << " caps are late"
+ << "revoking, ignoring subsequent caps" << dendl;
+ break;
+ }
}
// exponential backoff of warning intervals
if (age > g_conf->mds_revoke_cap_timeout * (1 << cap->get_num_revoke_warnings())) {