mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-01-07 19:31:51 +08:00
Cherry-pick from master pr: #44789 This commit addresses issue #44788 where the `datacoord_stored_binlog_size` metric could become inaccurate when multiple concurrent `GetMetrics` calls arrived at DataCoord. ### Problem The original implementation called `Reset()` followed by `Add()` operations on Prometheus metrics within the `GetQuotaInfo()` method. When multiple goroutines invoked this method concurrently, race conditions occurred: - Thread 1: Reset() → Add(value1) - Thread 2: Reset() → Add(value2) - Result: Metrics could be reset multiple times and values added in an interleaved fashion, leading to inaccurate and inflated metric values ### Solution Changed the approach from `Reset() + Add()` to aggregating metric values in local maps first, then using `Set()` to update metrics atomically: 1. Collect segment size data into local maps: - `storedBinlogSize`: tracks size per collection per segment state - `binlogFileSize`: tracks total file count per collection - `coll2DbName`: maps collection IDs to database names 2. After aggregation is complete, use `Set()` (instead of `Add()`) to update metrics in a single operation per label combination This ensures that concurrent `GetMetrics` calls don't interfere with each other, as each invocation works with its own local state and only updates the final metric value atomically. --------- --------- Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>