From 6e0a4da2f6ab4eef5690b7423da38f527ac5b3e1 Mon Sep 17 00:00:00 2001 From: Ondra Kupka Date: Mon, 27 Oct 2025 11:32:24 +0100 Subject: [PATCH] controller/deployment: Improve goroutine mgmt Make sure all threads are terminated when Run returns. --- .../deployment/deployment_controller.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index 694b8196f4e..8c5412b868c 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -24,6 +24,7 @@ import ( "context" "fmt" "reflect" + "sync" "time" apps "k8s.io/api/apps/v1" @@ -167,20 +168,25 @@ func (dc *DeploymentController) Run(ctx context.Context, workers int) { dc.eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: dc.client.CoreV1().Events("")}) defer dc.eventBroadcaster.Shutdown() - defer dc.queue.ShutDown() - logger := klog.FromContext(ctx) logger.Info("Starting controller", "controller", "deployment") - defer logger.Info("Shutting down controller", "controller", "deployment") + + var wg sync.WaitGroup + defer func() { + logger.Info("Shutting down controller", "controller", "deployment") + dc.queue.ShutDown() + wg.Wait() + }() if !cache.WaitForNamedCacheSyncWithContext(ctx, dc.dListerSynced, dc.rsListerSynced, dc.podListerSynced) { return } for i := 0; i < workers; i++ { - go wait.UntilWithContext(ctx, dc.worker, time.Second) + wg.Go(func() { + wait.UntilWithContext(ctx, dc.worker, time.Second) + }) } - <-ctx.Done() }