From d85a0e4e347371fb60d2e3536a1995cee68d27c3 Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Fri, 3 Mar 2023 13:37:10 +0800 Subject: [PATCH] moving_filter: fix data race with cache result (#6080) ref tikv/pd#5798, close tikv/pd#6069 Signed-off-by: lhy1024 Co-authored-by: Ti Chi Robot --- pkg/movingaverage/median_filter.go | 45 +++++++++++------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/pkg/movingaverage/median_filter.go b/pkg/movingaverage/median_filter.go index 7041ae53b29..fa499da0dda 100644 --- a/pkg/movingaverage/median_filter.go +++ b/pkg/movingaverage/median_filter.go @@ -23,20 +23,18 @@ type MedianFilter struct { // It is not thread safe to read and write records at the same time. // If there are concurrent read and write, the read may get an old value. // And we should avoid concurrent write. - records []float64 - size uint64 - count uint64 - isUpdated bool - result float64 + records []float64 + size uint64 + count uint64 + result float64 } // NewMedianFilter returns a MedianFilter. func NewMedianFilter(size int) *MedianFilter { return &MedianFilter{ - records: make([]float64, size), - size: uint64(size), - isUpdated: false, - result: 0, + records: make([]float64, size), + size: uint64(size), + result: 0, } } @@ -44,37 +42,29 @@ func NewMedianFilter(size int) *MedianFilter { func (r *MedianFilter) Add(n float64) { r.records[r.count%r.size] = n r.count++ - r.isUpdated = true -} - -// Get returns the median of the data set. -func (r *MedianFilter) Get() float64 { - if !r.isUpdated { - return r.result - } - if r.count == 0 { - return 0 - } records := r.records if r.count < r.size { records = r.records[:r.count] } r.result = pie.Median(records) - r.isUpdated = false +} + +// Get returns the median of the data set. +func (r *MedianFilter) Get() float64 { return r.result } // Reset cleans the data set. func (r *MedianFilter) Reset() { r.count = 0 - r.isUpdated = true + r.result = 0 } // Set = Reset + Add. func (r *MedianFilter) Set(n float64) { r.records[0] = n r.count = 1 - r.isUpdated = true + r.result = n } // GetInstantaneous returns the value just added. @@ -87,10 +77,9 @@ func (r *MedianFilter) Clone() *MedianFilter { records := make([]float64, len(r.records)) copy(records, r.records) return &MedianFilter{ - records: records, - size: r.size, - count: r.count, - isUpdated: r.isUpdated, - result: r.result, + records: records, + size: r.size, + count: r.count, + result: r.result, } }