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
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
bd->state_clear(CDir::STATE_EXPORTBOUND);
}
+ // notify bystanders
+ export_notify_abort(dir, bounds);
+
// process delayed expires
cache->process_delayed_expire(dir);
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);