]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
perf_counters: use bufferlist instead of vector<char>
authorSage Weil <sage@inktank.com>
Thu, 31 May 2012 04:10:08 +0000 (21:10 -0700)
committerSage Weil <sage@inktank.com>
Thu, 31 May 2012 05:22:34 +0000 (22:22 -0700)
bufferlist allocates page-sized chunks and avoids realloc, which'll be
more efficient than vector resize doubling just about always.

Signed-off-by: Sage Weil <sage@inktank.com>
src/common/ceph_context.cc
src/common/perf_counters.cc
src/common/perf_counters.h

index 1f0fcac8b838d10f1f7687fe72e51644df037f52..e98f91b716fa41b8f66d9889e34ed76494d60347 100644 (file)
@@ -164,15 +164,11 @@ void CephContext::do_command(std::string command, std::string args, bufferlist *
   lgeneric_dout(this, 1) << "do_command '" << command << "' '" << args << "'" << dendl;
   if (command == "perfcounters_dump" || command == "1" ||
       command == "perf dump") {
-    std::vector<char> v;
-    _perf_counters_collection->write_json_to_buf(v, false);
-    out->append(&v[0], v.size());
+    _perf_counters_collection->write_json_to_buf(*out, false);
   }
   else if (command == "perfcounters_schema" || command == "2" ||
           command == "perf schema") {
-    std::vector<char> v;
-    _perf_counters_collection->write_json_to_buf(v, true);
-    out->append(&v[0], v.size());
+    _perf_counters_collection->write_json_to_buf(*out, true);
   }
   else if (command == "config show") {
     ostringstream ss;
index 6e41d7238056ce46b26fa7f86165179f629c35ee..985a5364620e4d820916d04fa6b12e124a9d2d09 100644 (file)
@@ -72,22 +72,21 @@ void PerfCountersCollection::clear()
   }
 }
 
-void PerfCountersCollection::write_json_to_buf(std::vector <char> &buffer, bool schema)
+void PerfCountersCollection::write_json_to_buf(bufferlist& bl, bool schema)
 {
   Mutex::Locker lck(m_lock);
-  buffer.push_back('{');
+  bl.append('{');
   perf_counters_set_t::iterator l = m_loggers.begin();
   perf_counters_set_t::iterator l_end = m_loggers.end();
   if (l != l_end) {
     while (true) {
-      (*l)->write_json_to_buf(buffer, schema);
+      (*l)->write_json_to_buf(bl, schema);
       if (++l == l_end)
        break;
-      buffer.push_back(',');
+      bl.append(',');
     }
   }
-  buffer.push_back('}');
-  buffer.push_back('\0');
+  bl.append('}');
 }
 
 // ---------------------------
@@ -170,26 +169,18 @@ double PerfCounters::fget(int idx) const
   return data.u.dbl;
 }
 
-static inline void append_to_vector(std::vector <char> &buffer, char *buf)
-{
-  size_t strlen_buf = strlen(buf);
-  std::vector<char>::size_type sz = buffer.size();
-  buffer.resize(sz + strlen_buf);
-  memcpy(&buffer[sz], buf, strlen_buf);
-}
-
-void PerfCounters::write_json_to_buf(std::vector <char> &buffer, bool schema)
+void PerfCounters::write_json_to_buf(bufferlist& bl, bool schema)
 {
   char buf[512];
   Mutex::Locker lck(m_lock);
 
   snprintf(buf, sizeof(buf), "\"%s\":{", m_name.c_str());
-  append_to_vector(buffer, buf);
+  bl.append(buf);
 
   perf_counter_data_vec_t::const_iterator d = m_data.begin();
   perf_counter_data_vec_t::const_iterator d_end = m_data.end();
   if (d == d_end) {
-    buffer.push_back('}');
+    bl.append('}');
     return;
   }
   while (true) {
@@ -200,12 +191,12 @@ void PerfCounters::write_json_to_buf(std::vector <char> &buffer, bool schema)
     else
       data.write_json(buf, sizeof(buf));
 
-    append_to_vector(buffer, buf);
+    bl.append(buf);
     if (++d == d_end)
       break;
-    buffer.push_back(',');
+    bl.append(',');
   }
-  buffer.push_back('}');
+  bl.append('}');
 }
 
 const std::string &PerfCounters::get_name() const
index 31bfce3456e34684067c2d5dbc913aa8838c5de2..87fca4a11d1a30aecd2833e2aa9d568e9a998264 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "common/config_obs.h"
 #include "common/Mutex.h"
+#include "include/buffer.h"
 
 #include <stdint.h>
 #include <string>
@@ -73,7 +74,7 @@ public:
   void finc(int idx, double v);
   double fget(int idx) const;
 
-  void write_json_to_buf(std::vector <char> &buffer, bool schema);
+  void write_json_to_buf(ceph::bufferlist& bl, bool schema);
 
   const std::string& get_name() const;
   void set_name(std::string s) {
@@ -136,7 +137,7 @@ public:
   void add(class PerfCounters *l);
   void remove(class PerfCounters *l);
   void clear();
-  void write_json_to_buf(std::vector <char> &buffer, bool schema);
+  void write_json_to_buf(ceph::bufferlist& bl, bool schema);
 private:
   bool init(const std::string &uri);
   void shutdown();