From 6e6ceffa1b36c4d1d6b6fc7885322c8000f7dd77 Mon Sep 17 00:00:00 2001 From: Dan Mick Date: Fri, 19 Jul 2013 18:03:24 -0700 Subject: [PATCH] OSD: "tell " version, bench, dump_pg_recovery_stats: formatted Signed-off-by: Dan Mick --- src/osd/OSD.cc | 40 +++++++++++++++++++++++++++++++++------- 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 a65772ada3d03..76b11672b8137 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& cmd, bufferlist map cmdmap; string prefix; + string format; + boost::scoped_ptr f; if (cmd.empty()) { ss << "no command given"; @@ -3913,8 +3915,18 @@ void OSD::do_command(Connection *con, tid_t tid, vector& 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& 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& 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& 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 819c9c62f62e3..5525c7f46dd26 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 #include @@ -112,6 +113,33 @@ struct PGRecoveryStats { } } + void dump_formatted(Formatter *f) { + Mutex::Locker l(lock); + f->open_array_section("pg_recovery_stats"); + for (map::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 states; + get_str_vec(p->first, "/", states); + f->open_array_section("nested_states"); + for (vector::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++; -- 2.39.5