]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: record null dentry's lease
authorYan, Zheng <zyan@redhat.com>
Thu, 21 Jul 2016 07:52:06 +0000 (15:52 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 22 Jul 2016 02:24:41 +0000 (10:24 +0800)
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 <zyan@redhat.com>
src/client/Client.cc

index 0f0fb4a60313a03bf1e1262a73bca207da231e32..0145925f035f9f8e13aee7188faf38fb60d91158 100644 (file)
@@ -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) {