From: Yanhu Cao Date: Wed, 12 Aug 2020 08:01:03 +0000 (+0800) Subject: mds: dump granular cap info in mds_sessions X-Git-Tag: v15.2.9~109^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=efd7c227bed8c404e4f41a03003a1373c030b3f1;p=ceph.git mds: dump granular cap info in mds_sessions Signed-off-by: Yanhu Cao (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 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e34c99b2f49..8d841819937 100755 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -124,6 +124,8 @@ #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(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(); diff --git a/src/client/Client.h b/src/client/Client.h index c8ea7aa5f0a..09f2ef97052 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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, diff --git a/src/client/MetaSession.cc b/src/client/MetaSession.cc index 177be193992..b5160a84331 100644 --- a/src/client/MetaSession.cc +++ b/src/client/MetaSession.cc @@ -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()); } diff --git a/src/client/MetaSession.h b/src/client/MetaSession.h index c0901305a81..c215b268942 100644 --- a/src/client/MetaSession.h +++ b/src/client/MetaSession.h @@ -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); diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index d0ff38a3ef0..74def09ea07 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -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); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 5f7741de3aa..95c4d979f5a 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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 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 } diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index b15ebbc868d..ee34c95d315 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -648,7 +648,7 @@ public: const char** get_tracked_conf_keys() const override final; void handle_conf_change(const ConfigProxy& conf, const std::set& 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 on_finish); diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index 1910f04f061..13af8479f5c 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -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()); } diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index 1d2555c4c8a..d2bfab9062e 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -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);