From 30f0fa95d931f24d6e3283ceefebc99d2c706df7 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 2 Oct 2024 08:16:43 -0700 Subject: [PATCH] control/controlclient: bound ReportHealthChange context lifetime to Direct client's Fixes #13651 Change-Id: I8154d3cc0ca40fe7a0223b26ae2e77e8d6ba874b Signed-off-by: Brad Fitzpatrick --- control/controlclient/direct.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index 072b43447..52bc01652 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -82,6 +82,8 @@ type Direct struct { onControlTime func(time.Time) // or nil onTailnetDefaultAutoUpdate func(bool) // or nil panicOnUse bool // if true, panic if client is used (for testing) + closedCtx context.Context // alive until Direct.Close is called + closeCtx context.CancelFunc // cancels closedCtx dialPlan ControlDialPlanner // can be nil @@ -303,6 +305,8 @@ func NewDirect(opts Options) (*Direct, error) { dnsCache: dnsCache, dialPlan: opts.DialPlan, } + c.closedCtx, c.closeCtx = context.WithCancel(context.Background()) + if opts.Hostinfo == nil { c.SetHostinfo(hostinfo.New()) } else { @@ -325,6 +329,8 @@ func NewDirect(opts Options) (*Direct, error) { // Close closes the underlying Noise connection(s). func (c *Direct) Close() error { + c.closeCtx() + c.mu.Lock() defer c.mu.Unlock() if c.noiseClient != nil { @@ -1628,7 +1634,7 @@ func (c *Direct) ReportHealthChange(w *health.Warnable, us *health.UnhealthyStat } // Best effort, no logging: - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + ctx, cancel := context.WithTimeout(c.closedCtx, 5*time.Second) defer cancel() res, err := np.post(ctx, "/machine/update-health", nodeKey, req) if err != nil {