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();
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;
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;
{
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)
m->put();
}
+void Client::_kick_stale_sessions()
+{
+ ldout(cct, 1) << "kick_stale_sessions" << dendl;
+
+ for (map<int,MetaSession*>::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
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:
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);