From 206b555646863626ba15f72da496bbf8ff2ef24f Mon Sep 17 00:00:00 2001 From: kishorenc Date: Fri, 19 Feb 2021 13:11:57 +0530 Subject: [PATCH] Add guards around metrics access. --- include/app_metrics.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/include/app_metrics.h b/include/app_metrics.h index ca252a6a..5db588ca 100644 --- a/include/app_metrics.h +++ b/include/app_metrics.h @@ -4,9 +4,12 @@ #include "json.hpp" #include "logger.h" #include +#include class AppMetrics { private: + mutable std::shared_mutex mutex; + // stores last complete window spp::sparse_hash_map* counts; spp::sparse_hash_map* durations; @@ -44,14 +47,18 @@ public: void operator=(AppMetrics const&) = delete; void increment_count(const std::string& identifier, uint64_t count) { + std::unique_lock lock(mutex); (*current_counts)[identifier] += count; } void increment_duration(const std::string& identifier, uint64_t duration) { + std::unique_lock lock(mutex); (*current_durations)[identifier] += duration; } void window_reset() { + std::unique_lock lock(mutex); + delete counts; counts = current_counts; current_counts = new spp::sparse_hash_map(); @@ -61,7 +68,9 @@ public: current_durations = new spp::sparse_hash_map(); } - void get(const std::string& count_key, const std::string& latency_key, nlohmann::json &result) { + void get(const std::string& count_key, const std::string& latency_key, nlohmann::json &result) const { + std::shared_lock lock(mutex); + result[count_key] = nlohmann::json::object(); for(const auto& kv: *counts) { result[count_key][kv.first] = (double(kv.second) / (METRICS_REFRESH_INTERVAL_MS / 1000));