This is an automated email from the ASF dual-hosted git repository.

hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new 53ea0904 Fix data race in instant metrics (#1790)
53ea0904 is described below

commit 53ea09045414f0d6493cee421e94cb6ffd53ddda
Author: hulk <[email protected]>
AuthorDate: Sun Oct 1 18:08:45 2023 +0800

    Fix data race in instant metrics (#1790)
---
 src/stats/stats.cc | 3 +++
 src/stats/stats.h  | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/src/stats/stats.cc b/src/stats/stats.cc
index ad34d8f6..115fc4d9 100644
--- a/src/stats/stats.cc
+++ b/src/stats/stats.cc
@@ -21,6 +21,7 @@
 #include "stats.h"
 
 #include <chrono>
+#include <mutex>
 
 #include "fmt/format.h"
 #include "time_util.h"
@@ -93,6 +94,7 @@ void Stats::IncrLatency(uint64_t latency, const std::string 
&command_name) {
 
 void Stats::TrackInstantaneousMetric(int metric, uint64_t current_reading) {
   uint64_t curr_time = util::GetTimeStampMS();
+  std::unique_lock<std::shared_mutex> lock(inst_metrics_mutex);
   uint64_t t = curr_time - inst_metrics[metric].last_sample_time;
   uint64_t ops = current_reading - inst_metrics[metric].last_sample_count;
   uint64_t ops_sec = t > 0 ? (ops * 1000 / t) : 0;
@@ -104,6 +106,7 @@ void Stats::TrackInstantaneousMetric(int metric, uint64_t 
current_reading) {
 }
 
 uint64_t Stats::GetInstantaneousMetric(int metric) const {
+  std::shared_lock<std::shared_mutex> lock(inst_metrics_mutex);
   uint64_t sum = 0;
   for (uint64_t sample : inst_metrics[metric].samples) sum += sample;
   return sum / STATS_METRIC_SAMPLES;
diff --git a/src/stats/stats.h b/src/stats/stats.h
index dd8dcead..ac73519e 100644
--- a/src/stats/stats.h
+++ b/src/stats/stats.h
@@ -24,6 +24,7 @@
 
 #include <atomic>
 #include <map>
+#include <shared_mutex>
 #include <string>
 #include <vector>
 
@@ -59,6 +60,8 @@ class Stats {
   std::atomic<uint64_t> total_calls = {0};
   std::atomic<uint64_t> in_bytes = {0};
   std::atomic<uint64_t> out_bytes = {0};
+
+  mutable std::shared_mutex inst_metrics_mutex;
   std::vector<struct InstMetric> inst_metrics;
 
   std::atomic<uint64_t> fullsync_counter = {0};

Reply via email to