Skip to content

Commit 96826f6

Browse files
committed
🐛 Fix race when adding runnable
1 parent b88347b commit 96826f6

File tree

2 files changed

+32
-26
lines changed

2 files changed

+32
-26
lines changed

pkg/manager/internal.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -288,19 +288,7 @@ func (cm *controllerManager) startNonLeaderElectionRunnables() {
288288
cm.mu.Lock()
289289
defer cm.mu.Unlock()
290290

291-
// Start the Cache. Allow the function to start the cache to be mocked out for testing
292-
if cm.startCache == nil {
293-
cm.startCache = cm.cache.Start
294-
}
295-
go func() {
296-
if err := cm.startCache(cm.internalStop); err != nil {
297-
cm.errChan <- err
298-
}
299-
}()
300-
301-
// Wait for the caches to sync.
302-
// TODO(community): Check the return value and write a test
303-
cm.cache.WaitForCacheSync(cm.internalStop)
291+
cm.waitForCache()
304292

305293
// Start the non-leaderelection Runnables after the cache has synced
306294
for _, c := range cm.nonLeaderElectionRunnables {
@@ -311,14 +299,13 @@ func (cm *controllerManager) startNonLeaderElectionRunnables() {
311299
cm.errChan <- ctrl.Start(cm.internalStop)
312300
}()
313301
}
314-
315-
cm.started = true
316302
}
317303

318304
func (cm *controllerManager) startLeaderElectionRunnables() {
319-
// Wait for the caches to sync.
320-
// TODO(community): Check the return value and write a test
321-
cm.cache.WaitForCacheSync(cm.internalStop)
305+
cm.mu.Lock()
306+
defer cm.mu.Unlock()
307+
308+
cm.waitForCache()
322309

323310
// Start the leader election Runnables after the cache has synced
324311
for _, c := range cm.leaderElectionRunnables {
@@ -329,7 +316,26 @@ func (cm *controllerManager) startLeaderElectionRunnables() {
329316
cm.errChan <- ctrl.Start(cm.internalStop)
330317
}()
331318
}
319+
}
320+
321+
func (cm *controllerManager) waitForCache() {
322+
if cm.started {
323+
return
324+
}
332325

326+
// Start the Cache. Allow the function to start the cache to be mocked out for testing
327+
if cm.startCache == nil {
328+
cm.startCache = cm.cache.Start
329+
}
330+
go func() {
331+
if err := cm.startCache(cm.internalStop); err != nil {
332+
cm.errChan <- err
333+
}
334+
}()
335+
336+
// Wait for the caches to sync.
337+
// TODO(community): Check the return value and write a test
338+
cm.cache.WaitForCacheSync(cm.internalStop)
333339
cm.started = true
334340
}
335341

pkg/manager/manager_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,15 @@ var _ = Describe("manger.Manager", func() {
206206
Expect(err).NotTo(HaveOccurred())
207207
c1 := make(chan struct{})
208208
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
209-
defer close(c1)
210209
defer GinkgoRecover()
210+
close(c1)
211211
return nil
212212
}))).To(Succeed())
213213

214214
c2 := make(chan struct{})
215215
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
216-
defer close(c2)
217216
defer GinkgoRecover()
217+
close(c2)
218218
return nil
219219
}))).To(Succeed())
220220

@@ -257,21 +257,21 @@ var _ = Describe("manger.Manager", func() {
257257
c1 := make(chan struct{})
258258
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
259259
defer GinkgoRecover()
260-
defer close(c1)
260+
close(c1)
261261
return nil
262262
}))).To(Succeed())
263263

264264
c2 := make(chan struct{})
265265
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
266266
defer GinkgoRecover()
267-
defer close(c2)
267+
close(c2)
268268
return fmt.Errorf("expected error")
269269
}))).To(Succeed())
270270

271271
c3 := make(chan struct{})
272272
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
273273
defer GinkgoRecover()
274-
defer close(c3)
274+
close(c3)
275275
return nil
276276
}))).To(Succeed())
277277

@@ -441,8 +441,8 @@ var _ = Describe("manger.Manager", func() {
441441
// Add one component before starting
442442
c1 := make(chan struct{})
443443
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
444-
defer close(c1)
445444
defer GinkgoRecover()
445+
close(c1)
446446
return nil
447447
}))).To(Succeed())
448448

@@ -457,8 +457,8 @@ var _ = Describe("manger.Manager", func() {
457457
// Add another component after starting
458458
c2 := make(chan struct{})
459459
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
460-
defer close(c2)
461460
defer GinkgoRecover()
461+
close(c2)
462462
return nil
463463
}))).To(Succeed())
464464
<-c1
@@ -483,8 +483,8 @@ var _ = Describe("manger.Manager", func() {
483483

484484
c1 := make(chan struct{})
485485
Expect(m.Add(RunnableFunc(func(s <-chan struct{}) error {
486-
defer close(c1)
487486
defer GinkgoRecover()
487+
close(c1)
488488
return nil
489489
}))).To(Succeed())
490490
<-c1

0 commit comments

Comments
 (0)