]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add command that config individual client session
authorYan, Zheng <zyan@redhat.com>
Thu, 18 Jul 2019 07:31:15 +0000 (15:31 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 12 Nov 2019 13:50:04 +0000 (21:50 +0800)
For now, the command only can change session's timeout config

Fixes: http://tracker.ceph.com/issues/40811
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit a9c21bdaef3473d99ac362122d441b9d869230dd)

 Conflicts:
src/mds/MDSDaemon.cc
src/mds/MDSRank.h
src/mds/mdstypes.h

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

index e4ad62465808691ab3aae759219b68caa26492a5..5662f1330ccaaefed7fadf7cf7ca4b943dbd2599 100644 (file)
@@ -283,6 +283,13 @@ void MDSDaemon::set_up_admin_socket()
                                     asok_hook,
                                     "Enumerate connected CephFS clients");
   assert(r == 0);
+  r = admin_socket->register_command("session config",
+                                    "session config name=client_id,type=CephInt,req=true "
+                                    "name=option,type=CephString,req=true "
+                                    "name=value,type=CephString,req=false ",
+                                    asok_hook,
+                                    "Config a CephFS client session");
+  assert(r == 0);
   r = admin_socket->register_command("flush journal",
                                     "flush journal",
                                     asok_hook,
@@ -704,6 +711,9 @@ COMMAND("session evict " \
 COMMAND("client evict " \
        "name=filters,type=CephString,n=N,req=false",
        "Evict client session(s)", "mds", "rw", "cli,rest")
+COMMAND("client config " \
+       "name=client_id,type=CephInt name=option,type=CephString name=value,type=CephString,req=false",
+       "Config a client session", "mds", "rw", "cli,rest")
 COMMAND("damage ls",
        "List detected metadata damage", "mds", "r", "cli,rest")
 COMMAND("damage rm name=damage_id,type=CephInt",
index 9350a1cbbb34b2f642b2dde5d05d12f288087223..e57d1bbc4e9b877d8077e7b099228814eac6f1c2 100644 (file)
@@ -2416,6 +2416,23 @@ bool MDSRankDispatcher::handle_asok_command(
       ss << dss.str();
     }
     mds_lock.Unlock();
+  } else if (command == "session config") {
+    int64_t client_id;
+    std::string option;
+    std::string value;
+
+    cmd_getval(g_ceph_context, cmdmap, "client_id", client_id);
+    cmd_getval(g_ceph_context, cmdmap, "option", option);
+    bool got_value = cmd_getval(g_ceph_context, cmdmap, "value", value);
+
+    mds_lock.Lock();
+    std::stringstream dss;
+    int ret = config_client(client_id, !got_value, option, value, dss);
+    if (ret < 0) {
+      dout(15) << dss.str() << dendl;
+      ss << dss.str();
+    }
+    mds_lock.Unlock();
   } else if (command == "scrub_path") {
     string path;
     vector<string> scrubop_vec;
@@ -3104,6 +3121,42 @@ void MDSRankDispatcher::handle_osd_map()
   objecter->maybe_request_map();
 }
 
+int MDSRank::config_client(int64_t session_id, bool remove,
+                          const std::string& option, const std::string& value,
+                          std::stringstream& ss)
+{
+  Session *session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id));
+  if (!session) {
+    ss << "session " << session_id << " not in sessionmap!";
+    return -ENOENT;
+  }
+
+  if (option == "timeout") {
+    if (remove) {
+      auto it = session->info.client_metadata.find("timeout");
+      if (it == session->info.client_metadata.end()) {
+       ss << "Nonexistent config: " << option;
+       return -ENODATA;
+      }
+      session->info.client_metadata.erase(it);
+    } else {
+      char *end;
+      strtoul(value.c_str(), &end, 0);
+      if (*end) {
+       ss << "Invalid config for timeout: " << value;
+       return -EINVAL;
+      }
+      session->info.client_metadata[option] = value;
+    }
+    //sessionmap._mark_dirty(session, true);
+  } else {
+    ss << "Invalid config option: " << option;
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
 bool MDSRank::evict_client(int64_t session_id,
     bool wait, bool blacklist, std::stringstream& err_ss,
     Context *on_killed)
@@ -3297,6 +3350,17 @@ bool MDSRankDispatcher::handle_command(
 
     *need_reply = false;
     return true;
+  } else if (prefix == "session config" || prefix == "client config") {
+    int64_t client_id;
+    std::string option;
+    std::string value;
+
+    cmd_getval(g_ceph_context, cmdmap, "client_id", client_id);
+    cmd_getval(g_ceph_context, cmdmap, "option", option);
+    bool got_value = cmd_getval(g_ceph_context, cmdmap, "value", value);
+
+    *r = config_client(client_id, !got_value, option, value, *ss);
+    return true;
   } else if (prefix == "damage ls") {
     JSONFormatter f(true);
     damage_table.dump(&f);
index 6be660d10655e8599a36394773a41019b13714d8..0443e38ec7c5785defc4b5ba926fd154edfa331e 100644 (file)
@@ -452,6 +452,9 @@ class MDSRank {
 
     bool evict_client(int64_t session_id, bool wait, bool blacklist,
                       std::stringstream& ss, Context *on_killed=nullptr);
+    int config_client(int64_t session_id, bool remove,
+                     const std::string& option, const std::string& value,
+                     std::stringstream& ss);
 
   protected:
     void dump_clientreplay_status(Formatter *f) const;