#define DEBUG_GETATTR_CAPS (CEPH_CAP_XATTR_SHARED)
+using namespace TOPNSPC::common;
+
namespace bs = boost::system;
namespace ca = ceph::async;
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();
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) {
}
}
-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());
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();
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,
#include "messages/MClientCapRelease.h"
#include "MetaSession.h"
+#include "Inode.h"
#include "common/Formatter.h"
}
}
-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);
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());
}
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);
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);
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);
} 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);
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");
continue;
}
- f->dump_object("session", *s);
+ f->open_object_section("session");
+ s->dump(f, cap_dump);
+ f->close_section();
}
f->close_section(); // sessions
}
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);
}
}
-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());
}
}
}
- 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);