#include "common/DoutStreambuf.h"
#include "common/errno.h"
#include "common/perf_counters.h"
+#include "common/admin_socket.h"
#include "include/color.h"
#include "include/ceph_fs.h"
probe_timeout_event(NULL),
paxos(PAXOS_NUM), paxos_service(PAXOS_NUM),
+ admin_hook(NULL),
routed_request_tid(0)
{
rank = -1;
l_mon_last,
};
+
+class AdminHook : public AdminSocketHook {
+ Monitor *mon;
+public:
+ AdminHook(Monitor *m) : mon(m) {}
+ bool call(std::string command, bufferlist& out) {
+ stringstream ss;
+ mon->do_admin_command(command, ss);
+ out.append(ss);
+ return true;
+ }
+};
+
+void Monitor::do_admin_command(string command, ostream& ss)
+{
+ Mutex::Locker l(lock);
+ if (command == "mon_status")
+ _mon_status(ss);
+ else if (command == "quorum_status")
+ _quorum_status(ss);
+ else
+ assert(0 == "bad AdminSocket command binding");
+}
+
void Monitor::init()
{
lock.Lock();
key_server.bootstrap_keyring(keyring);
}
+ admin_hook = new AdminHook(this);
+ AdminSocket* admin_socket = cct->get_admin_socket();
+ int r = admin_socket->register_command("mon_status", admin_hook,
+ "show current monitor status");
+ assert(r == 0);
+ r = admin_socket->register_command("quorum_status", admin_hook,
+ "show current quorum status");
+ assert(r == 0);
+
// i'm ready!
messenger->add_dispatcher_tail(this);
messenger->add_dispatcher_head(&clog);
{
dout(1) << "shutdown" << dendl;
+ if (admin_hook) {
+ AdminSocket* admin_socket = cct->get_admin_socket();
+ admin_socket->unregister_command("mon_status");
+ admin_socket->unregister_command("quorum_status");
+ delete admin_hook;
+ admin_hook = NULL;
+ }
+
elector.shutdown();
if (logger) {
void Monitor::_quorum_status(ostream& ss)
{
- if (!is_leader() && !is_peon()) {
- return;
- }
-
JSONFormatter jf(true);
jf.open_object_section("quorum_status");
jf.dump_int("election_epoch", get_epoch());
class PaxosService;
class PerfCounters;
+class AdminSocketHook;
class MMonGetMap;
class MMonGetVersion;
// -- sessions --
MonSessionMap session_map;
+ AdminSocketHook *admin_hook;
void check_subs();
void check_sub(Subscription *sub);
void send_latest_monmap(Connection *con);
-
// messages
void handle_get_version(MMonGetVersion *m);
int mkfs(bufferlist& osdmapbl);
+ void do_admin_command(std::string command, ostream& ss);
+
private:
// don't allow copying
Monitor(const Monitor& rhs);