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};