diff options
author | Dan Mick <dan.mick@inktank.com> | 2013-07-19 18:03:24 -0700 |
---|---|---|
committer | Dan Mick <dan.mick@inktank.com> | 2013-07-26 13:51:09 -0700 |
commit | 6e6ceffa1b36c4d1d6b6fc7885322c8000f7dd77 (patch) | |
tree | 9f117719f6e41177100b72e63ad8e31afa249e1f | |
parent | c9fcda88a7831ccbf879cf8baf0a91163e437aa3 (diff) | |
download | ceph-6e6ceffa1b36c4d1d6b6fc7885322c8000f7dd77.tar.gz |
OSD: "tell <osd.n>" version, bench, dump_pg_recovery_stats: formatted
Signed-off-by: Dan Mick <dan.mick@inktank.com>
-rw-r--r-- | src/osd/OSD.cc | 40 | ||||
-rw-r--r-- | src/osd/PG.h | 28 |
2 files changed, 61 insertions, 7 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a65772ada3d..76b11672b81 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3879,6 +3879,8 @@ void OSD::do_command(Connection *con, tid_t tid, vector<string>& cmd, bufferlist map<string, cmd_vartype> cmdmap; string prefix; + string format; + boost::scoped_ptr<Formatter> f; if (cmd.empty()) { ss << "no command given"; @@ -3913,8 +3915,18 @@ void OSD::do_command(Connection *con, tid_t tid, vector<string>& cmd, bufferlist goto out; } + cmd_getval(g_ceph_context, cmdmap, "format", format); + f.reset(new_formatter(format)); + if (prefix == "version") { - ds << pretty_version_to_str(); + if (f) { + f->open_object_section("version"); + f->dump_string("version", pretty_version_to_str()); + f->close_section(); + f->flush(ds); + } else { + ds << pretty_version_to_str(); + } goto out; } else if (prefix == "injectargs") { @@ -3952,7 +3964,7 @@ void OSD::do_command(Connection *con, tid_t tid, vector<string>& cmd, bufferlist ss << "i don't have pgid " << pgid; r = -ENOENT; } else { - r = pg->do_command(cmd, ss, data, odata); + r = pg->do_command(cmdmap, ss, data, odata); pg->unlock(); } } @@ -3991,9 +4003,18 @@ void OSD::do_command(Connection *con, tid_t tid, vector<string>& cmd, bufferlist store->queue_transaction(NULL, cleanupt); uint64_t rate = (double)count / (end - start); - ss << "bench: wrote " << prettybyte_t(count) - << " in blocks of " << prettybyte_t(bsize) << " in " - << (end-start) << " sec at " << prettybyte_t(rate) << "/sec"; + if (f) { + f->open_object_section("osd_bench_results"); + f->dump_int("bytes_written", count); + f->dump_int("blocksize", bsize); + f->dump_float("bytes_per_sec", rate); + f->close_section(); + f->flush(ss); + } else { + ss << "bench: wrote " << prettybyte_t(count) + << " in blocks of " << prettybyte_t(bsize) << " in " + << (end-start) << " sec at " << prettybyte_t(rate) << "/sec"; + } } else if (prefix == "flush_pg_stats") { @@ -4090,8 +4111,13 @@ void OSD::do_command(Connection *con, tid_t tid, vector<string>& cmd, bufferlist else if (prefix == "dump_pg_recovery_stats") { stringstream s; - pg_recovery_stats.dump(s); - ds << "dump pg recovery stats: " << s.str(); + if (f) { + pg_recovery_stats.dump_formatted(f.get()); + f->flush(ds); + } else { + pg_recovery_stats.dump(s); + ds << "dump pg recovery stats: " << s.str(); + } } else if (prefix == "reset_pg_recovery_stats") { diff --git a/src/osd/PG.h b/src/osd/PG.h index 819c9c62f62..5525c7f46dd 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -45,6 +45,7 @@ #include "messages/MOSDPGLog.h" #include "common/tracked_int_ptr.hpp" #include "common/WorkQueue.h" +#include "include/str_list.h" #include <list> #include <memory> @@ -112,6 +113,33 @@ struct PGRecoveryStats { } } + void dump_formatted(Formatter *f) { + Mutex::Locker l(lock); + f->open_array_section("pg_recovery_stats"); + for (map<const char *,per_state_info>::iterator p = info.begin(); + p != info.end(); ++p) { + per_state_info& i = p->second; + f->open_object_section("recovery_state"); + f->dump_int("enter", i.enter); + f->dump_int("exit", i.exit); + f->dump_int("events", i.events); + f->dump_stream("event_time") << i.event_time; + f->dump_stream("total_time") << i.total_time; + f->dump_stream("min_time") << i.min_time; + f->dump_stream("max_time") << i.max_time; + vector<string> states; + get_str_vec(p->first, "/", states); + f->open_array_section("nested_states"); + for (vector<string>::iterator st = states.begin(); + st != states.end(); ++st) { + f->dump_string("state", *st); + } + f->close_section(); + f->close_section(); + } + f->close_section(); + } + void log_enter(const char *s) { Mutex::Locker l(lock); info[s].enter++; |