mirror of
https://github.com/ceph/ceph
synced 2025-02-24 11:37:37 +00:00
Merge pull request #46210 from vshankar/wip-54701
mds: do not assert early on when issuing client leases Reviewed-by: Patrick Donnelly <pdonnell@redhat.com> Reviewed-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Greg Farnum <gfarnum@redhat.com>
This commit is contained in:
commit
971567e903
@ -4252,8 +4252,8 @@ void Locker::handle_client_lease(const cref_t<MClientLease> &m)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask,
|
void Locker::issue_client_lease(CDentry *dn, CInode *in, MDRequestRef &mdr, utime_t now,
|
||||||
utime_t now, bufferlist &bl)
|
bufferlist &bl)
|
||||||
{
|
{
|
||||||
client_t client = mdr->get_client();
|
client_t client = mdr->get_client();
|
||||||
Session *session = mdr->session;
|
Session *session = mdr->session;
|
||||||
@ -4264,6 +4264,17 @@ void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask,
|
|||||||
!diri->is_stray() && // do not issue dn leases in stray dir!
|
!diri->is_stray() && // do not issue dn leases in stray dir!
|
||||||
!diri->filelock.can_lease(client) &&
|
!diri->filelock.can_lease(client) &&
|
||||||
!(diri->get_client_cap_pending(client) & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL))) {
|
!(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
|
// issue a dentry lease
|
||||||
ClientLease *l = dn->add_client_lease(client, session);
|
ClientLease *l = dn->add_client_lease(client, session);
|
||||||
session->touch_lease(l);
|
session->touch_lease(l);
|
||||||
@ -4283,7 +4294,7 @@ void Locker::issue_client_lease(CDentry *dn, MDRequestRef &mdr, int mask,
|
|||||||
} else {
|
} else {
|
||||||
// null lease
|
// null lease
|
||||||
LeaseStat lstat;
|
LeaseStat lstat;
|
||||||
lstat.mask = mask;
|
lstat.mask = 0;
|
||||||
lstat.alternate_name = std::string(dn->alternate_name);
|
lstat.alternate_name = std::string(dn->alternate_name);
|
||||||
encode_lease(bl, session->info, lstat);
|
encode_lease(bl, session->info, lstat);
|
||||||
dout(20) << "issue_client_lease no/null lease on " << *dn << dendl;
|
dout(20) << "issue_client_lease no/null lease on " << *dn << dendl;
|
||||||
|
@ -187,7 +187,7 @@ public:
|
|||||||
// -- client leases --
|
// -- client leases --
|
||||||
void handle_client_lease(const cref_t<MClientLease> &m);
|
void handle_client_lease(const cref_t<MClientLease> &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);
|
void revoke_client_leases(SimpleLock *lock);
|
||||||
static void encode_lease(bufferlist& bl, const session_info_t& info, const LeaseStat& ls);
|
static void encode_lease(bufferlist& bl, const session_info_t& info, const LeaseStat& ls);
|
||||||
|
|
||||||
|
@ -2332,20 +2332,7 @@ void Server::set_trace_dist(const ref_t<MClientReply> &reply,
|
|||||||
dout(20) << "set_trace_dist added dir " << *dir << dendl;
|
dout(20) << "set_trace_dist added dir " << *dir << dendl;
|
||||||
|
|
||||||
encode(dn->get_name(), bl);
|
encode(dn->get_name(), bl);
|
||||||
|
mds->locker->issue_client_lease(dn, in, mdr, now, 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;
|
|
||||||
} else
|
} else
|
||||||
reply->head.is_dentry = 0;
|
reply->head.is_dentry = 0;
|
||||||
|
|
||||||
@ -4781,8 +4768,7 @@ void Server::handle_client_readdir(MDRequestRef& mdr)
|
|||||||
// dentry
|
// dentry
|
||||||
dout(12) << "including dn " << *dn << dendl;
|
dout(12) << "including dn " << *dn << dendl;
|
||||||
encode(dn->get_name(), dnbl);
|
encode(dn->get_name(), dnbl);
|
||||||
int lease_mask = dnl->is_primary() ? CEPH_LEASE_PRIMARY_LINK : 0;
|
mds->locker->issue_client_lease(dn, in, mdr, now, dnbl);
|
||||||
mds->locker->issue_client_lease(dn, mdr, lease_mask, now, dnbl);
|
|
||||||
|
|
||||||
// inode
|
// inode
|
||||||
dout(12) << "including inode " << *in << dendl;
|
dout(12) << "including inode " << *in << dendl;
|
||||||
|
Loading…
Reference in New Issue
Block a user