]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
OSD: "tell <osd.n>" version, bench, dump_pg_recovery_stats: formatted
authorDan Mick <dan.mick@inktank.com>
Sat, 20 Jul 2013 01:03:24 +0000 (18:03 -0700)
committerDan Mick <dan.mick@inktank.com>
Fri, 26 Jul 2013 20:51:09 +0000 (13:51 -0700)
Signed-off-by: Dan Mick <dan.mick@inktank.com>
src/osd/OSD.cc
src/osd/PG.h

index a65772ada3d03354a007d7dfb857295df4fed5a9..76b11672b81379d4809a9d4ccaa52919af80cc4c 100644 (file)
@@ -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") {
index 819c9c62f62e380e81e84a72e924eae61de01451..5525c7f46dd26efd29646864fc3f1abf29fa080e 100644 (file)
@@ -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++;