From cd231e281fd7987e9a9ae54e5bfa84dcd8b93959 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 22 Nov 2018 15:02:36 +0800 Subject: [PATCH] client: skip updating 'wanted' caps if caps are already issued When reading cached inode that already has Fscr caps, this can avoid two cap messages (one updats 'wanted' caps, one clears 'wanted' caps). Signed-off-by: "Yan, Zheng" (cherry picked from commit d20b260ecf3f323c87ad1e6865f87e2381444546) Conflicts: src/client/Client.cc --- src/client/Client.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 324c468edefb..000ed48ca0d3 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3527,9 +3527,8 @@ void Client::check_caps(Inode *in, unsigned flags) if (!revoking && unmounting && (cap_used == 0)) goto ack; - if (wanted == cap->wanted && // mds knows what we want. - ((cap->issued & ~retain) == 0) &&// and we don't have anything we wouldn't like - !in->dirty_caps) // and we have no dirty caps + if ((cap->issued & ~retain) == 0 && // and we don't have anything we wouldn't like + !in->dirty_caps) // and we have no dirty caps continue; if (now < in->hold_caps_until) { @@ -5115,6 +5114,7 @@ void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, MClient const int old_caps = cap->issued; const int new_caps = m->get_caps(); + const bool was_stale = session->cap_gen > cap->gen; ldout(cct, 5) << "handle_cap_grant on in " << m->get_ino() << " mds." << mds << " seq " << m->get_seq() << " caps now " << ccap_string(new_caps) @@ -5188,8 +5188,17 @@ void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, MClient } bool check = false; - if (m->get_op() == CEPH_CAP_OP_IMPORT && m->get_wanted() != wanted) + if ((was_stale || m->get_op() == CEPH_CAP_OP_IMPORT) && + (wanted & ~(cap->wanted | new_caps))) { + // If mds is importing cap, prior cap messages that update 'wanted' + // may get dropped by mds (migrate seq mismatch). + // + // We don't send cap message to update 'wanted' if what we want are + // already issued. If mds revokes caps, cap message that releases caps + // also tells mds what we want. But if caps got revoked by mds forcedly + // (session stale). We may haven't told mds what we want. check = true; + } check_cap_issue(in, cap, new_caps); -- 2.47.3