From 1744e4eb4d8374f945381672572fa0cf56362d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E7=8E=AE=E6=96=87?= Date: Mon, 19 Aug 2024 10:13:10 +0800 Subject: [PATCH] util/slowset: fix data race Reported by `go test -race`. Also use time.Ticker to response faster to stopCh. Fixes: 99cf66fd7606604ac3dd101b6a8141d9ff9a1366 --- pkg/util/slowset.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pkg/util/slowset.go b/pkg/util/slowset.go index b9aa9cef..7e8c9721 100644 --- a/pkg/util/slowset.go +++ b/pkg/util/slowset.go @@ -81,18 +81,25 @@ func (s *SlowSet) TimeRemaining(key string) time.Duration { return 0 } +func (s *SlowSet) removeAllExpired() { + s.Lock() + defer s.Unlock() + for key, t := range s.workSet { + if time.Since(t) > s.retentionTime { + delete(s.workSet, key) + } + } +} + func (s *SlowSet) Run(stopCh <-chan struct{}) { + ticker := time.NewTicker(s.resyncPeriod) + defer ticker.Stop() for { select { case <-stopCh: return - default: - time.Sleep(s.resyncPeriod) - for key, t := range s.workSet { - if time.Since(t) > s.retentionTime { - s.Remove(key) - } - } + case <-ticker.C: + s.removeAllExpired() } } }