]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: ignore 'session evict' when mds is replaying log 12153/head
authorYan, Zheng <zyan@redhat.com>
Mon, 7 Nov 2016 14:21:17 +0000 (22:21 +0800)
committerLoic Dachary <ldachary@redhat.com>
Wed, 23 Nov 2016 07:57:20 +0000 (08:57 +0100)
Fixes: http://tracker.ceph.com/issues/17801
Signed-off-by: Yan, Zheng <zyan@redhat.com>
(cherry picked from commit 315c6a23e466e703c4ca013358c53288cca0e81f)

src/mds/MDSDaemon.cc
src/mds/MDSRank.cc
src/mds/MDSRank.h

index 0482477b7cc3a3e0b223cbd7bc937f44a2b7a8dd..8c1677b8be09672ac97757c205ea00d70c6ac230 100644 (file)
@@ -801,11 +801,9 @@ int MDSDaemon::_handle_command(
     int64_t session_id = 0;
     bool got = cmd_getval(cct, cmdmap, "session_id", session_id);
     assert(got);
-    const bool killed = mds_rank->kill_session(session_id);
-    if (!killed) {
+    bool killed = mds_rank->kill_session(session_id, false, ss);
+    if (!killed)
       r = -ENOENT;
-      ss << "session '" << session_id << "' not found";
-    }
   } else if (prefix == "heap") {
     if (!ceph_using_tcmalloc()) {
       r = -EOPNOTSUPP;
index 19a584a65ccc27bb5488681e0ea45763edbda21d..f845e286566b58f521485e53cbc5444e24866201 100644 (file)
@@ -1710,18 +1710,11 @@ bool MDSRankDispatcher::handle_asok_command(
     assert(got_arg == true);
 
     mds_lock.Lock();
-    Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT,
-                                                            strtol(client_id.c_str(), 0, 10)));
-    if (session) {
-      C_SaferCond on_safe;
-      server->kill_session(session, &on_safe);
-
-      mds_lock.Unlock();
-      on_safe.wait();
-    } else {
-      dout(15) << "session " << session << " not in sessionmap!" << dendl;
-      mds_lock.Unlock();
-    }
+    std::stringstream ss;
+    bool killed = kill_session(strtol(client_id.c_str(), 0, 10), true, ss);
+    if (!killed)
+      dout(15) << ss.str() << dendl;
+    mds_lock.Unlock();
   } else if (command == "scrub_path") {
     string path;
     vector<string> scrubop_vec;
@@ -1788,13 +1781,13 @@ protected:
 public:
   C_MDS_Send_Command_Reply(MDSRank *_mds, MCommand *_m) :
     MDSInternalContext(_mds), m(_m) { m->get(); }
-  void send (int r) {
+  void send (int r, const std::string& out_str) {
     bufferlist bl;
-    MDSDaemon::send_command_reply(m, mds, r, bl, "");
+    MDSDaemon::send_command_reply(m, mds, r, bl, out_str);
     m->put();
   }
   void finish (int r) {
-    send(r);
+    send(r, "");
   }
 };
 
@@ -1805,9 +1798,15 @@ public:
  */
 void MDSRankDispatcher::evict_sessions(const SessionFilter &filter, MCommand *m)
 {
-  std::list<Session*> victims;
   C_MDS_Send_Command_Reply *reply = new C_MDS_Send_Command_Reply(this, m);
 
+  if (is_any_replay()) {
+    reply->send(-EAGAIN, "MDS is replaying log");
+    delete reply;
+    return;
+  }
+
+  std::list<Session*> victims;
   const auto sessions = sessionmap.get_sessions();
   for (const auto p : sessions)  {
     if (!p.first.is_client()) {
@@ -1824,7 +1823,7 @@ void MDSRankDispatcher::evict_sessions(const SessionFilter &filter, MCommand *m)
   dout(20) << __func__ << " matched " << victims.size() << " sessions" << dendl;
 
   if (victims.empty()) {
-    reply->send(0);
+    reply->send(0, "");
     delete reply;
     return;
   }
@@ -2420,16 +2419,29 @@ void MDSRankDispatcher::handle_osd_map()
   objecter->maybe_request_map();
 }
 
-bool MDSRankDispatcher::kill_session(int64_t session_id)
+bool MDSRankDispatcher::kill_session(int64_t session_id, bool wait, std::stringstream& err_ss)
 {
+  if (is_any_replay()) {
+    err_ss << "MDS is replaying log";
+    return false;
+  }
+
   Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id));
+  if (!session) {
+    err_ss << "session " << session_id << " not in sessionmap!";
+    return false;
+  }
+  if (wait) {
+    C_SaferCond on_safe;
+    server->kill_session(session, &on_safe);
 
-  if (session) {
-    server->kill_session(session, NULL);
-    return true;
+    mds_lock.Unlock();
+    on_safe.wait();
+    mds_lock.Lock();
   } else {
-    return false;
+    server->kill_session(session, NULL);
   }
+  return true;
 }
 
 void MDSRank::bcast_mds_map()
@@ -2456,12 +2468,11 @@ bool MDSRankDispatcher::handle_command_legacy(std::vector<std::string> args)
       mdcache->dump_cache();
   }
   else if (args[0] == "session" && args[1] == "kill") {
-    Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT,
-                                                           strtol(args[2].c_str(), 0, 10)));
-    if (session)
-      server->kill_session(session, NULL);
-    else
-      dout(15) << "session " << session << " not in sessionmap!" << dendl;
+    std::stringstream ss;
+    bool killed = kill_session(strtol(args[2].c_str(), 0, 10), false, ss);
+    if (!killed)
+      dout(15) << ss.str() << dendl;
+
   } else if (args[0] == "issue_caps") {
     long inum = strtol(args[1].c_str(), 0, 10);
     CInode *in = mdcache->get_inode(inodeno_t(inum));
index 17e259b174b7e938ac8bc80ab32e07eeedc9607d..c8022e6cac15ee027eefc13b66f2878bf5cda5b7 100644 (file)
@@ -488,7 +488,7 @@ public:
                            Formatter *f, std::ostream& ss);
   void handle_mds_map(MMDSMap *m, MDSMap *oldmap);
   void handle_osd_map();
-  bool kill_session(int64_t session_id);
+  bool kill_session(int64_t session_id, bool wait, std::stringstream& ss);
   void update_log_config();
   bool handle_command_legacy(std::vector<std::string> args);