There are several issues in the Capability::confirm_receipt()
1. when receiving a client caps message with 'seq == last_sent',
it doesn't mean we finish revoking caps. The client can send
caps message that only flushes dirty metadata.
2. When receiving a client caps message with 'seq == N', we should
forget pending revocations whose seq numbers are less than N.
This is because, when revoking caps, we create a revoke_info
structure and set its seq number to 'last_sent', then increase
the 'last_sent'.
3. When client actively releases caps (by request), the code only
works for the 'seq == last_sent' case. If there are pending
revocations, we should update them as if the release message
is received before we revoke the corresponding caps.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
}
void confirm_receipt(ceph_seq_t seq, unsigned caps) {
if (seq == last_sent) {
- _pending = caps;
_revokes.clear();
_issued = caps;
+ // don't add bits
+ _pending &= caps;
} else {
// can i forget any revocations?
- while (!_revokes.empty() &&
- _revokes.front().seq <= seq)
+ while (!_revokes.empty() && _revokes.front().seq < seq)
_revokes.pop_front();
+ if (!_revokes.empty() && _revokes.front().seq == seq)
+ _revokes.begin()->before = caps;
_calc_issued();
}
//check_rdcaps_list();