From b107e5bc4fa8ef618f74c5fb9e1a0388ec8f2b69 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 23 Mar 2010 10:26:54 -0700 Subject: [PATCH] mds: combine new, closed states; few small fixes Still need to audit all state changes. --- src/mds/MDS.cc | 14 +++++++++----- src/mds/Server.cc | 24 ++++++++++++------------ src/mds/SessionMap.cc | 2 +- src/mds/SessionMap.h | 26 +++++++++++++++++++------- src/mds/journal.cc | 4 ++-- 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 584609bb5e8e0..fcacc4a589352 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -1559,12 +1559,15 @@ bool MDS::ms_handle_reset(Connection *con) objecter->ms_handle_reset(con); } else if (con->get_peer_type() == CEPH_ENTITY_TYPE_CLIENT) { Session *session = (Session *)con->get_priv(); - if (!session || session->is_closed() || session->is_new()) - messenger->mark_down(con->get_peer_addr()); - if (session->is_new()) - sessionmap.remove_session(session); - if (session) + if (session) { + if (session->is_closed()) { + messenger->mark_down(con->get_peer_addr()); + sessionmap.remove_session(session); + } session->put(); + } else { + messenger->mark_down(con->get_peer_addr()); + } } return false; } @@ -1597,6 +1600,7 @@ bool MDS::ms_verify_authorizer(Connection *con, int peer_type, authorizer_data, authorizer_reply, name, global_id, caps_info); if (is_valid) { + // wire up a Session* to this connection, and add it to the session map entity_name_t n(con->get_peer_type(), global_id); Session *s = sessionmap.get_session(n); if (!s) { diff --git a/src/mds/Server.cc b/src/mds/Server.cc index d74bf4b04b421..5ca61a610911a 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -193,8 +193,6 @@ void Server::handle_client_session(MClientSession *m) dout(10) << "already open|opening, dropping this req" << dendl; return; } - if (session->is_closed()) - mds->sessionmap.add_session(session); sseq = mds->sessionmap.set_state(session, Session::STATE_OPENING); mds->sessionmap.touch_session(session); pv = ++mds->sessionmap.projected; @@ -295,13 +293,16 @@ void Server::_session_logged(Session *session, __u64 state_seq, bool open, versi assert(mds->inotable->get_version() == piv); } - if (session->is_closing()) + if (session->is_closing()) { + // reset session mds->messenger->send_message(new MClientSession(CEPH_SESSION_CLOSE), session->inst); - else if (session->is_stale_closing()) - mds->messenger->mark_down(session->inst.addr); // kill connection - mds->sessionmap.set_state(session, Session::STATE_CLOSED); - session->clear(); - mds->sessionmap.remove_session(session); + mds->sessionmap.set_state(session, Session::STATE_CLOSED); + session->clear(); + } else if (session->is_stale_closing()) { + // destroy session, close connection + mds->messenger->mark_down(session->inst.addr); + mds->sessionmap.remove_session(session); + } } else { assert(0); } @@ -316,8 +317,7 @@ version_t Server::prepare_force_open_sessions(map& cm) << dendl; for (map::iterator p = cm.begin(); p != cm.end(); ++p) { Session *session = mds->sessionmap.get_or_add_session(p->second); - if (session->is_new() || - session->is_closed() || session->is_closing()) + if (session->is_closed() || session->is_closing()) mds->sessionmap.set_state(session, Session::STATE_OPENING); mds->sessionmap.touch_session(session); } @@ -535,8 +535,8 @@ void Server::handle_client_reconnect(MClientReconnect *m) // notify client of success with an OPEN mds->messenger->send_message(new MClientSession(CEPH_SESSION_OPEN), m->get_source_inst()); - if (session->is_new()) { - dout(10) << " session is new, will make best effort to reconnect " + if (session->is_closed()) { + dout(10) << " session is closed, will make best effort to reconnect " << m->get_source_inst() << dendl; mds->sessionmap.set_state(session, Session::STATE_OPENING); version_t pv = ++mds->sessionmap.projected; diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index c24a57adcb2af..3bfda75954b4e 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -182,7 +182,7 @@ void SessionMap::decode(bufferlist::iterator& p) entity_inst_t inst; ::decode(inst.name, p); Session *s = get_or_add_session(inst); - if (s->is_new()) + if (s->is_closed()) set_state(s, Session::STATE_OPEN); s->decode(p); } diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index eca1a0e752fd2..a959e6d2a4a9e 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -34,6 +34,7 @@ class MDRequest; #include "Capability.h" #include "msg/Message.h" + /* * session */ @@ -41,25 +42,37 @@ class MDRequest; class Session : public RefCountedObject { // -- state etc -- public: - static const int STATE_NEW = 0; + /* + + closed <---------------------+ + | | + v | + opening <---+ | + | | | + v | | + open --> closing ------------+ + |^ + v| + stale -> stale_purging --> stale_closing --> + + */ + static const int STATE_CLOSED = 0; static const int STATE_OPENING = 1; // journaling open static const int STATE_OPEN = 2; static const int STATE_CLOSING = 3; // journaling close static const int STATE_STALE = 4; static const int STATE_STALE_PURGING = 5; static const int STATE_STALE_CLOSING = 6; - static const int STATE_CLOSED = 7; const char *get_state_name(int s) { switch (s) { - case STATE_NEW: return "new"; + case STATE_CLOSED: return "closed"; case STATE_OPENING: return "opening"; case STATE_OPEN: return "open"; case STATE_CLOSING: return "closing"; case STATE_STALE: return "stale"; case STATE_STALE_PURGING: return "stale_purging"; case STATE_STALE_CLOSING: return "stale_closing"; - case STATE_CLOSED: return "closed"; default: return "???"; } } @@ -108,14 +121,13 @@ public: int get_state() { return state; } const char *get_state_name() { return get_state_name(state); } __u64 get_state_seq() { return state_seq; } - bool is_new() { return state == STATE_NEW; } + bool is_closed() { return state == STATE_CLOSED; } bool is_opening() { return state == STATE_OPENING; } bool is_open() { return state == STATE_OPEN; } bool is_closing() { return state == STATE_CLOSING; } bool is_stale() { return state == STATE_STALE; } bool is_stale_purging() { return state == STATE_STALE_PURGING; } bool is_stale_closing() { return state == STATE_STALE_CLOSING; } - bool is_closed() { return state == STATE_CLOSED; } // -- caps -- private: @@ -156,7 +168,7 @@ public: Session() : - state(STATE_NEW), state_seq(0), + state(STATE_CLOSED), state_seq(0), item_session_list(this), requests(0), // member_offset passed to front() manually cap_push_seq(0) { } diff --git a/src/mds/journal.cc b/src/mds/journal.cc index ba16fd44c37fb..9c2bb4c7adb27 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -709,12 +709,12 @@ void ESession::replay(MDS *mds) assert(mds->sessionmap.version == cmapv); if (open) { Session *session = mds->sessionmap.get_or_add_session(client_inst); - if (session->is_new()) + if (session->is_closed()) 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); - if (session) + if (session->is_closed()) mds->sessionmap.remove_session(session); } } -- 2.39.5