]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use helpers for import_reverse
authorSage Weil <sage@newdream.net>
Thu, 14 Apr 2011 01:34:55 +0000 (18:34 -0700)
committerSage Weil <sage@newdream.net>
Fri, 15 Apr 2011 23:32:55 +0000 (16:32 -0700)
Use helpers for common code shared between handle_export_cancel and
handle_mds_failure_or_stop.

Also include handling for IMPORT_PREPPING state, even though we don't use
it yet.

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

index cf714d549a144ec404892f5047041715fee595fe..c9209b239c38e7db0a1496eb240a928ea5f1395f 100644 (file)
@@ -236,7 +236,6 @@ void Migrator::handle_mds_failure_or_stop(int who)
        dout(10) << "export state=warning : unpinning bounds, unfreezing, notifying" << dendl;
        // fall-thru
 
-       //case EXPORT_LOGGINGSTART:
       case EXPORT_PREPPING:
        if (p->second != EXPORT_WARNING) 
          dout(10) << "export state=loggingstart|prepping : unpinning bounds, unfreezing" << dendl;
@@ -346,30 +345,19 @@ void Migrator::handle_mds_failure_or_stop(int who)
       switch (q->second) {
       case IMPORT_DISCOVERING:
        dout(10) << "import state=discovering : clearing state" << dendl;
-       import_state.erase(df);
-       import_peer.erase(df);
+       import_reverse_discovering(df);
        break;
 
       case IMPORT_DISCOVERED:
        dout(10) << "import state=discovered : unpinning inode " << *diri << dendl;
        assert(diri);
-       // unpin base
-       diri->put(CInode::PIN_IMPORTING);
-       import_state.erase(df);
-       import_peer.erase(df);
+       import_reverse_discovered(df, diri);
        break;
 
       case IMPORT_PREPPING:
-       if (q->second == IMPORT_PREPPING) {
-         dout(10) << "import state=prepping : unpinning base+bounds " << *dir << dendl;
-       }
+       dout(10) << "import state=prepping : unpinning base+bounds " << *dir << dendl;
        assert(dir);
-       {
-         set<CDir*> bounds;
-         cache->map_dirfrag_set(import_bound_ls[dir], bounds);
-         import_remove_pins(dir, bounds);
-         import_reverse_final(dir);
-       }
+       import_reverse_prepping(dir);
        break;
 
       case IMPORT_PREPPED:
@@ -1567,22 +1555,46 @@ void Migrator::handle_export_discover(MExportDirDiscover *m)
   assert (g_conf.mds_kill_import_at != 2);  
 }
 
+void Migrator::import_reverse_discovering(dirfrag_t df)
+{
+  import_state.erase(df);
+  import_peer.erase(df);
+}
+
+void Migrator::import_reverse_discovered(dirfrag_t df, CInode *diri)
+{
+  // unpin base
+  diri->put(CInode::PIN_IMPORTING);
+  import_state.erase(df);
+  import_peer.erase(df);
+}
+
+void Migrator::import_reverse_prepping(CDir *dir)
+{
+  set<CDir*> bounds;
+  cache->map_dirfrag_set(import_bound_ls[dir], bounds);
+  import_remove_pins(dir, bounds);
+  import_reverse_final(dir);
+}
+
 /* This function DOES put the passed message before returning*/
 void Migrator::handle_export_cancel(MExportDirCancel *m)
 {
   dout(7) << "handle_export_cancel on " << m->get_dirfrag() << dendl;
-
-  if (import_state[m->get_dirfrag()] == IMPORT_DISCOVERED) {
-    CInode *in = cache->get_inode(m->get_dirfrag().ino);
+  dirfrag_t df = m->get_dirfrag();
+  if (import_state[df] == IMPORT_DISCOVERING) {
+    import_reverse_discovering(df);
+  } else if (import_state[df] == IMPORT_DISCOVERED) {
+    CInode *in = cache->get_inode(df.ino);
     assert(in);
-    in->put(CInode::PIN_IMPORTING);
+    import_reverse_discovered(df, in);
+  } else if (import_state[df] == IMPORT_PREPPING) {
+    CDir *dir = mds->mdcache->get_dirfrag(df);
+    assert(dir);
+    import_reverse_prepping(dir);
   } else {
-    assert(import_state[m->get_dirfrag()] == IMPORT_DISCOVERING);
+    assert(0 == "got export_cancel in weird state");
   }
-
-  import_state.erase(m->get_dirfrag());
-  import_peer.erase(m->get_dirfrag());
-
   m->put();
 }
 
index e7816339c6947dbb51d6638c78f52bcd4f24ce59..cd712ae3e749c43f958e85fdf5ef101d9870d214 100644 (file)
@@ -253,6 +253,9 @@ public:
 public:
   void import_reverse(CDir *dir);
 protected:
+  void import_reverse_discovering(dirfrag_t df);
+  void import_reverse_discovered(dirfrag_t df, CInode *diri);
+  void import_reverse_prepping(CDir *dir);
   void import_remove_pins(CDir *dir, set<CDir*>& bounds);
   void import_reverse_unfreeze(CDir *dir);
   void import_reverse_final(CDir *dir);