From ae80a1f308d5e036d8abdfe1e2ee9a65492e4409 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 8 May 2014 12:13:58 -0700 Subject: [PATCH] MDS: add stubs for an AdminSocketHook Signed-off-by: Greg Farnum --- src/mds/MDS.cc | 44 +++++++++++++++++++++++++++++++++++++++++++- src/mds/MDS.h | 5 +++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 1d9015a22eb61..7fd1bf29c53ea 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -105,7 +105,7 @@ MDS::MDS(const std::string &n, Messenger *m, MonClient *mc) : messenger(m), monc(mc), clog(m->cct, messenger, &mc->monmap, LogClient::NO_FLAGS), - sessionmap(this) { + sessionmap(this), asok_hook(NULL) { orig_argc = 0; orig_argv = NULL; @@ -195,6 +195,47 @@ MDS::~MDS() { delete messenger; } +class MDSSocketHook : public AdminSocketHook { + MDS *mds; +public: + MDSSocketHook(MDS *m) : mds(m) {} + bool call(std::string command, cmdmap_t& cmdmap, std::string format, + bufferlist& out) { + stringstream ss; + bool r = mds->asok_command(command, cmdmap, format, ss); + out.append(ss); + return r; + } +}; + +bool MDS::asok_command(string command, cmdmap_t& cmdmap, string format, + ostream& ss) +{ + Formatter *f = new_formatter(format); + if (!f) + f = new_formatter("json-pretty"); + if (command == "status") { + f->open_object_section("status"); + f->dump_stream("cluster_fsid") << monc->get_fsid(); + f->dump_unsigned("whoami", whoami); + f->dump_string("state", ceph_mds_state_name(get_state())); + f->dump_unsigned("mdsmap_epoch", mdsmap->get_epoch()); + f->close_section(); // status + } + f->flush(ss); + delete f; + return true; +} + +void MDS::set_up_admin_socket() +{ + int r; + AdminSocket *admin_socket = g_ceph_context->get_admin_socket(); + asok_hook = new MDSSocketHook(this); + r = admin_socket->register_command("status", "status", asok_hook, "high-level status of MDS"); + assert(0 == r); +} + void MDS::create_logger() { dout(10) << "create_logger" << dendl; @@ -550,6 +591,7 @@ int MDS::init(int wanted_state) reset_tick(); create_logger(); + set_up_admin_socket(); mds_lock.Unlock(); diff --git a/src/mds/MDS.h b/src/mds/MDS.h index 1cd6096b46d13..2649f449d09fd 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -362,6 +362,11 @@ class MDS : public Dispatcher { // start up, shutdown int init(int wanted_state=MDSMap::STATE_BOOT); + friend class MDSSocketHook; + class MDSSocketHook *asok_hook; + bool asok_command(string command, cmdmap_t& cmdmap, string format, + ostream& ss); + void set_up_admin_socket(); void create_logger(); void bcast_mds_map(); // to mounted clients -- 2.39.5