]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: set dir_auth between EImport{Start,Finish}
authorSage Weil <sage@newdream.net>
Fri, 18 Mar 2011 21:39:04 +0000 (14:39 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Fri, 1 Apr 2011 21:34:32 +0000 (14:34 -0700)
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 <sage@newdream.net>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/journal.cc

index 7a16fa06c7eae5bf64c9016fb0fb47b91e6d9c47..bc1a1a6519963e50bc8a43952ca03242f645f384 100644 (file)
@@ -2814,7 +2814,7 @@ void MDCache::disambiguate_imports()
 void MDCache::add_ambiguous_import(dirfrag_t base, vector<dirfrag_t>& bounds) 
 {
   assert(my_ambiguous_imports.count(base) == 0);
-  my_ambiguous_imports[base].swap( bounds );
+  my_ambiguous_imports[base].swap(bounds);
 }
 
 
index 49ac938322330c773695a7305aac0c74aa5cf4a8..48010792d691e7e453c08359dd3aead9e1597b77 100644 (file)
@@ -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<dirfrag_t>& 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();
index f2acbf27caf731e19acfa044071ba640412e670a..116daa69be9b28f78b847eda078acc00a9f2258c 100644 (file)
@@ -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<int,int>(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<dirfrag_t> bounds;
+      mds->mdcache->get_ambiguous_import_bounds(base, bounds);
+      mds->mdcache->adjust_bounded_subtree_auth(dir, bounds, pair<int,int>(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"