]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: dump granular cap info in mds_sessions 37362/head
authorYanhu Cao <gmayyyha@gmail.com>
Wed, 12 Aug 2020 08:01:03 +0000 (16:01 +0800)
committerNathan Cutler <ncutler@suse.com>
Wed, 25 Nov 2020 10:38:50 +0000 (11:38 +0100)
Signed-off-by: Yanhu Cao <gmayyyha@gmail.com>
(cherry picked from commit 4a04f8d27110e816bff5b8e414c4a06a12d0812c)

Conflicts:
src/client/Client.cc
- octopus does not have "namespace bs = boost::system; namespace ca = ceph::async;"
src/mds/SessionMap.h
- octopus has Formatter instead of ceph::Formatter

src/client/Client.cc
src/client/Client.h
src/client/MetaSession.cc
src/client/MetaSession.h
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/SessionMap.cc
src/mds/SessionMap.h

index e34c99b2f49d808e577fe4f1b64aaaceea388ffe..8d841819937079bfa09e240367bb68af45f98d18 100755 (executable)
 
 #define DEBUG_GETATTR_CAPS (CEPH_CAP_XATTR_SHARED)
 
+using namespace TOPNSPC::common;
+
 void client_flush_set_callback(void *p, ObjectCacher::ObjectSet *oset)
 {
   Client *client = static_cast<Client*>(p);
@@ -150,9 +152,11 @@ int Client::CommandHook::call(
     std::lock_guard l{m_client->client_lock};
     if (command == "mds_requests")
       m_client->dump_mds_requests(f);
-    else if (command == "mds_sessions")
-      m_client->dump_mds_sessions(f);
-    else if (command == "dump_cache")
+    else if (command == "mds_sessions") {
+      bool cap_dump = false;
+      cmd_getval(cmdmap, "cap_dump", cap_dump);
+      m_client->dump_mds_sessions(f, cap_dump);
+    } else if (command == "dump_cache")
       m_client->dump_cache(f);
     else if (command == "kick_stale_sessions")
       m_client->_kick_stale_sessions();
@@ -519,7 +523,8 @@ void Client::_finish_init()
     lderr(cct) << "error registering admin socket command: "
               << cpp_strerror(-ret) << dendl;
   }
-  ret = admin_socket->register_command("mds_sessions",
+  ret = admin_socket->register_command("mds_sessions "
+                                      "name=cap_dump,type=CephBool,req=false",
                                       &m_command_hook,
                                       "show mds session state");
   if (ret < 0) {
@@ -1534,7 +1539,7 @@ void Client::connect_mds_targets(mds_rank_t mds)
   }
 }
 
-void Client::dump_mds_sessions(Formatter *f)
+void Client::dump_mds_sessions(Formatter *f, bool cap_dump)
 {
   f->dump_int("id", get_nodeid().v);
   entity_inst_t inst(messenger->get_myname(), messenger->get_myaddr_legacy());
@@ -1544,7 +1549,7 @@ void Client::dump_mds_sessions(Formatter *f)
   f->open_array_section("sessions");
   for (const auto &p : mds_sessions) {
     f->open_object_section("session");
-    p.second.dump(f);
+    p.second.dump(f, cap_dump);
     f->close_section();
   }
   f->close_section();
index c8ea7aa5f0ad8104998c73c0850c4c2782689212..09f2ef97052b19dbcd2933ca74f2e7dd6e23eb72 100644 (file)
@@ -778,7 +778,7 @@ protected:
   void _sync_write_commit(Inode *in);
 
   void dump_mds_requests(Formatter *f);
-  void dump_mds_sessions(Formatter *f);
+  void dump_mds_sessions(Formatter *f, bool cap_dump=false);
 
   int make_request(MetaRequest *req, const UserPerm& perms,
                   InodeRef *ptarget = 0, bool *pcreated = 0,
index 177be19399208c66d5424b075eeb035e7a7b7fa9..b5160a84331b61e20c7c72ab1e425dc46bb74458 100644 (file)
@@ -5,6 +5,7 @@
 #include "messages/MClientCapRelease.h"
 
 #include "MetaSession.h"
+#include "Inode.h"
 
 #include "common/Formatter.h"
 
@@ -21,7 +22,7 @@ const char *MetaSession::get_state_name() const
   }
 }
 
-void MetaSession::dump(Formatter *f) const
+void MetaSession::dump(Formatter *f, bool cap_dump) const
 {
   f->dump_int("mds", mds_num);
   f->dump_object("addrs", addrs);
@@ -31,6 +32,13 @@ void MetaSession::dump(Formatter *f) const
   f->dump_stream("last_cap_renew_request") << last_cap_renew_request;
   f->dump_unsigned("cap_renew_seq", cap_renew_seq);
   f->dump_int("num_caps", caps.size());
+  if (cap_dump) {
+    f->open_array_section("caps");
+    for (const auto& cap : caps) {
+      f->dump_object("cap", *cap);
+    }
+    f->close_section();
+  }
   f->dump_string("state", get_state_name());
 }
 
index c0901305a810481a61181764a3bf7b799b4973a0..c215b268942cbc05e7fdeed285b6dfd440da91ea 100644 (file)
@@ -66,7 +66,7 @@ struct MetaSession {
 
   const char *get_state_name() const;
 
-  void dump(Formatter *f) const;
+  void dump(Formatter *f, bool cap_dump=false) const;
 
   void enqueue_cap_release(inodeno_t ino, uint64_t cap_id, ceph_seq_t iseq,
       ceph_seq_t mseq, epoch_t osd_barrier);
index d0ff38a3ef068644f4de6b86696dce6d0770e25b..74def09ea0728fe2248eac2322c5a1df5af3e6a7 100644 (file)
@@ -333,11 +333,15 @@ void MDSDaemon::set_up_admin_socket()
                                      asok_hook,
                                      "dump snapshots");
   ceph_assert(r == 0);
-  r = admin_socket->register_command("session ls name=filters,type=CephString,n=N,req=false",
+  r = admin_socket->register_command("session ls "
+                                    "name=cap_dump,type=CephBool,req=false "
+                                    "name=filters,type=CephString,n=N,req=false ",
                                     asok_hook,
                                     "List client sessions based on a filter");
   ceph_assert(r == 0);
-  r = admin_socket->register_command("client ls name=filters,type=CephString,n=N,req=false",
+  r = admin_socket->register_command("client ls "
+                                    "name=cap_dump,type=CephBool,req=false "
+                                    "name=filters,type=CephString,n=N,req=false ",
                                     asok_hook,
                                     "List client sessions based on a filter");
   ceph_assert(r == 0);
@@ -353,7 +357,7 @@ void MDSDaemon::set_up_admin_socket()
                                     asok_hook,
                                     "Evict a client session by id");
   ceph_assert(r == 0);
-  r = admin_socket->register_command("session ls",
+  r = admin_socket->register_command("session ls name=cap_dump,type=CephBool,req=false",
                                     asok_hook,
                                     "Enumerate connected CephFS clients");
   ceph_assert(r == 0);
index 5f7741de3aac937b53d38b4e0ace4979f308e10c..95c4d979f5a8f33d3bc61dd3e866962fb9970747 100644 (file)
@@ -2506,14 +2506,17 @@ void MDSRankDispatcher::handle_asok_command(
   } else if (command == "session ls" ||
             command == "client ls") {
     std::lock_guard l(mds_lock);
+    bool cap_dump = false;
     std::vector<std::string> filter_args;
+    cmd_getval(cmdmap, "cap_dump", cap_dump);
     cmd_getval(cmdmap, "filters", filter_args);
+
     SessionFilter filter;
     r = filter.parse(filter_args, &ss);
     if (r != 0) {
       goto out;
     }
-    dump_sessions(filter, f);
+    dump_sessions(filter, f, cap_dump);
   } else if (command == "session evict" ||
             command == "client evict") {
     std::lock_guard l(mds_lock);
@@ -2772,7 +2775,7 @@ void MDSRankDispatcher::evict_clients(
   gather.activate();
 }
 
-void MDSRankDispatcher::dump_sessions(const SessionFilter &filter, Formatter *f) const
+void MDSRankDispatcher::dump_sessions(const SessionFilter &filter, Formatter *f, bool cap_dump) const
 {
   // Dump sessions, decorated with recovery/replay status
   f->open_array_section("sessions");
@@ -2785,7 +2788,9 @@ void MDSRankDispatcher::dump_sessions(const SessionFilter &filter, Formatter *f)
       continue;
     }
 
-    f->dump_object("session", *s);
+    f->open_object_section("session");
+    s->dump(f, cap_dump);
+    f->close_section();
   }
   f->close_section(); // sessions
 }
index b15ebbc868d5939818260c8e3997c41f3fff65d2..ee34c95d3158213567acfb6b6c5f5f7c461f8b3c 100644 (file)
@@ -648,7 +648,7 @@ public:
   const char** get_tracked_conf_keys() const override final;
   void handle_conf_change(const ConfigProxy& conf, const std::set<std::string>& changed) override;
 
-  void dump_sessions(const SessionFilter &filter, Formatter *f) const;
+  void dump_sessions(const SessionFilter &filter, Formatter *f, bool cap_dump=false) const;
   void evict_clients(const SessionFilter &filter,
                     std::function<void(int,const std::string&,bufferlist&)> on_finish);
 
index 1910f04f061a8ee1d6ddf2a9feee653b6951ddf0..13af8479f5c61dd5d40e725ac7aaea55ec7d0b76 100644 (file)
@@ -571,13 +571,20 @@ void SessionMapStore::decode_legacy(bufferlist::const_iterator& p)
   }
 }
 
-void Session::dump(Formatter *f) const
+void Session::dump(Formatter *f, bool cap_dump) const
 {
   f->dump_int("id", info.inst.name.num());
   f->dump_object("entity", info.inst);
   f->dump_string("state", get_state_name());
   f->dump_int("num_leases", leases.size());
   f->dump_int("num_caps", caps.size());
+  if (cap_dump) {
+    f->open_array_section("caps");
+    for (const auto& cap : caps) {
+      f->dump_object("cap", *cap);
+    }
+    f->close_section();
+  }
   if (is_open() || is_stale()) {
     f->dump_unsigned("request_load_avg", get_load_avg());
   }
index 1d2555c4c8a35cc521dc94fbd5d9d858ead79667..d2bfab9062e565dc19693e8572a8ca6d93eb2239 100644 (file)
@@ -117,7 +117,7 @@ public:
     }
   }
 
-  void dump(Formatter *f) const;
+  void dump(Formatter *f, bool cap_dump=false) const;
   void push_pv(version_t pv)
   {
     ceph_assert(projected.empty() || projected.back() != pv);