diff --git a/pkg/controller/volume/selinuxwarning/selinux_warning_controller.go b/pkg/controller/volume/selinuxwarning/selinux_warning_controller.go index 560579ec463..7e9d0e01ccf 100644 --- a/pkg/controller/volume/selinuxwarning/selinux_warning_controller.go +++ b/pkg/controller/volume/selinuxwarning/selinux_warning_controller.go @@ -20,6 +20,7 @@ import ( "context" "errors" "fmt" + "sync" "time" v1 "k8s.io/api/core/v1" @@ -343,10 +344,16 @@ func (c *Controller) enqueueAllPodsForCSIDriver(csiDriverName string) { func (c *Controller) Run(ctx context.Context, workers int) { defer utilruntime.HandleCrash() - defer c.queue.ShutDown() + logger := klog.FromContext(ctx) logger.Info("Starting SELinux warning controller") - defer logger.Info("Shutting down SELinux warning controller") + + var wg sync.WaitGroup + defer func() { + logger.Info("Shutting down SELinux warning controller") + c.queue.ShutDown() + wg.Wait() + }() c.eventBroadcaster.StartStructuredLogging(3) // verbosity level 3 is used by the other KCM controllers c.eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: c.kubeClient.CoreV1().Events("")}) @@ -357,9 +364,10 @@ func (c *Controller) Run(ctx context.Context, workers int) { } for i := 0; i < workers; i++ { - go wait.UntilWithContext(ctx, c.runWorker, time.Second) + wg.Go(func() { + wait.UntilWithContext(ctx, c.runWorker, time.Second) + }) } - <-ctx.Done() } diff --git a/pkg/controller/volume/selinuxwarning/selinux_warning_controller_test.go b/pkg/controller/volume/selinuxwarning/selinux_warning_controller_test.go index 3f863cac8ab..cd61f20f36b 100644 --- a/pkg/controller/volume/selinuxwarning/selinux_warning_controller_test.go +++ b/pkg/controller/volume/selinuxwarning/selinux_warning_controller_test.go @@ -17,8 +17,10 @@ limitations under the License. package selinuxwarning import ( + "context" "reflect" "sort" + "sync" "testing" v1 "k8s.io/api/core/v1" @@ -355,7 +357,12 @@ func TestSELinuxWarningController_Sync(t *testing.T) { t.Run(tt.name, func(t *testing.T) { featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.SELinuxChangePolicy, true) + var wg sync.WaitGroup + defer wg.Wait() _, ctx := ktesting.NewTestContext(t) + ctx, cancel := context.WithCancel(ctx) + defer cancel() + _, plugin := volumetesting.GetTestKubeletVolumePluginMgr(t) plugin.SupportsSELinux = true @@ -393,7 +400,9 @@ func TestSELinuxWarningController_Sync(t *testing.T) { fakeInformerFactory.Start(ctx.Done()) fakeInformerFactory.WaitForCacheSync(ctx.Done()) // Start the controller - go c.Run(ctx, 1) + wg.Go(func() { + c.Run(ctx, 1) + }) // Inject fake existing objects for _, pvc := range tt.existingPVCs {