]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: try_trim_non_auth_subtree on any canceled import (including resolve)
authorSage Weil <sage@newdream.net>
Thu, 28 Apr 2011 20:44:55 +0000 (13:44 -0700)
committerSage Weil <sage@newdream.net>
Thu, 28 Apr 2011 20:44:55 +0000 (13:44 -0700)
We were trimming on journal replay of an import failure, but not on a
canceled ambiguous import during resolve.  Fix that by moving the call into
the helper (and passing a CDir* instead of a dirfrag_t).

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/journal.cc

index 600f513255cbd4e625829102d3944531a574e895..d77c00001717d2afaed5de5dff6562174c2fa885 100644 (file)
@@ -2820,7 +2820,7 @@ void MDCache::disambiguate_imports()
     
     if (dir->authority() != me_ambig) {
       dout(10) << "ambiguous import auth known, must not be me " << *dir << dendl;
-      cancel_ambiguous_import(q->first);
+      cancel_ambiguous_import(dir);
       mds->mdlog->start_submit_entry(new EImportFinish(dir, false));
     } else {
       dout(10) << "ambiguous import auth unclaimed, must be me " << *dir << dendl;
@@ -2872,13 +2872,17 @@ void MDCache::add_ambiguous_import(CDir *base, const set<CDir*>& bounds)
   add_ambiguous_import(base->dirfrag(), binos);
 }
 
-void MDCache::cancel_ambiguous_import(dirfrag_t df)
+void MDCache::cancel_ambiguous_import(CDir *dir)
 {
+  dirfrag_t df = dir->dirfrag();
   assert(my_ambiguous_imports.count(df));
   dout(10) << "cancel_ambiguous_import " << df
           << " bounds " << my_ambiguous_imports[df]
+          << " " << *dir
           << dendl;
   my_ambiguous_imports.erase(df);
+
+  try_trim_non_auth_subtree(dir);
 }
 
 void MDCache::finish_ambiguous_import(dirfrag_t df)
index 722b7331a9826672eac83a6e1f565d54af678e67..5ead930b8eb3d137ae2da1bddaa35a704d74a7ca 100644 (file)
@@ -706,7 +706,7 @@ public:
     assert(my_ambiguous_imports.count(base));
     bounds = my_ambiguous_imports[base];
   }
-  void cancel_ambiguous_import(dirfrag_t dirino);
+  void cancel_ambiguous_import(CDir *);
   void finish_ambiguous_import(dirfrag_t dirino);
   void resolve_start();
   void send_resolves();
index 524d1a41d8e31e703939aafe75fee2db4061733b..e2b737411c76a42fe7b1a63dfea362f18bfaba77 100644 (file)
@@ -1215,8 +1215,7 @@ void EImportFinish::replay(MDS *mds)
       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);
+      mds->mdcache->cancel_ambiguous_import(dir);
     }
   } else {
     dout(10) << "EImportFinish.replay " << base << " success=" << success