]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: notify bystanders if export aborts
authorYan, Zheng <zheng.z.yan@intel.com>
Thu, 14 Mar 2013 03:57:16 +0000 (11:57 +0800)
committerGreg Farnum <greg@inktank.com>
Mon, 1 Apr 2013 16:26:24 +0000 (09:26 -0700)
So bystanders know the subtree is single auth earlier.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
src/mds/Migrator.cc
src/mds/Migrator.h

index 7706641bdbf0773dfebfc95bc531b3b3c4281349..bf64ed40f8309ecaffdb80b30cca0322c9f06527 100644 (file)
@@ -251,25 +251,28 @@ void Migrator::handle_mds_failure_or_stop(int who)
          mds->send_message_mds(new MExportDirCancel(dir->dirfrag()), export_peer[dir]);
        break;
 
-       // NOTE: state order reversal, warning comes after loggingstart+prepping
+       // NOTE: state order reversal, warning comes after prepping
       case EXPORT_WARNING:
        dout(10) << "export state=warning : unpinning bounds, unfreezing, notifying" << dendl;
        // fall-thru
 
       case EXPORT_PREPPING:
        if (p->second != EXPORT_WARNING) 
-         dout(10) << "export state=loggingstart|prepping : unpinning bounds, unfreezing" << dendl;
+         dout(10) << "export state=prepping : unpinning bounds, unfreezing" << dendl;
        {
          // unpin bounds
          set<CDir*> bounds;
          cache->get_subtree_bounds(dir, bounds);
-         for (set<CDir*>::iterator p = bounds.begin();
-              p != bounds.end();
-              ++p) {
-           CDir *bd = *p;
+         for (set<CDir*>::iterator q = bounds.begin();
+              q != bounds.end();
+              ++q) {
+           CDir *bd = *q;
            bd->put(CDir::PIN_EXPORTBOUND);
            bd->state_clear(CDir::STATE_EXPORTBOUND);
          }
+         // notify bystanders
+         if (p->second == EXPORT_WARNING)
+           export_notify_abort(dir, bounds);
        }
        dir->unfreeze_tree();
        export_state.erase(dir); // clean up
@@ -1307,9 +1310,21 @@ void Migrator::handle_export_ack(MExportDirAck *m)
   m->put();
 }
 
+void Migrator::export_notify_abort(CDir *dir, set<CDir*>& bounds)
+{
+  dout(7) << "export_notify_abort " << *dir << dendl;
 
-
-
+  for (set<int>::iterator p = export_notify_ack_waiting[dir].begin();
+       p != export_notify_ack_waiting[dir].end();
+       ++p) {
+    MExportDirNotify *notify = new MExportDirNotify(dir->dirfrag(), false,
+                                                   pair<int,int>(mds->get_nodeid(),export_peer[dir]),
+                                                   pair<int,int>(mds->get_nodeid(),CDIR_AUTH_UNKNOWN));
+    for (set<CDir*>::iterator i = bounds.begin(); i != bounds.end(); ++i)
+      notify->get_bounds().push_back((*i)->dirfrag());
+    mds->send_message_mds(notify, *p);
+  }
+}
 
 /*
  * this happens if hte dest failes after i send teh export data but before it is acked
@@ -1356,6 +1371,9 @@ void Migrator::export_reverse(CDir *dir)
     bd->state_clear(CDir::STATE_EXPORTBOUND);
   }
 
+  // notify bystanders
+  export_notify_abort(dir, bounds);
+
   // process delayed expires
   cache->process_delayed_expire(dir);
   
index 2889a74f49183ad5ce296f0fc77106d3a52b220a..f395bc1d2377e9d92a49973178949198a28c2a7b 100644 (file)
@@ -227,6 +227,7 @@ public:
   void export_go(CDir *dir);
   void export_go_synced(CDir *dir);
   void export_reverse(CDir *dir);
+  void export_notify_abort(CDir *dir, set<CDir*>& bounds);
   void handle_export_ack(MExportDirAck *m);
   void export_logged_finish(CDir *dir);
   void handle_export_notify_ack(MExportDirNotifyAck *m);