From 5f8186b1062aa3f5d94a0df5a73b6a360a953caf Mon Sep 17 00:00:00 2001 From: Jianpeng Ma Date: Wed, 3 Dec 2014 10:10:03 +0800 Subject: [PATCH] common/perf_counters: Add 'perf reset all|perfcountername' for 'ceph --admin-daemon' Using this command, we can reset all perfcounters or reset on specified perfcounter. Signed-off-by: Jianpeng Ma --- src/common/ceph_context.cc | 11 +++++++++++ src/common/perf_counters.cc | 39 +++++++++++++++++++++++++++++++++++++ src/common/perf_counters.h | 12 +++++++++++- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc index 4816acb334d7e..66c38bdd7319f 100644 --- a/src/common/ceph_context.cc +++ b/src/common/ceph_context.cc @@ -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 '"); + } 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 : 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 [ ...]: set a config variable"); _admin_socket->register_command("config get", "config get name=var,type=CephString", _admin_hook, "config get : 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"); diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index 39df713b8c5ff..f92f81efeba68 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -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 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()); diff --git a/src/common/perf_counters.h b/src/common/perf_counters.h index 78c8684a2a58f..24b505dc3a273 100644 --- a/src/common/perf_counters.h +++ b/src/common/perf_counters.h @@ -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 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; -- 2.39.5