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") {
_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");
_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");
}
}
+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);
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());
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;
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;
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;