diff --git a/daemon/timings.cc b/daemon/timings.cc index 41380175f3..bd513cfbc5 100644 --- a/daemon/timings.cc +++ b/daemon/timings.cc @@ -21,10 +21,20 @@ Timings::Timings() { reset(); } -void Timings::reset() { +Timings::~Timings() { + std::lock_guard lg(histogram_mutex); for (auto& t : timings) { - if (t) { - t->reset(); + delete t; + } +} + +void Timings::reset() { + { + std::lock_guard lg(histogram_mutex); + for (auto& t : timings) { + if (t) { + t.load()->reset(); + } } } @@ -50,7 +60,7 @@ void Timings::collect(cb::mcbp::ClientOpcode opcode, std::string Timings::generate(cb::mcbp::ClientOpcode opcode) { auto* histoPtr = timings[std::underlying_type::type(opcode)] - .get(); + .load(); if (histoPtr) { return histoPtr->to_string(); } @@ -109,7 +119,7 @@ uint64_t Timings::get_aggregated_mutation_stats() { for (auto cmd : timings_mutations) { auto* histoPtr = timings[std::underlying_type::type(cmd)] - .get(); + .load(); if (histoPtr) { ret += histoPtr->getValueCount(); } @@ -123,7 +133,7 @@ uint64_t Timings::get_aggregated_retrival_stats() { for (auto cmd : timings_retrievals) { auto* histoPtr = timings[std::underlying_type::type(cmd)] - .get(); + .load(); if (histoPtr) { ret += histoPtr->getValueCount(); } @@ -143,17 +153,17 @@ cb::sampling::Interval Timings::get_interval_lookup_latency() { Hdr1sfMicroSecHistogram& Timings::get_or_create_timing_histogram( uint8_t opcode) { - if (timings[opcode] == nullptr) { + if (!timings[opcode]) { std::lock_guard allocLock(histogram_mutex); - if (timings[opcode] == nullptr) { - timings[opcode] = std::make_unique(); + if (!timings[opcode]) { + timings[opcode] = new Hdr1sfMicroSecHistogram(); } } - return *timings[opcode]; + return *(timings[opcode].load()); } Hdr1sfMicroSecHistogram* Timings::get_timing_histogram(uint8_t opcode) const { - return timings[opcode].get(); + return timings[opcode].load(); } void Timings::sample(std::chrono::seconds sample_interval) { diff --git a/daemon/timings.h b/daemon/timings.h index 0a75349d8c..c41e2e0fcb 100644 --- a/daemon/timings.h +++ b/daemon/timings.h @@ -34,6 +34,7 @@ class Timings { public: Timings(); Timings(const Timings&) = delete; + ~Timings(); void reset(); void collect(cb::mcbp::ClientOpcode opcode, std::chrono::nanoseconds nsec); @@ -69,8 +70,7 @@ class Timings { // create an array of unique_ptrs as we want to create HdrHistograms // in a lazy manner as their foot print is larger than our old // histogram class - std::array, MAX_NUM_OPCODES> - timings; + std::array, MAX_NUM_OPCODES> timings; std::mutex histogram_mutex; std::array interval_counters; };