From 57f010227b1a41787ae1dd8b37aa1007aa588140 Mon Sep 17 00:00:00 2001 From: Alvaro Aleman Date: Sat, 10 Dec 2022 16:48:43 -0500 Subject: [PATCH] :bug: Prevent manager from getting started a second time --- pkg/manager/internal.go | 2 ++ pkg/manager/manager_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/pkg/manager/internal.go b/pkg/manager/internal.go index 073d252718..3e79f50bbd 100644 --- a/pkg/manager/internal.go +++ b/pkg/manager/internal.go @@ -409,6 +409,8 @@ func (cm *controllerManager) Start(ctx context.Context) (err error) { cm.Unlock() return errors.New("manager already started") } + cm.started = true + var ready bool defer func() { // Only unlock the manager if we haven't reached diff --git a/pkg/manager/manager_test.go b/pkg/manager/manager_test.go index 6b01d48293..7a33940017 100644 --- a/pkg/manager/manager_test.go +++ b/pkg/manager/manager_test.go @@ -1492,6 +1492,30 @@ var _ = Describe("manger.Manager", func() { Expect(err).NotTo(HaveOccurred()) Expect(m.Add(&failRec{})).To(HaveOccurred()) }) + + It("should fail if attempted to start a second time", func() { + m, err := New(cfg, Options{}) + Expect(err).NotTo(HaveOccurred()) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go func() { + defer GinkgoRecover() + Expect(m.Start(ctx)).NotTo(HaveOccurred()) + }() + // Wait for the Manager to start + Eventually(func() bool { + mgr, ok := m.(*controllerManager) + Expect(ok).To(BeTrue()) + return mgr.runnables.Caches.Started() + }).Should(BeTrue()) + + err = m.Start(ctx) + Expect(err).ToNot(BeNil()) + Expect(err.Error()).To(Equal("manager already started")) + Expect(m.Start(ctx)).To(HaveOccurred()) + + }) }) Describe("SetFields", func() { It("should inject field values", func() {