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: wip-pdonnell-testing-20200918.022351~301^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4a04f8d27110e816bff5b8e414c4a06a12d0812c;p=ceph-ci.git mds: dump granular cap info in mds_sessions Signed-off-by: Yanhu Cao --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 8a2db485526..691f8357615 100755 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -128,6 +128,8 @@ #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(); diff --git a/src/client/Client.h b/src/client/Client.h index f1057e8465d..46ba84959a2 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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, 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 7702b40e33a..c28cd0b83b6 100644 --- a/src/client/MetaSession.h +++ b/src/client/MetaSession.h @@ -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); diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 7f410cf7727..924a54441e9 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -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); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index fe51eea00ac..4023cf948c4 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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 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 } diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 69455993527..90467420f25 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -663,7 +663,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 2049d16f5ca..9d5bd569ec3 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 c57453fb70c..023d1fb0bcb 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -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);