From a01fba175b646f67446b8cac4a20c3fbb306043b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Mar 2011 14:39:04 -0700 Subject: [PATCH] mds: set dir_auth between EImport{Start,Finish} This ensures that try_trim_non_auth_subtree() doesn't throw out a subtree we're in the midst of importing (during journal replay). Signed-off-by: Sage Weil --- src/mds/MDCache.cc | 2 +- src/mds/MDCache.h | 4 ++++ src/mds/journal.cc | 12 +++++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 7a16fa06c7eae..bc1a1a6519963 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -2814,7 +2814,7 @@ void MDCache::disambiguate_imports() void MDCache::add_ambiguous_import(dirfrag_t base, vector& bounds) { assert(my_ambiguous_imports.count(base) == 0); - my_ambiguous_imports[base].swap( bounds ); + my_ambiguous_imports[base].swap(bounds); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 49ac938322330..48010792d691e 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -696,6 +696,10 @@ public: bool have_ambiguous_import(dirfrag_t base) { return my_ambiguous_imports.count(base); } + void get_ambiguous_import_bounds(dirfrag_t base, vector& bounds) { + assert(my_ambiguous_imports.count(base)); + bounds = my_ambiguous_imports[base]; + } void cancel_ambiguous_import(dirfrag_t dirino); void finish_ambiguous_import(dirfrag_t dirino); void resolve_start(); diff --git a/src/mds/journal.cc b/src/mds/journal.cc index f2acbf27caf73..116daa69be9b2 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -1084,6 +1084,10 @@ void EImportStart::replay(MDS *mds) // put in ambiguous import list mds->mdcache->add_ambiguous_import(base, bounds); + // set auth partially to us so we don't trim it + CDir *dir = mds->mdcache->get_dirfrag(base); + mds->mdcache->adjust_bounded_subtree_auth(dir, bounds, pair(mds->get_nodeid(), mds->get_nodeid())); + // open client sessions? if (mds->sessionmap.version >= cmapv) { dout(10) << "EImportStart.replay sessionmap " << mds->sessionmap.version @@ -1110,8 +1114,14 @@ void EImportFinish::replay(MDS *mds) dout(10) << "EImportFinish.replay " << base << " success=" << success << dendl; if (success) mds->mdcache->finish_ambiguous_import(base); - else + else { + CDir *dir = mds->mdcache->get_dirfrag(base); + vector bounds; + mds->mdcache->get_ambiguous_import_bounds(base, bounds); + mds->mdcache->adjust_bounded_subtree_auth(dir, bounds, pair(CDIR_AUTH_UNKNOWN, CDIR_AUTH_UNKNOWN)); mds->mdcache->cancel_ambiguous_import(base); + mds->mdcache->try_trim_non_auth_subtree(dir); + } } else { dout(10) << "EImportFinish.replay " << base << " success=" << success << ", predates my subtree_map start point, ignoring" -- 2.39.5