Capability *cap = new Capability(this, ++mdcache->last_cap_id, client);
assert(client_caps.count(client) == 0);
client_caps[client] = cap;
- if (session)
- session->add_cap(cap);
+
+ session->add_cap(cap);
+ if (session->is_stale())
+ cap->mark_stale();
cap->client_follows = first-1;
return Export(cap_id, _wanted, issued(), pending(), client_follows, last_sent, mseq+1, last_issue_stamp);
}
void merge(Export& other, bool auth_cap) {
- // issued + pending
- int newpending = other.pending | pending();
- if (other.issued & ~newpending)
- issue(other.issued | newpending);
- else
- issue(newpending);
- last_issue_stamp = other.last_issue_stamp;
+ if (!is_stale()) {
+ // issued + pending
+ int newpending = other.pending | pending();
+ if (other.issued & ~newpending)
+ issue(other.issued | newpending);
+ else
+ issue(newpending);
+ last_issue_stamp = other.last_issue_stamp;
+ } else {
+ inc_last_seq();
+ }
client_follows = other.client_follows;
mseq = other.mseq;
}
void merge(int otherwanted, int otherissued) {
- // issued + pending
- int newpending = pending();
- if (otherissued & ~newpending)
- issue(otherissued | newpending);
- else
- issue(newpending);
+ if (!is_stale()) {
+ // issued + pending
+ int newpending = pending();
+ if (otherissued & ~newpending)
+ issue(otherissued | newpending);
+ else
+ issue(newpending);
+ } else {
+ inc_last_seq();
+ }
// wanted
_wanted = _wanted | otherwanted;
}
void revoke() {
- if (pending())
- issue(0);
- confirm_receipt(last_sent, 0);
+ if (pending() & ~CEPH_CAP_PIN)
+ issue(CEPH_CAP_PIN);
+ confirm_receipt(last_sent, CEPH_CAP_PIN);
}
// serializers
session->is_opening() ||
session->is_stale());
session->inc_importing();
- mds->sessionmap.touch_session(session);
+// mds->sessionmap.touch_session(session);
}
return pv;
}
++p) {
Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(p->v));
dout(1) << "reconnect gave up on " << session->info.inst << dendl;
+ kill_session(session);
failed_reconnects++;
}
client_reconnect_gather.clear();
}
Session* get_or_add_session(const entity_inst_t& i) {
Session *s;
- if (session_map.count(i.name))
+ if (session_map.count(i.name)) {
s = session_map[i.name];
- else
+ } else {
s = session_map[i.name] = new Session;
- s->info.inst = i;
- s->last_cap_renew = ceph_clock_now(g_ceph_context);
+ s->info.inst = i;
+ s->last_cap_renew = ceph_clock_now(g_ceph_context);
+ }
return s;
}
void add_session(Session *s) {