From 524406451f4dfa57bf3371fb85becdb56a2b309a Mon Sep 17 00:00:00 2001 From: Andrew Melnick Date: Mon, 23 Sep 2024 03:25:24 -0600 Subject: [PATCH] fix: Prevent data race from global metrics round-tripper (#13641) Signed-off-by: Andrew Melnick --- workflow/metrics/metrics_k8s_request.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/workflow/metrics/metrics_k8s_request.go b/workflow/metrics/metrics_k8s_request.go index 70fc46c29110..3294260823aa 100644 --- a/workflow/metrics/metrics_k8s_request.go +++ b/workflow/metrics/metrics_k8s_request.go @@ -38,15 +38,19 @@ func addK8sRequests(_ context.Context, m *Metrics) error { return err } +type metricsRoundTripperContext struct { + ctx context.Context + metrics *Metrics +} + type metricsRoundTripper struct { - ctx context.Context + *metricsRoundTripperContext roundTripper http.RoundTripper - metrics *Metrics } // This is a messy global as we need to register as a roundtripper before // we can instantiate metrics -var k8sMetrics metricsRoundTripper +var k8sMetrics metricsRoundTripperContext func (m metricsRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { startTime := time.Now() @@ -71,9 +75,7 @@ func AddMetricsTransportWrapper(ctx context.Context, config *rest.Config) *rest. if wrap != nil { rt = wrap(rt) } - k8sMetrics.ctx = ctx - k8sMetrics.roundTripper = rt - return &k8sMetrics + return &metricsRoundTripper{roundTripper: rt, metricsRoundTripperContext: &k8sMetrics} } return config }