From: Yan, Zheng Date: Fri, 11 Apr 2014 07:03:37 +0000 (+0800) Subject: client: add asok command to kick sessions that were remote reset X-Git-Tag: v0.81~105^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=09a1bc5a4601d356b9cc69be8541e6515d763861;p=ceph.git client: add asok command to kick sessions that were remote reset Fixes: #8021 Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 03b6438b2174..47d1c1d4620b 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -120,6 +120,8 @@ bool Client::CommandHook::call(std::string command, cmdmap_t& cmdmap, m_client->dump_mds_sessions(f); else if (command == "dump_cache") m_client->dump_cache(f); + else if (command == "kick_stale_sessions") + m_client->_kick_stale_sessions(); else assert(0 == "bad command registered"); m_client->client_lock.Unlock(); @@ -404,6 +406,14 @@ int Client::init() lderr(cct) << "error registering admin socket command: " << cpp_strerror(-ret) << dendl; } + ret = admin_socket->register_command("kick_stale_sessions", + "kick_stale_sessions", + &m_command_hook, + "kick sessions that were remote reset"); + if (ret < 0) { + lderr(cct) << "error registering admin socket command: " + << cpp_strerror(-ret) << dendl; + } client_lock.Lock(); initialized = true; @@ -419,6 +429,7 @@ void Client::shutdown() admin_socket->unregister_command("mds_requests"); admin_socket->unregister_command("mds_sessions"); admin_socket->unregister_command("dump_cache"); + admin_socket->unregister_command("kick_stale_sessions"); if (ino_invalidate_cb) { ldout(cct, 10) << "shutdown stopping cache invalidator finisher" << dendl; @@ -1538,7 +1549,8 @@ bool Client::have_open_session(int mds) { return mds_sessions.count(mds) && - mds_sessions[mds]->state == MetaSession::STATE_OPEN; + (mds_sessions[mds]->state == MetaSession::STATE_OPEN || + mds_sessions[mds]->state == MetaSession::STATE_STALE); } MetaSession *Client::_get_mds_session(int mds, Connection *con) @@ -1649,6 +1661,19 @@ void Client::handle_client_session(MClientSession *m) m->put(); } +void Client::_kick_stale_sessions() +{ + ldout(cct, 1) << "kick_stale_sessions" << dendl; + + for (map::iterator p = mds_sessions.begin(); + p != mds_sessions.end(); ) { + MetaSession *s = p->second; + ++p; + if (s->state == MetaSession::STATE_STALE) + _closed_mds_session(s); + } +} + void Client::send_request(MetaRequest *request, MetaSession *session) { // make the request @@ -8960,6 +8985,10 @@ void Client::ms_handle_remote_reset(Connection *con) break; case MetaSession::STATE_OPEN: + ldout(cct, 1) << "reset from mds we were open; mark session as stale" << dendl; + s->state = MetaSession::STATE_STALE; + break; + case MetaSession::STATE_NEW: case MetaSession::STATE_CLOSED: default: diff --git a/src/client/Client.h b/src/client/Client.h index 4a3d7535167a..e31e90af98cc 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -250,6 +250,7 @@ public: MetaSession *_open_mds_session(int mds); void _close_mds_session(MetaSession *s); void _closed_mds_session(MetaSession *s); + void _kick_stale_sessions(); void handle_client_session(MClientSession *m); void send_reconnect(MetaSession *s); void resend_unsafe_requests(MetaSession *s); diff --git a/src/client/MetaSession.cc b/src/client/MetaSession.cc index ee38db36d97a..9f2a136bd55f 100644 --- a/src/client/MetaSession.cc +++ b/src/client/MetaSession.cc @@ -15,6 +15,7 @@ const char *MetaSession::get_state_name() const case STATE_OPEN: return "open"; case STATE_CLOSING: return "closing"; case STATE_CLOSED: return "closed"; + case STATE_STALE: return "stale"; default: return "unknown"; } } diff --git a/src/client/MetaSession.h b/src/client/MetaSession.h index d9fcbb881d92..5525f077bec3 100644 --- a/src/client/MetaSession.h +++ b/src/client/MetaSession.h @@ -33,6 +33,7 @@ struct MetaSession { STATE_OPEN, STATE_CLOSING, STATE_CLOSED, + STATE_STALE, } state; list waiting_for_open;