if (rootdir)
adjust_subtree_auth(rootdir, CDIR_AUTH_UNKNOWN);
}
+ resolve_gather = recovery_set;
+ resolve_gather.erase(mds->get_nodeid());
+ rejoin_gather = resolve_gather;
}
void MDCache::send_resolves()
{
- // reset resolve state
- got_resolve.clear();
- other_ambiguous_imports.clear();
-
send_slave_resolves();
if (!resolve_ack_gather.empty()) {
dout(10) << "send_resolves still waiting for resolve ack from ("
- << need_resolve_ack << ")" << dendl;
+ << resolve_ack_gather << ")" << dendl;
return;
}
if (!need_resolve_rollback.empty()) {
++p) {
dout(10) << "sending slave resolve to mds." << p->first << dendl;
mds->send_message_mds(p->second, p->first);
- need_resolve_ack.insert(p->first);
+ resolve_ack_gather.insert(p->first);
}
}
recovery_set.erase(mds->get_nodeid());
dout(1) << "handle_mds_failure mds." << who << " : recovery peers are " << recovery_set << dendl;
- // adjust my recovery lists
- wants_resolve.erase(who); // MDS will ask again
- got_resolve.erase(who); // i'll get another.
+ resolve_gather.insert(who);
discard_delayed_resolve(who);
+ rejoin_gather.insert(who);
rejoin_sent.erase(who); // i need to send another
rejoin_ack_gather.erase(who); // i'll need/get another.
- dout(10) << " wants_resolve " << wants_resolve << dendl;
- dout(10) << " got_resolve " << got_resolve << dendl;
+ dout(10) << " resolve_gather " << resolve_gather << dendl;
+ dout(10) << " resolve_ack_gather " << resolve_ack_gather << dendl;
dout(10) << " rejoin_sent " << rejoin_sent << dendl;
dout(10) << " rejoin_gather " << rejoin_gather << dendl;
dout(10) << " rejoin_ack_gather " << rejoin_ack_gather << dendl;
return;
}
- if (!need_resolve_ack.empty() || !need_resolve_rollback.empty()) {
+ if (!resolve_ack_gather.empty() || !need_resolve_rollback.empty()) {
dout(10) << "delay processing subtree resolve" << dendl;
discard_delayed_resolve(from);
delayed_resolve[from] = m;
}
// did i get them all?
- got_resolve.insert(from);
+ resolve_gather.erase(from);
maybe_resolve_finish();
void MDCache::maybe_resolve_finish()
{
- assert(need_resolve_ack.empty());
+ assert(resolve_ack_gather.empty());
assert(need_resolve_rollback.empty());
- if (got_resolve != recovery_set) {
- dout(10) << "maybe_resolve_finish still waiting for more resolves, got ("
- << got_resolve << "), need (" << recovery_set << ")" << dendl;
+ if (!resolve_gather.empty()) {
+ dout(10) << "maybe_resolve_finish still waiting for resolves ("
+ << resolve_gather << ")" << dendl;
return;
} else {
dout(10) << "maybe_resolve_finish got all resolves+resolve_acks, done." << dendl;
dout(10) << "handle_resolve_ack " << *ack << " from " << ack->get_source() << dendl;
int from = ack->get_source().num();
- if (!need_resolve_ack.count(from)) {
+ if (!resolve_ack_gather.count(from)) {
ack->put();
return;
}
assert(p->second->slave_to_mds != from);
}
- need_resolve_ack.erase(from);
- if (need_resolve_ack.empty() && need_resolve_rollback.empty()) {
+ resolve_ack_gather.erase(from);
+ if (resolve_ack_gather.empty() && need_resolve_rollback.empty()) {
send_subtree_resolves();
process_delayed_resolve();
}
if (mds->is_resolve())
finish_uncommitted_slave_update(reqid, need_resolve_rollback[reqid]);
need_resolve_rollback.erase(reqid);
- if (need_resolve_ack.empty() && need_resolve_rollback.empty()) {
+ if (resolve_ack_gather.empty() && need_resolve_rollback.empty()) {
send_subtree_resolves();
process_delayed_resolve();
}
if (*p == mds->get_nodeid()) continue; // nothing to myself!
if (rejoin_sent.count(*p)) continue; // already sent a rejoin to this node!
if (mds->is_rejoin()) {
- rejoin_gather.insert(*p);
rejoins[*p] = new MMDSCacheRejoin(MMDSCacheRejoin::OP_WEAK);
rejoins[*p]->copy_cap_exports(cap_export_bl);
} else if (mds->mdsmap->is_rejoin(*p))