From: Yan, Zheng Date: Sun, 23 Mar 2014 12:07:35 +0000 (+0800) Subject: mds: don't trim ambiguous import dirfrags X-Git-Tag: v0.79~52^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a1f5c645bbf0e2828d6b167bad2bbb93d17c3c54;p=ceph.git mds: don't trim ambiguous import dirfrags Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 7bee6eaab52b..ad3564da2b2a 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -6705,8 +6705,7 @@ bool MDCache::trim_non_auth_subtree(CDir *dir) { dout(10) << "trim_non_auth_subtree(" << dir << ") " << *dir << dendl; - if (uncommitted_slave_rename_olddir.count(dir->inode) || // preserve the dir for rollback - my_ambiguous_imports.count(dir->dirfrag())) + if (!can_trim_non_auth_dirfrag(dir)) return true; bool keep_dir = false; @@ -6726,9 +6725,8 @@ bool MDCache::trim_non_auth_subtree(CDir *dir) for (list::iterator subdir = subdirs.begin(); subdir != subdirs.end(); ++subdir) { - if (uncommitted_slave_rename_olddir.count((*subdir)->inode) || // preserve the dir for rollback - my_ambiguous_imports.count((*subdir)->dirfrag()) || - (*subdir)->is_subtree_root()) { + if ((*subdir)->is_subtree_root() || + !can_trim_non_auth_dirfrag(*subdir)) { keep_inode = true; dout(10) << "trim_non_auth_subtree(" << dir << ") subdir " << *subdir << "is kept!" << dendl; } @@ -6783,7 +6781,8 @@ void MDCache::try_trim_non_auth_subtree(CDir *dir) for (set::iterator p = bounds.begin(); p != bounds.end(); ++p) { CDir *bd = *p; if (bd->get_dir_auth().first != mds->whoami && // we are not auth - bd->get_num_any() == 0) { // and empty + bd->get_num_any() == 0 && // and empty + can_trim_non_auth_dirfrag(bd)) { CInode *bi = bd->get_inode(); dout(10) << " closing empty non-auth child subtree " << *bd << dendl; remove_subtree(bd); diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index d6b81795604c..7b46bd9e3ef4 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -581,6 +581,10 @@ public: void trim_non_auth(); // trim out trimmable non-auth items bool trim_non_auth_subtree(CDir *directory); void try_trim_non_auth_subtree(CDir *dir); + bool can_trim_non_auth_dirfrag(CDir *dir) { + return my_ambiguous_imports.count((dir)->dirfrag()) == 0 && + uncommitted_slave_rename_olddir.count(dir->inode) == 0; + } void trim_client_leases(); void check_memory_usage();