From: "Yan, Zheng" <zheng.z.yan@xxxxxxxxx> 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@xxxxxxxxx> --- src/mds/Capability.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mds/Capability.h b/src/mds/Capability.h index fdecb90..fb6b3dc 100644 --- a/src/mds/Capability.h +++ b/src/mds/Capability.h @@ -171,14 +171,16 @@ public: } 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(); -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html