From a85bf8c96094c82489003bb6f6e18504322bf5ff Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 2 May 2014 05:22:35 +0800 Subject: [PATCH] mds: remove mdsdir in the final step of shutdown MDS Otherwise we may get bad subtree map if we restart the MDS before the shutdown process finishes. Signed-off-by: Yan, Zheng --- src/mds/MDCache.cc | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index be32002e98460..c10d52a3980f0 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7306,17 +7306,12 @@ bool MDCache::shutdown_pass() return false; } - // make mydir subtree go away - if (myin) { - CDir *mydir = myin->get_dirfrag(frag_t()); - if (mydir && mydir->is_subtree_root()) { - adjust_subtree_auth(mydir, CDIR_AUTH_UNKNOWN); - remove_subtree(mydir); - } - } - + CDir *mydir = myin ? myin->get_dirfrag(frag_t()) : NULL; + if (mydir && !mydir->is_subtree_root()) + mydir = NULL; + // subtrees map not empty yet? - if (!subtrees.empty()) { + if (subtrees.size() > (mydir ? 1 : 0)) { dout(7) << "still have " << num_subtrees() << " subtrees" << dendl; show_subtrees(); migrator->show_importing(); @@ -7325,10 +7320,16 @@ bool MDCache::shutdown_pass() show_cache(); return false; } - assert(subtrees.empty()); assert(!migrator->is_exporting()); assert(!migrator->is_importing()); + // make mydir subtree go away + if (mydir) { + adjust_subtree_auth(mydir, CDIR_AUTH_UNKNOWN); + remove_subtree(mydir); + } + assert(subtrees.empty()); + // (only do this once!) if (!mds->mdlog->is_capped()) { dout(7) << "capping the log" << dendl; -- 2.39.5