From a028c8954ca240ec9a12682678aaee02eb507ae3 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Mon, 11 Apr 2011 16:57:50 -0700 Subject: [PATCH] mds: don't run all of try_subtree_merge on a rename across MDSes. Previously we'd try and do the whole thing, which meant that the replica got a lock twiddle before it had finished the export. That broke things spectacularly, since we weren't respecting our invariants about who gets remote locking messages. Now we pass through a flag and respect our invariants. Signed-off-by: Greg Farnum Signed-off-by: Sage Weil --- src/mds/MDCache.cc | 8 ++++---- src/mds/MDCache.h | 5 +++-- src/mds/Server.cc | 7 ++++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 51b4b483feb1f..5609a809c6741 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -787,12 +787,11 @@ public: } }; -void MDCache::try_subtree_merge_at(CDir *dir) +void MDCache::try_subtree_merge_at(CDir *dir, bool do_eval) { dout(10) << "try_subtree_merge_at " << *dir << dendl; assert(subtrees.count(dir)); - bool do_eval = true; if (mds->is_any_replay() || mds->is_resolve()) do_eval = false; @@ -1210,7 +1209,8 @@ void MDCache::verify_subtree_bounds(CDir *dir, const list& bounds) assert(failed == 0); } -void MDCache::adjust_subtree_after_rename(CInode *diri, CDir *olddir) +void MDCache::adjust_subtree_after_rename(CInode *diri, CDir *olddir, + bool imported) { dout(10) << "adjust_subtree_after_rename " << *diri << " from " << *olddir << dendl; @@ -1274,7 +1274,7 @@ void MDCache::adjust_subtree_after_rename(CInode *diri, CDir *olddir) // un-force dir to subtree root if (dir->dir_auth == pair(dir->dir_auth.first, dir->dir_auth.first)) { adjust_subtree_auth(dir, dir->dir_auth.first); - try_subtree_merge_at(dir); + try_subtree_merge_at(dir, !imported); } } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 6e974912d6c7a..4a0f28370642f 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -548,7 +548,7 @@ public: } void map_dirfrag_set(list& dfs, set& result); void try_subtree_merge(CDir *root); - void try_subtree_merge_at(CDir *root); + void try_subtree_merge_at(CDir *root, bool do_eval=true); void subtree_merge_writebehind_finish(CInode *in, Mutation *mut); void eval_subtree_root(CInode *diri); CDir *get_subtree_root(CDir *dir); @@ -563,7 +563,8 @@ public: void verify_subtree_bounds(CDir *root, const set& bounds); void verify_subtree_bounds(CDir *root, const list& bounds); - void adjust_subtree_after_rename(CInode *diri, CDir *olddir); + void adjust_subtree_after_rename(CInode *diri, CDir *olddir, + bool imported = false); void get_auth_subtrees(set& s); void get_fullauth_subtrees(set& s); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 4d871065d0ecc..16ecd11bf3df9 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5273,6 +5273,8 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen CInode *oldin = destdnl->get_inode(); + bool imported_inode = false; + // primary+remote link merge? bool linkmerge = (srcdnl->get_inode() == destdnl->get_inode() && (srcdnl->is_primary() || destdnl->is_primary())); @@ -5348,6 +5350,7 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen // hack: fix auth bit destdnl->get_inode()->state_set(CInode::STATE_AUTH); + imported_inode = true; } if (destdn->is_auth()) { @@ -5375,7 +5378,9 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen // update subtree map? if (destdnl->is_primary() && destdnl->get_inode()->is_dir()) - mdcache->adjust_subtree_after_rename(destdnl->get_inode(), srcdn->get_dir()); + mdcache->adjust_subtree_after_rename(destdnl->get_inode(), + srcdn->get_dir(), + imported_inode); // removing a new dn? if (srcdn->is_auth()) -- 2.39.5