From: Sage Weil Date: Tue, 2 Mar 2010 00:34:17 +0000 (-0800) Subject: mds: put forced open sessions in OPENING then OPEN X-Git-Tag: v0.20~378 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d0974d1b97b70b181cffa76c46a363955b45e467;p=ceph.git mds: put forced open sessions in OPENING then OPEN We use OPENING state to indicate sessions that are being imported. Fix get_or_add_open_session() to NOT set the session state (except to STATE_NEW if new) so that the caller can do the right thing. Otherwise, the prepare_force_open_sessions() can't tell if it just forced open a session (and needs it to be OPENING) or if it was already open. Subsequently cap migrations weren't working if the client didn't already have a session open. There is still a bug: if the import aborts, we have an OPENING session with no actual open client_session message queued. Maybe we should have a different state instead of OPENING... IMPORTING? --- diff --git a/src/TODO b/src/TODO index e7c9c01ceda3..07ea429dec0a 100644 --- a/src/TODO +++ b/src/TODO @@ -60,6 +60,8 @@ filestore - need an osdmap cache layer? bugs +- mds prepare_force_open_sessions, then import aborts.. session is still OPENING but no client_session is sent... +- multimds: untar kernel, control-z, sync - wget mismatch with multiple mds? - rm -r failure (on kernel tree) - dbench 1, restart mds (may take a few times), dbench will error out. diff --git a/src/mds/Server.cc b/src/mds/Server.cc index e59caae859b7..71f8ee880707 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -313,8 +313,9 @@ version_t Server::prepare_force_open_sessions(map& cm) << " on " << cm.size() << " clients" << dendl; for (map::iterator p = cm.begin(); p != cm.end(); ++p) { - Session *session = mds->sessionmap.get_or_add_open_session(p->second); - if (session->is_closed() || session->is_closing()) + Session *session = mds->sessionmap.get_or_add_session(p->second); + if (session->is_new() || + session->is_closed() || session->is_closing()) mds->sessionmap.set_state(session, Session::STATE_OPENING); mds->sessionmap.touch_session(session); } diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index 3bc79ed581bd..c24a57adcb2a 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -181,7 +181,9 @@ void SessionMap::decode(bufferlist::iterator& p) while (!p.end()) { entity_inst_t inst; ::decode(inst.name, p); - Session *s = get_or_add_open_session(inst); + Session *s = get_or_add_session(inst); + if (s->is_new()) + set_state(s, Session::STATE_OPEN); s->decode(p); } diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index b3bb32da9f8c..376acd168b44 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -225,14 +225,13 @@ public: return session_map[w]; return 0; } - Session* get_or_add_open_session(entity_inst_t i) { + Session* get_or_add_session(entity_inst_t i) { Session *s; if (session_map.count(i.name)) s = session_map[i.name]; else s = session_map[i.name] = new Session; s->inst = i; - set_state(s, Session::STATE_OPEN); s->last_cap_renew = g_clock.now(); return s; } @@ -288,8 +287,10 @@ public: void open_sessions(map& client_map) { for (map::iterator p = client_map.begin(); p != client_map.end(); - ++p) - get_or_add_open_session(p->second); + ++p) { + Session *s = get_or_add_session(p->second); + set_state(s, Session::STATE_OPEN); + } version++; } diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 542e59790368..2cc571e1a303 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -709,7 +709,9 @@ void ESession::replay(MDS *mds) mds->sessionmap.projected = ++mds->sessionmap.version; assert(mds->sessionmap.version == cmapv); if (open) { - Session *session = mds->sessionmap.get_or_add_open_session(client_inst); + Session *session = mds->sessionmap.get_or_add_session(client_inst); + if (session->is_new()) + mds->sessionmap.set_state(session, Session::STATE_OPEN); dout(10) << "session " << session << " state " << session->get_state() << dendl; } else { Session *session = mds->sessionmap.get_session(client_inst.name);