]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: dump granular cap info in mds_sessions
authorYanhu Cao <gmayyyha@gmail.com>
Wed, 12 Aug 2020 08:01:03 +0000 (16:01 +0800)
committerYanhu Cao <gmayyyha@gmail.com>
Mon, 17 Aug 2020 02:09:05 +0000 (10:09 +0800)
Signed-off-by: Yanhu Cao <gmayyyha@gmail.com>
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 8a2db48552600c1875e8554e1d0c828dc7c5d5df..691f8357615d8b410e4edbf404e72684c1fa0a1c 100755 (executable)
 
 #define DEBUG_GETATTR_CAPS (CEPH_CAP_XATTR_SHARED)
 
+using namespace TOPNSPC::common;
+
 namespace bs = boost::system;
 namespace ca = ceph::async;
 
@@ -157,9 +159,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();
@@ -526,7 +530,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) {
@@ -1544,7 +1549,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());
@@ -1554,7 +1559,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 f1057e8465d32229aa88f840019d79a473a5445b..46ba84959a2a1c4d576823486dec8296be3be094 100644 (file)
@@ -791,7 +791,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 7702b40e33a51c05580754fb9f0fb19719650dbf..c28cd0b83b6e786725bc90d05121d57b3a443a41 100644 (file)
@@ -62,7 +62,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 7f410cf7727c37e781721af3b540911116adc0d1..924a54441e9887b4822ffc1722247ccf3e9ca98a 100644 (file)
@@ -335,11 +335,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);
@@ -355,7 +359,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 fe51eea00ac4f1675fabc6a1186e6efdc7c88840..4023cf948c40e804ab6a4ce8bb44384144eb4254 100644 (file)
@@ -2555,14 +2555,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);
@@ -2821,7 +2824,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");
@@ -2834,7 +2837,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 69455993527bed44821e69b4879f657a62d3765f..90467420f25553bdd283625b5687e04cf4cbe472 100644 (file)
@@ -663,7 +663,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 2049d16f5cafee024fdc6a3f4face5283720e9dd..9d5bd569ec33c1be6f5bba864da59a2362713f1e 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 c57453fb70c54a5e0d69bd3ca657dc84aa812124..023d1fb0bcb9d046cd8bcf27759c18feec7c714a 100644 (file)
@@ -113,7 +113,7 @@ public:
     }
   }
 
-  void dump(ceph::Formatter *f) const;
+  void dump(ceph::Formatter *f, bool cap_dump=false) const;
   void push_pv(version_t pv)
   {
     ceph_assert(projected.empty() || projected.back() != pv);