From d2db6af2e03024940beb7e4248ec5e2638ba2b2f Mon Sep 17 00:00:00 2001 From: Nikolai Vladimirov Date: Wed, 11 Sep 2024 04:55:46 +0300 Subject: [PATCH] fix(metrics): fix race condition in metrics.Init() IterationMetricsEnabled can be concurrently set ``` ================== WARNING: DATA RACE Write at 0x00c000124098 by goroutine 12: github.com/form3tech-oss/f1/v2/internal/metrics.Init() /Users/nikolayvladimirov/go/src/github.com/form3tech-oss/f1/internal/metrics/metrics.go:82 +0x7c github.com/form3tech-oss/f1/v2/internal/metrics_test.TestMetrics_Init_IsSafe.func1() /Users/nikolayvladimirov/go/src/github.com/form3tech-oss/f1/internal/metrics/metrics_test.go:15 +0x20 Previous write at 0x00c000124098 by goroutine 14: github.com/form3tech-oss/f1/v2/internal/metrics.Init() /Users/nikolayvladimirov/go/src/github.com/form3tech-oss/f1/internal/metrics/metrics.go:82 +0x7c github.com/form3tech-oss/f1/v2/internal/metrics_test.TestMetrics_Init_IsSafe.func1() /Users/nikolayvladimirov/go/src/github.com/form3tech-oss/f1/internal/metrics/metrics_test.go:15 +0x20 Goroutine 12 (running) created at: github.com/form3tech-oss/f1/v2/internal/metrics_test.TestMetrics_Init_IsSafe() /Users/nikolayvladimirov/go/src/github.com/form3tech-oss/f1/internal/metrics/metrics_test.go:14 +0xa4 testing.tRunner() /opt/homebrew/Cellar/go/1.23.1/libexec/src/testing/testing.go:1690 +0x184 testing.(*T).Run.gowrap1() /opt/homebrew/Cellar/go/1.23.1/libexec/src/testing/testing.go:1743 +0x40 Goroutine 14 (finished) created at: github.com/form3tech-oss/f1/v2/internal/metrics_test.TestMetrics_Init_IsSafe() /Users/nikolayvladimirov/go/src/github.com/form3tech-oss/f1/internal/metrics/metrics_test.go:14 +0xa4 testing.tRunner() /opt/homebrew/Cellar/go/1.23.1/libexec/src/testing/testing.go:1690 +0x184 testing.(*T).Run.gowrap1() /opt/homebrew/Cellar/go/1.23.1/libexec/src/testing/testing.go:1743 +0x40 ``` --- internal/metrics/metrics.go | 1 - internal/metrics/metrics_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 internal/metrics/metrics_test.go diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index c5f607f6..f581d569 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -79,7 +79,6 @@ func Init(iterationMetricsEnabled bool) { } m = NewInstance(defaultRegistry, iterationMetricsEnabled) }) - m.IterationMetricsEnabled = iterationMetricsEnabled } func Instance() *Metrics { diff --git a/internal/metrics/metrics_test.go b/internal/metrics/metrics_test.go new file mode 100644 index 00000000..abd6aab1 --- /dev/null +++ b/internal/metrics/metrics_test.go @@ -0,0 +1,24 @@ +package metrics_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/form3tech-oss/f1/v2/internal/metrics" +) + +func TestMetrics_Init_IsSafe(t *testing.T) { + t.Parallel() + + metrics.Init(true) + + // race detector assertion + for range 10 { + go func() { + metrics.Init(false) + }() + } + + assert.True(t, metrics.Instance().IterationMetricsEnabled) +}