Add lock semantics around dev_mode.IsEnabled to avoid data races (#42646)

Add lock semantics around dev_mode.IsEnabled to as a fix for
[this](https://github.com/fleetdm/fleet/actions/runs/23728512273) data
race
This commit is contained in:
Juan Fernandez 2026-03-31 07:49:45 -04:00 committed by GitHub
parent c75e5d85c0
commit 85c8d050d0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2,19 +2,32 @@ package dev_mode
import (
"os"
"sync"
"testing"
)
// IsEnabled should be configured once at process startup (e.g., via flags) and then treated as read-only.
// It must not be written from concurrent goroutines; SetOverride only affects enabledViaOverride/env overrides.
var IsEnabled bool
// enabledViaOverride is set by SetOverride and protected by mu so that it is
// always observed consistently with envOverrides.
var enabledViaOverride bool
var mu sync.RWMutex
var envOverrides = map[string]string{}
type GetEnv func(name string) string
func Env(name string) string {
if !IsEnabled {
mu.RLock()
defer mu.RUnlock()
if !IsEnabled && !enabledViaOverride {
return ""
}
if override, ok := envOverrides[name]; ok {
return override
}
@ -30,14 +43,24 @@ func SetOverride(name string, value string, cleanup ...*testing.T) { // optional
})
}
IsEnabled = true // if we're setting overrides, we're in a test environment so want to turn dev mode on
mu.Lock()
defer mu.Unlock()
enabledViaOverride = true // if we're setting overrides, we're in a test environment so want to turn dev mode on
envOverrides[name] = value
}
func ClearOverride(name string) {
mu.Lock()
defer mu.Unlock()
delete(envOverrides, name)
}
func ClearAllOverrides() {
mu.Lock()
defer mu.Unlock()
enabledViaOverride = false
envOverrides = map[string]string{}
}