|
|
@@ -1,6 +1,8 @@
|
|
|
package metrics
|
|
|
|
|
|
import (
|
|
|
+ "math/rand"
|
|
|
+ "sync"
|
|
|
"testing"
|
|
|
"time"
|
|
|
)
|
|
|
@@ -23,6 +25,28 @@ func BenchmarkMeterParallel(b *testing.B) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+// exercise race detector
|
|
|
+func TestMeterConcurrency(t *testing.T) {
|
|
|
+ rand.Seed(time.Now().Unix())
|
|
|
+ ma := meterArbiter{
|
|
|
+ ticker: time.NewTicker(time.Millisecond),
|
|
|
+ meters: make(map[*StandardMeter]struct{}),
|
|
|
+ }
|
|
|
+ m := newStandardMeter()
|
|
|
+ ma.meters[m] = struct{}{}
|
|
|
+ go ma.tick()
|
|
|
+ wg := &sync.WaitGroup{}
|
|
|
+ reps := 100
|
|
|
+ for i := 0; i < reps; i++ {
|
|
|
+ wg.Add(1)
|
|
|
+ go func(m Meter, wg *sync.WaitGroup) {
|
|
|
+ m.Mark(1)
|
|
|
+ wg.Done()
|
|
|
+ }(m, wg)
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+}
|
|
|
+
|
|
|
func TestGetOrRegisterMeter(t *testing.T) {
|
|
|
r := NewRegistry()
|
|
|
NewRegisteredMeter("foo", r).Mark(47)
|