From d26488bcf316b58b317f5dce78bfb148f44e855c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 20 Oct 2011 11:34:23 -0700 Subject: [PATCH] perfcounters: fix addition/removal We are not responsible for deleting removed perfcounters. Add debugging. Signed-off-by: Sage Weil --- src/common/config_opts.h | 1 + src/common/perf_counters.cc | 35 +++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index bf830b99f307..14d52b5aae17 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -62,6 +62,7 @@ OPTION(debug_tp, OPT_INT, 0) OPTION(debug_auth, OPT_INT, 1) OPTION(debug_finisher, OPT_INT, 1) OPTION(debug_heartbeatmap, OPT_INT, 1) +OPTION(debug_perfcounter, OPT_INT, 1) OPTION(key, OPT_STR, "") OPTION(keyfile, OPT_STR, "") OPTION(keyring, OPT_STR, "/etc/ceph/keyring,/etc/ceph/keyring.bin") diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index 825711ba9f55..0f451f96cf02 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -15,6 +15,7 @@ #include "common/perf_counters.h" #include "common/dout.h" #include "common/errno.h" +#include "common/debug.h" #include #include @@ -26,6 +27,12 @@ using std::ostringstream; + +#define DOUT_SUBSYS perfcounter +#undef dout_prefix +#define dout_prefix *_dout << "perfcounters " + + PerfCountersCollection::PerfCountersCollection(CephContext *cct) : m_cct(cct), m_lock("PerfCountersCollection") @@ -34,12 +41,7 @@ PerfCountersCollection::PerfCountersCollection(CephContext *cct) PerfCountersCollection::~PerfCountersCollection() { - Mutex::Locker lck(m_lock); - for (perf_counters_set_t::iterator l = m_loggers.begin(); - l != m_loggers.end(); ++l) { - delete *l; - } - m_loggers.clear(); + clear(); } void PerfCountersCollection::add(class PerfCounters *l) @@ -48,6 +50,7 @@ void PerfCountersCollection::add(class PerfCounters *l) perf_counters_set_t::iterator i = m_loggers.find(l); assert(i == m_loggers.end()); m_loggers.insert(l); + dout(2) << "add " << l << " " << l->get_name() << dendl; } void PerfCountersCollection::remove(class PerfCounters *l) @@ -55,7 +58,7 @@ void PerfCountersCollection::remove(class PerfCounters *l) Mutex::Locker lck(m_lock); perf_counters_set_t::iterator i = m_loggers.find(l); assert(i != m_loggers.end()); - delete *i; + dout(2) << "remove " << l << " " << l->get_name() << dendl; m_loggers.erase(i); } @@ -64,8 +67,9 @@ void PerfCountersCollection::clear() Mutex::Locker lck(m_lock); perf_counters_set_t::iterator i = m_loggers.begin(); perf_counters_set_t::iterator i_end = m_loggers.end(); + dout(2) << "clear" << dendl; for (; i != i_end; ) { - delete *i; + dout(10) << "clear " << *i << " " << (*i)->get_name() << dendl; m_loggers.erase(i++); } } @@ -73,11 +77,13 @@ void PerfCountersCollection::clear() void PerfCountersCollection::write_json_to_buf(std::vector &buffer, bool schema) { Mutex::Locker lck(m_lock); + dout(10) << "write_json_to_buf " << m_loggers.size() << dendl; buffer.push_back('{'); 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) { + dout(10) << "write_json_to_buf " << (*l)->get_name() << dendl; (*l)->write_json_to_buf(buffer, schema); if (++l == l_end) break; @@ -88,6 +94,8 @@ void PerfCountersCollection::write_json_to_buf(std::vector &buffer, bool buffer.push_back('\0'); } +// --------------------------- + PerfCounters::~PerfCounters() { } @@ -280,21 +288,25 @@ PerfCountersBuilder::~PerfCountersBuilder() void PerfCountersBuilder::add_u64_counter(int idx, const char *name) { + dout(10) << "add_u64_counter " << idx << " " << name << dendl; add_impl(idx, name, PERFCOUNTER_U64 | PERFCOUNTER_COUNTER); } void PerfCountersBuilder::add_u64(int idx, const char *name) { + dout(10) << "add_u64 " << idx << " " << name << dendl; add_impl(idx, name, PERFCOUNTER_U64); } void PerfCountersBuilder::add_fl(int idx, const char *name) { + dout(10) << "add_fl " << idx << " " << name << dendl; add_impl(idx, name, PERFCOUNTER_FLOAT); } void PerfCountersBuilder::add_fl_avg(int idx, const char *name) { + dout(10) << "add_fl_avg " << idx << " " << name << dendl; add_impl(idx, name, PERFCOUNTER_FLOAT | PERFCOUNTER_LONGRUNAVG); } @@ -305,9 +317,9 @@ void PerfCountersBuilder::add_impl(int idx, const char *name, int ty) PerfCounters::perf_counter_data_vec_t &vec(m_perf_counters->m_data); PerfCounters::perf_counter_data_any_d &data(vec[idx - m_perf_counters->m_lower_bound - 1]); + assert(data.type == PERFCOUNTER_NONE); data.name = name; data.type = (enum perfcounter_type_d)ty; - data.avgcount = 0; } PerfCounters *PerfCountersBuilder::create_perf_counters() @@ -315,7 +327,10 @@ PerfCounters *PerfCountersBuilder::create_perf_counters() PerfCounters::perf_counter_data_vec_t::const_iterator d = m_perf_counters->m_data.begin(); PerfCounters::perf_counter_data_vec_t::const_iterator d_end = m_perf_counters->m_data.end(); for (; d != d_end; ++d) { - assert(d->type != PERFCOUNTER_NONE); + if (d->type == PERFCOUNTER_NONE) { + dout(0) << "perfcounter " << d->name << " has type NONE" << dendl; + assert(d->type != PERFCOUNTER_NONE); + } } PerfCounters *ret = m_perf_counters; m_perf_counters = NULL; -- 2.47.3