From 05a622a93700bcebfe337c3e74074c9f5ac0a80b Mon Sep 17 00:00:00 2001 From: flesher0813 <1208954694@qq.com> Date: Thu, 22 Jan 2026 14:32:36 +0800 Subject: [PATCH] [Fix] coredump if add new c++ metrics --- ucm/shared/metrics/cc/api/metrics_api.cc | 2 +- ucm/shared/metrics/cc/domain/metrics.cc | 8 ++++---- ucm/shared/metrics/cc/domain/metrics.h | 9 ++++----- ucm/shared/test/case/metrics/metrics_test.cc | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ucm/shared/metrics/cc/api/metrics_api.cc b/ucm/shared/metrics/cc/api/metrics_api.cc index ca9db6458..c27d6ff55 100644 --- a/ucm/shared/metrics/cc/api/metrics_api.cc +++ b/ucm/shared/metrics/cc/api/metrics_api.cc @@ -24,7 +24,7 @@ #include "metrics_api.h" namespace UC::Metrics { -void SetUp(size_t maxVectorLen) { Metrics::SetUp(maxVectorLen); } +void SetUp(size_t maxVectorLen) { Metrics::GetInstance().SetUp(maxVectorLen); } void CreateStats(const std::string& name, const std::string& type) { diff --git a/ucm/shared/metrics/cc/domain/metrics.cc b/ucm/shared/metrics/cc/domain/metrics.cc index f426263ff..32e39962b 100644 --- a/ucm/shared/metrics/cc/domain/metrics.cc +++ b/ucm/shared/metrics/cc/domain/metrics.cc @@ -29,14 +29,14 @@ thread_local std::shared_ptr Metrics::threadBuffer_ = std::make_shared(); thread_local bool Metrics::isRegisteredThread_ = false; -std::atomic Metrics::isInited_{false}; -size_t Metrics::maxVectorLen_{10000}; - void Metrics::CreateStats(const std::string& name, const std::string& type) { - std::unique_lock lock(mutex_); + if (!isInited_.load(std::memory_order_acquire)) { + throw std::runtime_error("Please call SetUp() first!"); + } std::string typeUpper = type; std::transform(typeUpper.begin(), typeUpper.end(), typeUpper.begin(), ::toupper); + std::unique_lock lock(mutex_); if (statsType_.count(name)) { return; } else { diff --git a/ucm/shared/metrics/cc/domain/metrics.h b/ucm/shared/metrics/cc/domain/metrics.h index d69041500..e7e51d72a 100644 --- a/ucm/shared/metrics/cc/domain/metrics.h +++ b/ucm/shared/metrics/cc/domain/metrics.h @@ -35,7 +35,6 @@ #include #include #include - namespace UC::Metrics { struct MetricBuffer { struct InnerBuffer { @@ -74,13 +73,13 @@ class Metrics { public: static Metrics& GetInstance() { - if (!isInited_) { throw std::runtime_error("Please call SetUp() first!"); } static Metrics inst; return inst; } - static void SetUp(size_t maxVectorLen) + void SetUp(size_t maxVectorLen) { + std::unique_lock lock(mutex_); if (isInited_.load(std::memory_order_acquire)) { return; } bool expected = false; if (isInited_.compare_exchange_strong(expected, true, std::memory_order_release, @@ -113,8 +112,8 @@ class Metrics { Metrics() = default; Metrics(const Metrics&) = delete; Metrics& operator=(const Metrics&) = delete; - static std::atomic isInited_; - static size_t maxVectorLen_; + std::atomic isInited_{false}; + size_t maxVectorLen_{10000}; }; } // namespace UC::Metrics diff --git a/ucm/shared/test/case/metrics/metrics_test.cc b/ucm/shared/test/case/metrics/metrics_test.cc index 357a4606d..265dd03ba 100644 --- a/ucm/shared/test/case/metrics/metrics_test.cc +++ b/ucm/shared/test/case/metrics/metrics_test.cc @@ -35,7 +35,7 @@ class UCMetricsUT : public testing::Test { void SetUp() override { try { - Metrics::SetUp(1000000); + UC::Metrics::SetUp(1000000); CreateStats("stats1", "counter"); CreateStats("stats2", "gauge"); CreateStats("stats3", "histogram");