From 9d1d607fcd221d42633a59601c4f388a77f8ad74 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 27 Jun 2025 10:53:19 +0000 Subject: [PATCH] fix(agent/agentcontainers): ensure proper channel closure for updateTrigger --- agent/agentcontainers/api.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/agent/agentcontainers/api.go b/agent/agentcontainers/api.go index 26ebafd660fb1..bdf7b79bc1775 100644 --- a/agent/agentcontainers/api.go +++ b/agent/agentcontainers/api.go @@ -422,12 +422,17 @@ func (api *API) updaterLoop() { // advancing the clock. ticker := api.clock.TickerFunc(api.ctx, api.updateInterval, func() error { done := make(chan error, 1) - defer close(done) - + var sent bool + defer func() { + if !sent { + close(done) + } + }() select { case <-api.ctx.Done(): return api.ctx.Err() case api.updateTrigger <- done: + sent = true err := <-done if err != nil { if errors.Is(err, context.Canceled) { @@ -456,6 +461,7 @@ func (api *API) updaterLoop() { // Note that although we pass api.ctx here, updateContainers // has an internal timeout to prevent long blocking calls. done <- api.updateContainers(api.ctx) + close(done) } } } @@ -800,12 +806,19 @@ func (api *API) RefreshContainers(ctx context.Context) (err error) { }() done := make(chan error, 1) + var sent bool + defer func() { + if !sent { + close(done) + } + }() select { case <-api.ctx.Done(): return xerrors.Errorf("API closed: %w", api.ctx.Err()) case <-ctx.Done(): return ctx.Err() case api.updateTrigger <- done: + sent = true select { case <-api.ctx.Done(): return xerrors.Errorf("API closed: %w", api.ctx.Err())