From db29ec83a54c2b7ba5a3ceb86b2041470910c2f8 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 30 Sep 2019 14:20:18 +0800 Subject: [PATCH] mds: include linkage type in dentry lease Signed-off-by: "Yan, Zheng" --- src/include/ceph_fs.h | 1 + src/mds/Locker.cc | 21 +++++++++++++-------- src/mds/Locker.h | 2 +- src/mds/Server.cc | 25 ++++++++++++++++--------- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index a05ea4756d8..47094e1cc0e 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -694,6 +694,7 @@ struct ceph_mds_reply_lease { } __attribute__ ((packed)); #define CEPH_LEASE_VALID (1 | 2) /* old and new bit values */ +#define CEPH_LEASE_PRIMARY_LINK 4 /* primary linkage */ struct ceph_mds_reply_dirfrag { __le32 frag; /* fragment */ diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index a8d59552836..70de4793bd5 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -4113,24 +4113,28 @@ void Locker::handle_client_lease(const cref_t &m) } -void Locker::issue_client_lease(CDentry *dn, client_t client, - bufferlist &bl, utime_t now, Session *session) +void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, + utime_t now, bufferlist &bl) { + client_t client = mdr->get_client(); + Session *session = mdr->session; + CInode *diri = dn->get_dir()->get_inode(); - if (!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)) == 0)) && - dn->lock.can_lease(client)) { - int pool = 1; // fixme.. do something smart! + if (mdr->snapid == CEPH_NOSNAP && + dn->lock.can_lease(client) && + !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))) { // issue a dentry lease ClientLease *l = dn->add_client_lease(client, session); session->touch_lease(l); + int pool = 1; // fixme.. do something smart! now += mdcache->client_lease_durations[pool]; mdcache->touch_client_lease(l, pool, now); LeaseStat lstat; - lstat.mask = CEPH_LEASE_VALID; + lstat.mask = CEPH_LEASE_VALID | mask; lstat.duration_ms = (uint32_t)(1000 * mdcache->client_lease_durations[pool]); lstat.seq = ++l->seq; encode_lease(bl, session->info, lstat); @@ -4139,6 +4143,7 @@ void Locker::issue_client_lease(CDentry *dn, client_t client, } else { // null lease LeaseStat lstat; + lstat.mask = mask; 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 97dc68ede7f..f0963fd49e3 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, client_t client, bufferlist &bl, utime_t now, Session *session); + void issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask, 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 2a4e4f03231..8a1454371cc 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2130,7 +2130,6 @@ void Server::set_trace_dist(const ref_t &reply, bufferlist bl; mds_rank_t whoami = mds->get_nodeid(); Session *session = mdr->session; - client_t client = mdr->get_client(); snapid_t snapid = mdr->snapid; utime_t now = ceph_clock_now(); @@ -2170,13 +2169,19 @@ void Server::set_trace_dist(const ref_t &reply, dout(20) << "set_trace_dist added dir " << *dir << dendl; encode(dn->get_name(), bl); - if (snapid == CEPH_NOSNAP) - mds->locker->issue_client_lease(dn, client, bl, now, session); - else { - //null lease - LeaseStat e; - mds->locker->encode_lease(bl, session->info, e); + + 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; } else reply->head.is_dentry = 0; @@ -4547,7 +4552,8 @@ void Server::handle_client_readdir(MDRequestRef& mdr) // dentry dout(12) << "including dn " << *dn << dendl; encode(dn->get_name(), dnbl); - mds->locker->issue_client_lease(dn, client, dnbl, now, mdr->session); + int lease_mask = dnl->is_primary() ? CEPH_LEASE_PRIMARY_LINK : 0; + mds->locker->issue_client_lease(dn, mdr, lease_mask, now, dnbl); // inode dout(12) << "including inode " << *in << dendl; @@ -6287,7 +6293,8 @@ void Server::_link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targ dn->push_projected_linkage(); } - journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_remote_finish(this, mdr, inc, dn, targeti)); + journal_and_reply(mdr, (inc ? targeti : nullptr), dn, le, + new C_MDS_link_remote_finish(this, mdr, inc, dn, targeti)); } void Server::_link_remote_finish(MDRequestRef& mdr, bool inc, -- 2.39.5