Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 3f7e0b2

Browse files
author
zixuan.bai
committed
fix: arbiter tick goroutine leak
1 parent cf1acfc commit 3f7e0b2

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

meter.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ func NewMeter() Meter {
3838
return NilMeter{}
3939
}
4040
m := newStandardMeter()
41-
arbiter.Lock()
42-
defer arbiter.Unlock()
41+
arbiter.lock.Lock()
42+
defer arbiter.lock.Unlock()
4343
arbiter.meters[m] = struct{}{}
4444
if !arbiter.started {
4545
arbiter.started = true
@@ -145,9 +145,12 @@ func newStandardMeter() *StandardMeter {
145145
// Stop stops the meter, Mark() will be a no-op if you use it after being stopped.
146146
func (m *StandardMeter) Stop() {
147147
if atomic.CompareAndSwapUint32(&m.stopped, 0, 1) {
148-
arbiter.Lock()
148+
arbiter.lock.Lock()
149149
delete(arbiter.meters, m)
150-
arbiter.Unlock()
150+
if len(arbiter.meters) == 0 {
151+
arbiter.started = false
152+
}
153+
arbiter.lock.Unlock()
151154
}
152155
}
153156

@@ -224,7 +227,7 @@ func (m *StandardMeter) tick() {
224227
// meterArbiter ticks meters every 5s from a single goroutine.
225228
// meters are references in a set for future stopping.
226229
type meterArbiter struct {
227-
sync.RWMutex
230+
lock sync.RWMutex
228231
started bool
229232
meters map[*StandardMeter]struct{}
230233
ticker *time.Ticker
@@ -237,15 +240,18 @@ func (ma *meterArbiter) tick() {
237240
for {
238241
select {
239242
case <-ma.ticker.C:
240-
ma.tickMeters()
243+
if ma.tickMeters() {
244+
return
245+
}
241246
}
242247
}
243248
}
244249

245-
func (ma *meterArbiter) tickMeters() {
246-
ma.RLock()
247-
defer ma.RUnlock()
250+
func (ma *meterArbiter) tickMeters() bool {
251+
ma.lock.RLock()
252+
defer ma.lock.RUnlock()
248253
for meter := range ma.meters {
249254
meter.tick()
250255
}
256+
return !ma.started
251257
}

0 commit comments

Comments
 (0)