Parcourir la source

health: fix data race in new warnable code

Fixes #12479

Change-Id: Ice84d5eb12d835eeddf6fc8cc337ea6b4dddcf6c
Signed-off-by: Brad Fitzpatrick <[email protected]>
Brad Fitzpatrick il y a 1 an
Parent
commit
7bc9d453c2
1 fichiers modifiés avec 15 ajouts et 10 suppressions
  1. 15 10
      health/health.go

+ 15 - 10
health/health.go

@@ -124,15 +124,8 @@ const (
 
 var subsystemsWarnables = map[Subsystem]*Warnable{}
 
-const legacyErrorArgKey = "LegacyError"
-
-// Warnable() returns a Warnable representing a legacy Subsystem. This is used
-// *temporarily* while we migrate the old health infrastructure based on
-// Subsystems to the new Warnables architecture.
-func (s Subsystem) Warnable() *Warnable {
-	if w, ok := subsystemsWarnables[s]; ok {
-		return w
-	} else {
+func init() {
+	for _, s := range []Subsystem{SysRouter, SysDNS, SysDNSOS, SysDNSManager, SysTKA} {
 		w := Register(&Warnable{
 			Code:     WarnableCode(s),
 			Severity: SeverityMedium,
@@ -141,10 +134,22 @@ func (s Subsystem) Warnable() *Warnable {
 			},
 		})
 		subsystemsWarnables[s] = w
-		return w
 	}
 }
 
+const legacyErrorArgKey = "LegacyError"
+
+// Warnable returns a Warnable representing a legacy Subsystem. This is used
+// temporarily (2024-06-14) while we migrate the old health infrastructure based
+// on Subsystems to the new Warnables architecture.
+func (s Subsystem) Warnable() *Warnable {
+	w, ok := subsystemsWarnables[s]
+	if !ok {
+		panic(fmt.Sprintf("health: no Warnable for Subsystem %q", s))
+	}
+	return w
+}
+
 var registeredWarnables = map[WarnableCode]*Warnable{}
 
 // Register registers a new Warnable with the health package and returns it.