From 3cc7f897d3dec55b87dc290d22e76f50139f59d7 Mon Sep 17 00:00:00 2001 From: Nick Khyl Date: Fri, 13 Feb 2026 12:51:51 -0600 Subject: [PATCH] health: always include control health messages in the current state (*health.Tracker).CurrentState() returns an empty state when there are no client-side warnables, even when there are control-health messages, which is incorrect. This fixes it. Updates tailscale/corp#37275 Signed-off-by: Nick Khyl --- health/state.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/health/state.go b/health/state.go index 91e30b75e..61d36797c 100644 --- a/health/state.go +++ b/health/state.go @@ -11,6 +11,7 @@ import ( "tailscale.com/feature/buildfeatures" "tailscale.com/tailcfg" + "tailscale.com/util/mak" ) // State contains the health status of the backend, and is @@ -128,11 +129,7 @@ func (t *Tracker) CurrentState() *State { t.mu.Lock() defer t.mu.Unlock() - if t.warnableVal == nil || len(t.warnableVal) == 0 { - return &State{} - } - - wm := map[WarnableCode]UnhealthyState{} + var wm map[WarnableCode]UnhealthyState for w, ws := range t.warnableVal { if !w.IsVisible(ws, t.now) { @@ -145,7 +142,7 @@ func (t *Tracker) CurrentState() *State { continue } state := w.unhealthyState(ws) - wm[w.Code] = state.withETag() + mak.Set(&wm, w.Code, state.withETag()) } for id, msg := range t.lastNotifiedControlMessages { @@ -165,7 +162,7 @@ func (t *Tracker) CurrentState() *State { } } - wm[state.WarnableCode] = state.withETag() + mak.Set(&wm, state.WarnableCode, state.withETag()) } return &State{