{
dout(7) << "handle_mds_recovery mds." << who << dendl;
+ // exclude all discover waiters. kick_discovers() will do the job
+ static const uint64_t i_mask = CInode::WAIT_ANY_MASK & ~CInode::WAIT_DIR;
+ static const uint64_t d_mask = CDir::WAIT_ANY_MASK & ~CDir::WAIT_DENTRY;
+
list<Context*> waiters;
// wake up any waiters in their subtrees
while (!q.empty()) {
CDir *d = q.front();
q.pop_front();
- d->take_waiting(CDir::WAIT_ANY_MASK, waiters);
+ d->take_waiting(d_mask, waiters);
// inode waiters too
for (CDir::map_t::iterator p = d->items.begin();
CDentry *dn = p->second;
CDentry::linkage_t *dnl = dn->get_linkage();
if (dnl->is_primary()) {
- dnl->get_inode()->take_waiting(CInode::WAIT_ANY_MASK, waiters);
+ dnl->get_inode()->take_waiting(i_mask, waiters);
// recurse?
list<CDir*> ls;
{
for (map<tid_t,discover_info_t>::iterator p = discovers.begin();
p != discovers.end();
- ++p)
+ ++p) {
+ if (p->second.mds != who)
+ continue;
_send_discover(p->second);
+ }
}
if (g_conf->mds_dump_cache_after_rejoin &&
oldmap->is_rejoining() && !mdsmap->is_rejoining())
mdcache->dump_cache(); // for DEBUG only
-
- // ACTIVE|CLIENTREPLAY|REJOIN => we can discover from them.
- set<int> olddis, dis;
- oldmap->get_mds_set(olddis, MDSMap::STATE_ACTIVE);
- oldmap->get_mds_set(olddis, MDSMap::STATE_CLIENTREPLAY);
- oldmap->get_mds_set(olddis, MDSMap::STATE_REJOIN);
- mdsmap->get_mds_set(dis, MDSMap::STATE_ACTIVE);
- mdsmap->get_mds_set(dis, MDSMap::STATE_CLIENTREPLAY);
- mdsmap->get_mds_set(dis, MDSMap::STATE_REJOIN);
- for (set<int>::iterator p = dis.begin(); p != dis.end(); ++p)
- if (*p != whoami && // not me
- olddis.count(*p) == 0) { // newly so?
- mdcache->kick_discovers(*p);
- mdcache->kick_open_ino_peers(*p);
- }
+
+ if (oldstate >= MDSMap::STATE_REJOIN) {
+ // ACTIVE|CLIENTREPLAY|REJOIN => we can discover from them.
+ set<int> olddis, dis;
+ oldmap->get_mds_set(olddis, MDSMap::STATE_ACTIVE);
+ oldmap->get_mds_set(olddis, MDSMap::STATE_CLIENTREPLAY);
+ oldmap->get_mds_set(olddis, MDSMap::STATE_REJOIN);
+ mdsmap->get_mds_set(dis, MDSMap::STATE_ACTIVE);
+ mdsmap->get_mds_set(dis, MDSMap::STATE_CLIENTREPLAY);
+ mdsmap->get_mds_set(dis, MDSMap::STATE_REJOIN);
+ for (set<int>::iterator p = dis.begin(); p != dis.end(); ++p)
+ if (*p != whoami && // not me
+ olddis.count(*p) == 0) { // newly so?
+ mdcache->kick_discovers(*p);
+ mdcache->kick_open_ino_peers(*p);
+ }
+ }
}
if (oldmap->is_degraded() && !mdsmap->is_degraded() && state >= MDSMap::STATE_ACTIVE)
dout(1) << "cluster recovered." << dendl;
// did someone go active?
- if (is_clientreplay() || is_active() || is_stopping()) {
+ if (oldstate >= MDSMap::STATE_CLIENTREPLAY &&
+ (is_clientreplay() || is_active() || is_stopping())) {
set<int> oldactive, active;
oldmap->get_mds_set(oldactive, MDSMap::STATE_ACTIVE);
oldmap->get_mds_set(oldactive, MDSMap::STATE_CLIENTREPLAY);