From 94b279ad082b094cda85069314b9ceb8bc9c6aa1 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Thu, 5 May 2022 05:24:01 -0400 Subject: [PATCH] mds: do not assert early on when issuing client leases Move the relevant ceph_assert()'s when the MDS is issuing leases to clients since clients may not be capable of reading projected linkages. Fixes: http://tracker.ceph.com/issues/54701 Signed-off-by: Venky Shankar (cherry picked from commit 907b1f41e5e08afea6ee1a91ecd6d05646727b09) --- src/mds/Locker.cc | 17 ++++++++++++++--- src/mds/Locker.h | 2 +- src/mds/Server.cc | 18 ++---------------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index e6b6e41c2a7a2..53d3094b006d0 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -4228,8 +4228,8 @@ void Locker::handle_client_lease(const cref_t &m) } -void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, - utime_t now, bufferlist &bl) +void Locker::issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now, + bufferlist &bl) { client_t client = mdr->get_client(); Session *session = mdr->session; @@ -4240,6 +4240,17 @@ void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, !diri->is_stray() && // do not issue dn leases in stray dir! !diri->filelock.can_lease(client) && !(diri->get_client_cap_pending(client) & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL))) { + int mask = 0; + CDentry::linkage_t *dnl = dn->get_linkage(client, mdr); + if (dnl->is_primary()) { + ceph_assert(dnl->get_inode() == in); + mask = CEPH_LEASE_PRIMARY_LINK; + } else { + if (dnl->is_remote()) + ceph_assert(dnl->get_remote_ino() == in->ino()); + else + ceph_assert(!in); + } // issue a dentry lease ClientLease *l = dn->add_client_lease(client, session); session->touch_lease(l); @@ -4259,7 +4270,7 @@ void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, } else { // null lease LeaseStat lstat; - lstat.mask = mask; + lstat.mask = 0; lstat.alternate_name = std::string(dn->alternate_name); encode_lease(bl, session->info, lstat); dout(20) << "issue_client_lease no/null lease on " << *dn << dendl; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 9cc0b80ef7b13..c8ddaccd6a6a8 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -185,7 +185,7 @@ public: // -- client leases -- void handle_client_lease(const cref_t &m); - void issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, utime_t now, bufferlist &bl); + void issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now, bufferlist &bl); void revoke_client_leases(SimpleLock *lock); static void encode_lease(bufferlist& bl, const session_info_t& info, const LeaseStat& ls); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 7edcdc5f8789c..5f74374a227ea 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2306,20 +2306,7 @@ void Server::set_trace_dist(const ref_t &reply, dout(20) << "set_trace_dist added dir " << *dir << dendl; encode(dn->get_name(), bl); - - int lease_mask = 0; - CDentry::linkage_t *dnl = dn->get_linkage(mdr->get_client(), mdr); - if (dnl->is_primary()) { - ceph_assert(dnl->get_inode() == in); - lease_mask = CEPH_LEASE_PRIMARY_LINK; - } else { - if (dnl->is_remote()) - ceph_assert(dnl->get_remote_ino() == in->ino()); - else - ceph_assert(!in); - } - mds->locker->issue_client_lease(dn, mdr, lease_mask, now, bl); - dout(20) << "set_trace_dist added dn " << snapid << " " << *dn << dendl; + mds->locker->issue_client_lease(dn, in, mdr, now, bl); } else reply->head.is_dentry = 0; @@ -4749,8 +4736,7 @@ void Server::handle_client_readdir(MDRequestRef& mdr) // dentry dout(12) << "including dn " << *dn << dendl; encode(dn->get_name(), dnbl); - int lease_mask = dnl->is_primary() ? CEPH_LEASE_PRIMARY_LINK : 0; - mds->locker->issue_client_lease(dn, mdr, lease_mask, now, dnbl); + mds->locker->issue_client_lease(dn, in, mdr, now, dnbl); // inode dout(12) << "including inode " << *in << dendl; -- 2.39.5