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;
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;
reset_tick();
create_logger();
+ set_up_admin_socket();
mds_lock.Unlock();
// 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