From 034e6bd16c50ed33cfb6fa6150428ca181a81077 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 21 Jul 2016 15:52:06 +0800 Subject: [PATCH] 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 --- src/client/Client.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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) { -- 2.47.3