From: Sage Weil Date: Fri, 7 Nov 2008 20:44:26 +0000 (-0800) Subject: cmonctl: -w or --watch to watch (and print) mds/osd/pg stat changes X-Git-Tag: v0.5~49^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=60a706ed0ac169f6def6048c7df9c39434cee0a7;p=ceph.git cmonctl: -w or --watch to watch (and print) mds/osd/pg stat changes --- diff --git a/src/cmonctl.cc b/src/cmonctl.cc index 0bbbab67608..8de6258d073 100644 --- a/src/cmonctl.cc +++ b/src/cmonctl.cc @@ -39,12 +39,54 @@ using namespace std; Messenger *messenger = 0; const char *outfile = 0; +int watch = 0; + +MonMap monmap; + +enum { OSD, MON, MDS, LAST }; +int which = 0; +int same = 0; +const char *prefix[3] = { "mds", "osd", "pg" }; +string status[3]; + +void get_next_status() +{ + which++; + which = which % LAST; + + vector vcmd(2); + vcmd[0] = prefix[which]; + vcmd[1] = "stat"; + + MMonCommand *m = new MMonCommand(monmap.fsid); + m->cmd.swap(vcmd); + int mon = monmap.pick_mon(); + messenger->send_message(m, monmap.get_inst(mon)); +} void handle_ack(MMonCommandAck *ack) { - generic_dout(0) << ack->get_source() << " -> '" - << ack->rs << "' (" << ack->r << ")" - << dendl; + if (watch) { + if (ack->rs != status[which]) { + status[which] = ack->rs; + generic_dout(0) << prefix[which] << " " << status[which] << dendl; + same = 0; + } else + same++; + + if (same >= LAST) { + sleep(1); + same = 0; + } + + get_next_status(); + + } else { + generic_dout(0) << ack->get_source() << " -> '" + << ack->rs << "' (" << ack->r << ")" + << dendl; + messenger->shutdown(); + } int len = ack->get_data().length(); if (len) { if (outfile) { @@ -61,7 +103,6 @@ void handle_ack(MMonCommandAck *ack) generic_dout(0) << "got " << len << " byte payload, discarding (specify -o shutdown(); } @@ -83,6 +124,7 @@ void usage() cerr << " -m monhost -- specify monitor hostname or ip" << std::endl; cerr << " -i infile -- specify input file" << std::endl; cerr << " -o outfile -- specify output file" << std::endl; + cerr << " -w or --watch -- watch mds, osd, pg status" << std::endl; cerr << "Commands:" << std::endl; cerr << " stop -- cleanly shut down file system" << std::endl << " (osd|pg|mds) stat -- get monitor subsystem status" << std::endl @@ -114,6 +156,9 @@ int main(int argc, const char **argv, const char *envp[]) { ::close(fd); cout << "read " << st.st_size << " bytes from " << args[i] << std::endl; } + } else if (strcmp(args[i], "-w") == 0 || + strcmp(args[i], "--watch") == 0) { + watch = 1; } else nargs.push_back(args[i]); } @@ -121,18 +166,19 @@ int main(int argc, const char **argv, const char *envp[]) { // build command vector vcmd; string cmd; - for (unsigned i=0; iset_dispatcher(&dispatcher); - // build command - MMonCommand *m = new MMonCommand(monmap.fsid); - m->set_data(indata); - m->cmd.swap(vcmd); - int mon = monmap.pick_mon(); - - generic_dout(0) << "mon" << mon << " <- '" << cmd << "'" << dendl; - - // send it - messenger->send_message(m, monmap.get_inst(mon)); + if (watch) { + get_next_status(); + } else { + // build command + MMonCommand *m = new MMonCommand(monmap.fsid); + m->set_data(indata); + m->cmd.swap(vcmd); + int mon = monmap.pick_mon(); + + generic_dout(0) << "mon" << mon << " <- '" << cmd << "'" << dendl; + + // send it + messenger->send_message(m, monmap.get_inst(mon)); + } // wait for messenger to finish rank.wait();