map<string, cmd_vartype> cmdmap;
string prefix;
+ string format;
+ boost::scoped_ptr<Formatter> f;
if (cmd.empty()) {
ss << "no command given";
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") {
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();
}
}
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") {
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") {
#include "messages/MOSDPGLog.h"
#include "common/tracked_int_ptr.hpp"
#include "common/WorkQueue.h"
+#include "include/str_list.h"
#include <list>
#include <memory>
}
}
+ 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++;