]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/perf_counters: Add 'perf reset all|perfcountername' for 'ceph
authorJianpeng Ma <jianpeng.ma@intel.com>
Wed, 3 Dec 2014 02:10:03 +0000 (10:10 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Wed, 3 Dec 2014 02:10:03 +0000 (10:10 +0800)
--admin-daemon'

Using this command, we can reset all perfcounters or reset on specified
perfcounter.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/common/ceph_context.cc
src/common/perf_counters.cc
src/common/perf_counters.h

index 4816acb334d7e8a9328882485fd8de682afd8678..66c38bdd7319fb8af43e83a84ff9452f08aa7bef 100644 (file)
@@ -190,6 +190,15 @@ void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
     command == "perf schema") {
     _perf_counters_collection->dump_formatted(f, true);
   }
+  else if (command == "perf reset") {
+    std::string var;
+    if (!cmd_getval(this, cmdmap, "var", var)) {
+      f->dump_string("error", "syntax error: 'perf reset <var>'");
+    } else {
+     if(!_perf_counters_collection->reset(var))
+        f->dump_stream("error") << "Not find: " << var;
+    }
+  }
   else {
     f->open_object_section(command.c_str());
     if (command == "config show") {
@@ -315,6 +324,7 @@ CephContext::CephContext(uint32_t module_type_)
   _admin_socket->register_command("perfcounters_schema", "perfcounters_schema", _admin_hook, "");
   _admin_socket->register_command("2", "2", _admin_hook, "");
   _admin_socket->register_command("perf schema", "perf schema", _admin_hook, "dump perfcounters schema");
+  _admin_socket->register_command("perf reset", "perf reset name=var,type=CephString", _admin_hook, "perf reset <name>: perf reset all or one perfcounter name");
   _admin_socket->register_command("config show", "config show", _admin_hook, "dump current config settings");
   _admin_socket->register_command("config set", "config set name=var,type=CephString name=val,type=CephString,n=N",  _admin_hook, "config set <field> <val> [<val> ...]: set a config variable");
   _admin_socket->register_command("config get", "config get name=var,type=CephString", _admin_hook, "config get <field>: get the config value");
@@ -343,6 +353,7 @@ CephContext::~CephContext()
   _admin_socket->unregister_command("perfcounters_schema");
   _admin_socket->unregister_command("perf schema");
   _admin_socket->unregister_command("2");
+  _admin_socket->unregister_command("perf reset");
   _admin_socket->unregister_command("config show");
   _admin_socket->unregister_command("config set");
   _admin_socket->unregister_command("config get");
index 39df713b8c5ff7b18b6db0d68ccef5f484f0aeef..f92f81efeba68a169f664bdbaca110c223dbe58e 100644 (file)
@@ -74,6 +74,34 @@ void PerfCountersCollection::clear()
   }
 }
 
+bool PerfCountersCollection::reset(const std::string &name)
+{
+  bool result = false;
+  Mutex::Locker lck(m_lock);
+  perf_counters_set_t::iterator i = m_loggers.begin();
+  perf_counters_set_t::iterator i_end = m_loggers.end();
+
+  if (!strcmp(name.c_str(), "all"))  {
+    while (i != i_end) {
+      (*i)->reset();
+      i++;
+    }
+    result = true;
+  } else {
+    while (i != i_end) {
+      if (!name.compare((*i)->get_name())) {
+       (*i)->reset();
+       result = true;
+       break;
+      }
+      i++;
+    }
+  }
+
+  return result;
+}
+
+
 void PerfCountersCollection::dump_formatted(Formatter *f, bool schema)
 {
   Mutex::Locker lck(m_lock);
@@ -226,6 +254,17 @@ pair<uint64_t, uint64_t> PerfCounters::get_tavg_ms(int idx) const
   return make_pair(a.second, a.first / 1000000ull);
 }
 
+void PerfCounters::reset()
+{
+  perf_counter_data_vec_t::iterator d = m_data.begin();
+  perf_counter_data_vec_t::iterator d_end = m_data.end();
+
+  while (d != d_end) {
+    d->reset();
+    d++;
+  }
+}
+
 void PerfCounters::dump_formatted(Formatter *f, bool schema)
 {
   f->open_object_section(m_name.c_str());
index 78c8684a2a58f2c6d3d35592bbbde2ac27ccfe29..24b505dc3a273289c7348e407b8103b09815fe36 100644 (file)
@@ -94,8 +94,8 @@ public:
   void tinc(int idx, utime_t v);
   utime_t tget(int idx) const;
 
+  void reset();
   void dump_formatted(ceph::Formatter *f, bool schema);
-
   pair<uint64_t, uint64_t> get_tavg_ms(int idx) const;
 
   const std::string& get_name() const;
@@ -137,6 +137,15 @@ private:
     atomic64_t avgcount;
     atomic64_t avgcount2;
 
+    void reset()
+    {
+      if (type != PERFCOUNTER_U64) {
+       u64.set(0);
+       avgcount.set(0);
+       avgcount2.set(0);
+      }
+    }
+
     perf_counter_data_any_d& operator=(const perf_counter_data_any_d& other) {
       name = other.name;
       type = other.type;
@@ -193,6 +202,7 @@ public:
   void add(class PerfCounters *l);
   void remove(class PerfCounters *l);
   void clear();
+  bool reset(const std::string &name);
   void dump_formatted(ceph::Formatter *f, bool schema);
 private:
   CephContext *m_cct;