]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add asok command to kick sessions that were remote reset
authorYan, Zheng <zheng.z.yan@intel.com>
Fri, 11 Apr 2014 07:03:37 +0000 (15:03 +0800)
committerSage Weil <sage@inktank.com>
Wed, 7 May 2014 21:27:48 +0000 (14:27 -0700)
Fixes: #8021
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
(cherry picked from commit 09a1bc5a4601d356b9cc69be8541e6515d763861)

src/client/Client.cc
src/client/Client.h
src/client/MetaSession.cc
src/client/MetaSession.h

index 03b6438b2174c45dc09ce09da91896edda5daec2..47d1c1d4620b4225fb5334753ef9c4ecc9957338 100644 (file)
@@ -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<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
@@ -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:
index 4a3d7535167a805707182bfb1e9fb6de2da06adb..e31e90af98ccf2db73b8961d587a9b5be60f696f 100644 (file)
@@ -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);
index ee38db36d97aab69fb7971cfdabea6241e3430b1..9f2a136bd55f39e9a184650a1827ee99f623f4c6 100644 (file)
@@ -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";
   }
 }
index d9fcbb881d92682d1f2acd3ab393c7031f87cb6a..5525f077bec3fb26d5423b75ad4a5efa7bc402b5 100644 (file)
@@ -33,6 +33,7 @@ struct MetaSession {
     STATE_OPEN,
     STATE_CLOSING,
     STATE_CLOSED,
+    STATE_STALE,
   } state;
 
   list<Context*> waiting_for_open;