if (rootdir)
adjust_subtree_auth(rootdir, CDIR_AUTH_UNKNOWN);
}
+}
+
+void MDCache::send_resolves()
+{
+ // reset resolve state
+ got_resolve.clear();
+ other_ambiguous_imports.clear();
for (set<int>::iterator p = recovery_set.begin(); p != recovery_set.end(); ++p) {
- if (*p == mds->whoami)
+ int who = *p;
+ if (who == mds->whoami)
continue;
- send_resolve(*p); // now.
+ if (migrator->is_importing() ||
+ migrator->is_exporting())
+ send_resolve_later(who);
+ else
+ send_resolve_now(who);
}
}
-void MDCache::send_resolve(int who)
-{
- if (migrator->is_importing() ||
- migrator->is_exporting())
- send_resolve_later(who);
- else
- send_resolve_now(who);
-}
-
void MDCache::send_resolve_later(int who)
{
dout(10) << "send_resolve_later to mds" << who << dendl;
}
// update my dir_auth values
+ // need to do this on recoverying nodes _and_ bystanders (to resolve ambiguous
+ // migrations between other nodes)
for (map<dirfrag_t, vector<dirfrag_t> >::iterator pi = m->subtrees.begin();
pi != m->subtrees.end();
++pi) {
<< diri->dirfragtree
<< " on " << pi->first << dendl;
}
-
+
CDir *dir = diri->get_dirfrag(pi->first.frag);
if (!dir) continue;
-
+
adjust_bounded_subtree_auth(dir, pi->second, from);
try_subtree_merge(dir);
}
show_subtrees();
-
// note ambiguous imports too
for (map<dirfrag_t, vector<dirfrag_t> >::iterator pi = m->ambiguous_imports.begin();
pi != m->ambiguous_imports.end();
void cancel_ambiguous_import(dirfrag_t dirino);
void finish_ambiguous_import(dirfrag_t dirino);
void resolve_start();
- void send_resolve(int who);
+ void send_resolves();
void send_resolve_now(int who);
void send_resolve_later(int who);
void maybe_send_pending_resolves();
oldmap->get_mds_set(oldresolve, MDSMap::STATE_RESOLVE);
mdsmap->get_mds_set(resolve, MDSMap::STATE_RESOLVE);
if (oldresolve != resolve) {
- dout(10) << "resolve set is " << resolve << ", was " << oldresolve << dendl;
- for (set<int>::iterator p = resolve.begin(); p != resolve.end(); ++p)
- if (*p != whoami &&
- oldresolve.count(*p) == 0)
- mdcache->send_resolve(*p); // now or later.
+ dout(10) << " resolve set is " << resolve << ", was " << oldresolve << dendl;
+ calc_recovery_set();
+ mdcache->send_resolves();
}
}
}
-void MDS::replay_start()
+void MDS::calc_recovery_set()
{
- dout(1) << "replay_start" << dendl;
-
// initialize gather sets
set<int> rs;
mdsmap->get_recovery_mds_set(rs);
rs.erase(whoami);
- dout(1) << "now replay. my recovery peers are " << rs
- << ". need osdmap epoch " << mdsmap->get_last_failure_osd_epoch()
+ mdcache->set_recovery_set(rs);
+
+ dout(1) << " recovery set is " << rs << dendl;
+}
+
+
+void MDS::replay_start()
+{
+ dout(1) << "replay_start" << dendl;
+
+ calc_recovery_set();
+
+ dout(1) << " need osdmap epoch " << mdsmap->get_last_failure_osd_epoch()
<<", have " << osdmap->get_epoch()
<< dendl;
- mdcache->set_recovery_set(rs);
// start?
if (osdmap->get_epoch() >= mdsmap->get_last_failure_osd_epoch()) {
void boot_create(); // i am new mds.
void boot_start(int step=0, int r=0); // starting|replay
+ void calc_recovery_set();
+
void replay_start();
void creating_done();
void starting_done();
// send notify's etc.
dout(7) << "sending ack for " << *dir << " to old auth mds" << from << dendl;
+
+ // test surviving observer of a failed migration that did not complete
+ //assert(dir->replica_map.size() < 2 || mds->whoami != 0);
+
mds->send_message_mds(new MExportDirAck(dir->dirfrag()), from);
assert (g_conf.mds_kill_import_at != 8);