From: Yan, Zheng Date: Thu, 21 Jul 2016 07:52:06 +0000 (+0800) Subject: client: record null dentry's lease X-Git-Tag: v11.0.1~136^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=034e6bd16c50ed33cfb6fa6150428ca181a81077;p=ceph.git client: record null dentry's lease Current code drops null dentry's lease silently. If the client later modifies the null dentry, lease release is not encoded in corresponding mds request. This cause mds to send an extra lease revoke. Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 0f0fb4a60313..0145925f035f 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -996,7 +996,7 @@ void Client::update_dentry_lease(Dentry *dn, LeaseStat *dlease, utime_t from, Me utime_t dttl = from; dttl += (float)dlease->duration_ms / 1000.0; - assert(dn && dn->inode); + assert(dn); if (dlease->mask & CEPH_LOCK_DN) { if (dttl > dn->lease_ttl) { @@ -1311,14 +1311,22 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session) insert_dentry_inode(dir, dname, &dlease, in, request->sent_stamp, session, (op == CEPH_MDS_OP_RENAME) ? request->old_dentry() : NULL); } else { + Dentry *dn = NULL; if (diri->dir && diri->dir->dentries.count(dname)) { - Dentry *dn = diri->dir->dentries[dname]; + dn = diri->dir->dentries[dname]; if (dn->inode) { diri->dir_ordered_count++; clear_dir_complete_and_ordered(diri, false); unlink(dn, true, true); // keep dir, dentry } } + if (dlease.duration_ms > 0) { + if (!dn) { + Dir *dir = diri->open_dir(); + dn = link(dir, dname, NULL, NULL); + } + update_dentry_lease(dn, &dlease, request->sent_stamp, session); + } } } else if (op == CEPH_MDS_OP_LOOKUPSNAP || op == CEPH_MDS_OP_MKSNAP) {