From: Xiubo Li Date: Thu, 2 Mar 2023 13:58:56 +0000 (+0800) Subject: mds: move confirm_receipt() to Capability.cc X-Git-Tag: v16.2.15~147^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9964db08355f79842d1e3704c1e6e0e4e146f132;p=ceph.git mds: move confirm_receipt() to Capability.cc Will add the debug logs later in confirm_receipt(). Fixes: https://tracker.ceph.com/issues/57244 Signed-off-by: Xiubo Li (cherry picked from commit f9aa17c90ee01b0f6df56af3fa76a80870ecf38a) --- diff --git a/src/mds/Capability.cc b/src/mds/Capability.cc index b6258e466df38..5103b240e529d 100644 --- a/src/mds/Capability.cc +++ b/src/mds/Capability.cc @@ -176,6 +176,35 @@ client_t Capability::get_client() const return session ? session->get_client() : client_t(-1); } +int Capability::confirm_receipt(ceph_seq_t seq, unsigned caps) { + int was_revoking = (_issued & ~_pending); + if (seq == last_sent) { + _revokes.clear(); + _issued = caps; + // don't add bits + _pending &= caps; + } else { + // can i forget any revocations? + while (!_revokes.empty() && _revokes.front().seq < seq) + _revokes.pop_front(); + if (!_revokes.empty()) { + if (_revokes.front().seq == seq) + _revokes.begin()->before = caps; + calc_issued(); + } else { + // seq < last_sent + _issued = caps | _pending; + } + } + + if (was_revoking && _issued == _pending) { + item_revoking_caps.remove_myself(); + item_client_revoking_caps.remove_myself(); + maybe_clear_notable(); + } + return was_revoking & ~_issued; // return revoked +} + bool Capability::is_stale() const { return session ? session->is_stale() : false; diff --git a/src/mds/Capability.h b/src/mds/Capability.h index f7119f002e138..3fd6d2ce6d4f0 100644 --- a/src/mds/Capability.h +++ b/src/mds/Capability.h @@ -182,34 +182,7 @@ public: inc_last_seq(); return last_sent; } - int confirm_receipt(ceph_seq_t seq, unsigned caps) { - int was_revoking = (_issued & ~_pending); - if (seq == last_sent) { - _revokes.clear(); - _issued = caps; - // don't add bits - _pending &= caps; - } else { - // can i forget any revocations? - while (!_revokes.empty() && _revokes.front().seq < seq) - _revokes.pop_front(); - if (!_revokes.empty()) { - if (_revokes.front().seq == seq) - _revokes.begin()->before = caps; - calc_issued(); - } else { - // seq < last_sent - _issued = caps | _pending; - } - } - - if (was_revoking && _issued == _pending) { - item_revoking_caps.remove_myself(); - item_client_revoking_caps.remove_myself(); - maybe_clear_notable(); - } - return was_revoking & ~_issued; // return revoked - } + int confirm_receipt(ceph_seq_t seq, unsigned caps); // we may get a release racing with revocations, which means our revokes will be ignored // by the client. clean them out of our _revokes history so we don't wait on them. void clean_revoke_from(ceph_seq_t li) {