From: Yan, Zheng Date: Fri, 5 Dec 2014 07:05:53 +0000 (+0800) Subject: mds: drop dentry leases in deleted directory X-Git-Tag: v0.91~52^2~18^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5da15ee965825731e4b9912669293849d4ec63e8;p=ceph.git mds: drop dentry leases in deleted directory 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 --- diff --git a/src/mds/CDentry.cc b/src/mds/CDentry.cc index ca87a21940a6..ebd0ed233399 100644 --- a/src/mds/CDentry.cc +++ b/src/mds/CDentry.cc @@ -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)) { diff --git a/src/mds/CDentry.h b/src/mds/CDentry.h index 309643964173..61542cf5be08 100644 --- a/src/mds/CDentry.h +++ b/src/mds/CDentry.h @@ -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); diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 5234f710da8c..b96b8ea8922b 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -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); }