From: Sage Weil Date: Wed, 7 Nov 2012 12:40:55 +0000 (-0800) Subject: client: kick waiters for an mds session to open on mds recovery X-Git-Tag: v0.54~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ca8988020ece0cc0c1e48e3cbb2c53e436a74837;p=ceph.git client: kick waiters for an mds session to open on mds recovery We already kicked waiters for request, but we need to kick waiters on open too (e.g., a client trying to mount). Signed-off-by: Sage Weil --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 48dfc50b7c85..08841d129cfc 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1098,6 +1098,9 @@ int Client::make_request(MetaRequest *request, ldout(cct, 10) << "waiting for session to mds." << mds << " to open" << dendl; cond.Wait(client_lock); } + + if (mds_sessions.count(mds) == 0) + continue; } // send request. @@ -1632,6 +1635,20 @@ void Client::handle_mds_map(MMDSMap* m) ls.swap(waiting_for_mdsmap); signal_cond_list(ls); + map >::iterator p = waiting_for_session.begin(); + while (p != waiting_for_session.end()) { + int oldstate = oldmap->get_state(p->first); + int newstate = mdsmap->get_state(p->first); + if (newstate >= MDSMap::STATE_ACTIVE && + oldstate < MDSMap::STATE_ACTIVE) { + ldout(cct, 20) << "kick_opening_mds_session mds." << p->first << dendl; + signal_cond_list(p->second); + waiting_for_session.erase(p++); + } else { + p++; + } + } + delete oldmap; m->put();