metrics: make meterticker.remove end ticker loop

This commit is contained in:
Jared Wasinger 2025-01-14 16:51:48 +08:00
parent 864e717b56
commit 5f2bc05c49

View file

@ -124,7 +124,7 @@ func (m *Meter) tick() {
m.a15.tick()
}
var arbiter = meterTicker{meters: make(map[*Meter]struct{})}
var arbiter = meterTicker{meters: make(map[*Meter]struct{}), stopCh: make(chan struct{})}
// meterTicker ticks meters every 5s from a single goroutine.
// meters are references in a set for future stopping.
@ -133,6 +133,7 @@ type meterTicker struct {
started bool
meters map[*Meter]struct{}
stopCh chan struct{}
}
// add adds another *Meter ot the arbiter, and starts the arbiter ticker.
@ -149,6 +150,7 @@ func (ma *meterTicker) add(m *Meter) {
// remove removes a meter from the set of ticked meters.
func (ma *meterTicker) remove(m *Meter) {
ma.mu.Lock()
close(ma.stopCh)
delete(ma.meters, m)
ma.mu.Unlock()
}
@ -156,7 +158,10 @@ func (ma *meterTicker) remove(m *Meter) {
// loop ticks meters on a 5 second interval.
func (ma *meterTicker) loop() {
ticker := time.NewTicker(5 * time.Second)
for range ticker.C {
for {
select {
case <-ticker.C:
if !metricsEnabled {
continue
}
@ -165,5 +170,8 @@ func (ma *meterTicker) loop() {
meter.tick()
}
ma.mu.RUnlock()
case <-ma.stopCh:
return
}
}
}