++p) {
if (*p == mds->whoami)
continue;
- resolves[*p] = new MMDSResolve;
+ if (mds->is_resolve() || mds->mdsmap->is_resolve(*p))
+ resolves[*p] = new MMDSResolve;
}
// known
migrator->import_reverse(dir);
} else {
dout(7) << "ambiguous import succeeded on " << *dir << dendl;
- migrator->import_finish(dir);
+ migrator->import_finish(dir, true);
}
my_ambiguous_imports.erase(p); // no longer ambiguous.
}
++p) {
CDir *dir = p->first;
assert(dir->is_subtree_root());
- assert(!dir->is_ambiguous_dir_auth());
+ if (dir->is_ambiguous_dir_auth()) {
+ // exporter is recovering, importer is survivor.
+ assert(rejoins.count(dir->authority().first));
+ assert(!rejoins.count(dir->authority().second));
+ continue;
+ }
// my subtree?
if (dir->is_auth())
}
}
+void Migrator::import_notify_finish(CDir *dir, set<CDir*>& bounds)
+{
+ dout(7) << "import_notify_finish " << *dir << dendl;
+
+ for (set<int>::iterator p = import_bystanders[dir].begin();
+ p != import_bystanders[dir].end();
+ ++p) {
+ MExportDirNotify *notify =
+ new MExportDirNotify(dir->dirfrag(), false,
+ pair<int,int>(import_peer[dir->dirfrag()], mds->get_nodeid()),
+ 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);
+ }
+}
+
void Migrator::import_notify_abort(CDir *dir, set<CDir*>& bounds)
{
dout(7) << "import_notify_abort " << *dir << dendl;
CDir *dir = cache->get_dirfrag(m->get_dirfrag());
assert(dir);
dout(7) << "handle_export_finish on " << *dir << dendl;
- import_finish(dir);
+ import_finish(dir, false);
m->put();
}
-void Migrator::import_finish(CDir *dir)
+void Migrator::import_finish(CDir *dir, bool notify)
{
dout(7) << "import_finish on " << *dir << dendl;
// remove pins
set<CDir*> bounds;
cache->get_subtree_bounds(dir, bounds);
+
+ if (notify)
+ import_notify_finish(dir, bounds);
+
import_remove_pins(dir, bounds);
map<CInode*, map<client_t,Capability::Export> > cap_imports;
void import_reverse_unfreeze(CDir *dir);
void import_reverse_final(CDir *dir);
void import_notify_abort(CDir *dir, set<CDir*>& bounds);
+ void import_notify_finish(CDir *dir, set<CDir*>& bounds);
void import_logged_start(dirfrag_t df, CDir *dir, int from,
map<client_t,entity_inst_t> &imported_client_map,
map<client_t,uint64_t>& sseqmap);
void handle_export_finish(MExportDirFinish *m);
public:
- void import_finish(CDir *dir);
+ void import_finish(CDir *dir, bool notify);
protected:
void handle_export_caps(MExportCaps *m);