summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Mick <dan.mick@inktank.com>2013-07-19 18:03:24 -0700
committerDan Mick <dan.mick@inktank.com>2013-07-26 13:51:09 -0700
commit6e6ceffa1b36c4d1d6b6fc7885322c8000f7dd77 (patch)
tree9f117719f6e41177100b72e63ad8e31afa249e1f
parentc9fcda88a7831ccbf879cf8baf0a91163e437aa3 (diff)
downloadceph-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.cc40
-rw-r--r--src/osd/PG.h28
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++;