]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: drop dentry leases in deleted directory
authorYan, Zheng <zyan@redhat.com>
Fri, 5 Dec 2014 07:05:53 +0000 (15:05 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 5 Dec 2014 07:18:17 +0000 (15:18 +0800)
we will never link dentry in deleted directory to inode, so it's
OK to remove client leases prematurely. This optimization allows
us to purge deleted directory inode earlier.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CDentry.cc
src/mds/CDentry.h
src/mds/CDir.cc

index ca87a21940a62c8d4019aac32d9c5df8eaeb7af7..ebd0ed2333995502c5f0095bc286ca3fad13d81a 100644 (file)
@@ -542,6 +542,12 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
     locker->eval_gather(&lock);
 }
 
+void CDentry::remove_client_leases(Locker *locker)
+{
+  while (!client_lease_map.empty())
+    remove_client_lease(client_lease_map.begin()->second, locker);
+}
+
 void CDentry::_put()
 {
   if (get_num_ref() <= ((int)is_dirty() + 1)) {
index 30964396417301ae555736ff8583aca220640bbe..61542cf5be08f4f4d639332342a5b8599bfec568 100644 (file)
@@ -32,7 +32,7 @@
 
 class CInode;
 class CDir;
-
+class Locker;
 class Message;
 class CDentry;
 class LogSegment;
@@ -383,8 +383,8 @@ public:
   }
 
   ClientLease *add_client_lease(client_t c, Session *session);
-  void remove_client_lease(ClientLease *r, class Locker *locker);  // returns remaining mask (if any), and kicks locker eval_gathers
-  
+  void remove_client_lease(ClientLease *r, Locker *locker);  // returns remaining mask (if any), and kicks locker eval_gathers
+  void remove_client_leases(Locker *locker);
 
   
   ostream& print_db_line_prefix(ostream& out);
index 5234f710da8c9b5d7d46a98e8781183b7a1e9e4b..b96b8ea8922b4ed33848aa07e77c84de4c4fb5ef 100644 (file)
@@ -685,6 +685,10 @@ void CDir::try_remove_dentries_for_stray()
       continue; // shouldn't happen
     if (dn->is_dirty())
       dn->mark_clean();
+    // It's OK to remove lease prematurely because we will never link
+    // the dentry to inode again.
+    if (dn->is_any_leases())
+      dn->remove_client_leases(cache->mds->locker);
     if (dn->get_num_ref() == 0)
       remove_dentry(dn);
   }