From 011db554e5e1be73577bd5b6a7028210dec28036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 26 Sep 2015 11:52:17 -0700 Subject: [PATCH 1/3] Simplify fake controller lock --- pkg/controller/framework/fake_controller_source.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/controller/framework/fake_controller_source.go b/pkg/controller/framework/fake_controller_source.go index d4b99bd096d..e590e231f98 100644 --- a/pkg/controller/framework/fake_controller_source.go +++ b/pkg/controller/framework/fake_controller_source.go @@ -37,7 +37,7 @@ func NewFakeControllerSource() *FakeControllerSource { // FakeControllerSource implements listing/watching for testing. type FakeControllerSource struct { - lock sync.RWMutex + sync.RWMutex items map[nnu]runtime.Object changes []watch.Event // one change per resourceVersion broadcaster *watch.Broadcaster @@ -95,8 +95,8 @@ func (f *FakeControllerSource) key(meta *api.ObjectMeta) nnu { // Change records the given event (setting the object's resource version) and // sends a watch event with the specified probability. func (f *FakeControllerSource) Change(e watch.Event, watchProbability float64) { - f.lock.Lock() - defer f.lock.Unlock() + f.Lock() + defer f.Unlock() objMeta, err := api.ObjectMetaFor(e.Object) if err != nil { @@ -121,8 +121,8 @@ func (f *FakeControllerSource) Change(e watch.Event, watchProbability float64) { // List returns a list object, with its resource version set. func (f *FakeControllerSource) List() (runtime.Object, error) { - f.lock.RLock() - defer f.lock.RUnlock() + f.RLock() + defer f.RUnlock() list := make([]runtime.Object, 0, len(f.items)) for _, obj := range f.items { // Must make a copy to allow clients to modify the object. @@ -151,8 +151,8 @@ func (f *FakeControllerSource) List() (runtime.Object, error) { // Watch returns a watch, which will be pre-populated with all changes // after resourceVersion. func (f *FakeControllerSource) Watch(resourceVersion string) (watch.Interface, error) { - f.lock.RLock() - defer f.lock.RUnlock() + f.RLock() + defer f.RUnlock() rc, err := strconv.Atoi(resourceVersion) if err != nil { return nil, err From 61e4eb4e1fa0abfd6259541ff0950b84c597402e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 26 Sep 2015 11:52:33 -0700 Subject: [PATCH 2/3] Proper format string for ints --- pkg/controller/framework/controller_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/framework/controller_test.go b/pkg/controller/framework/controller_test.go index d5fb51871fe..e1523790bb7 100644 --- a/pkg/controller/framework/controller_test.go +++ b/pkg/controller/framework/controller_test.go @@ -384,7 +384,7 @@ func TestUpdate(t *testing.T) { go func(name string, f func(string)) { defer wg.Done() f(name) - }(fmt.Sprintf("%v-%v", i, j), f) + }(fmt.Sprintf("%d-%d", i, j), f) } } wg.Wait() From fdd7322b38e95f170c8ce6a7b8844539bd1261ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 26 Sep 2015 11:52:44 -0700 Subject: [PATCH 3/3] Use DeleteDropWatch instead of Delete in test Using the latter resulted in receiving extra OnDelete event callbacks. Using DeleteDropWatch removed the flake. Fixes #14138. --- pkg/controller/framework/controller_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/controller/framework/controller_test.go b/pkg/controller/framework/controller_test.go index e1523790bb7..7adc169b30d 100644 --- a/pkg/controller/framework/controller_test.go +++ b/pkg/controller/framework/controller_test.go @@ -133,7 +133,7 @@ func ExampleInformer() { time.Millisecond*100, framework.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - source.Delete(obj.(runtime.Object)) + source.DeleteDropWatch(obj.(runtime.Object)) }, DeleteFunc: func(obj interface{}) { key, err := framework.DeletionHandlingMetaNamespaceKeyFunc(obj) @@ -327,7 +327,7 @@ func TestUpdate(t *testing.T) { if !allowedTransitions[pair{from, to}] { t.Errorf("observed transition %q -> %q for %v", from, to, n.Name) } - source.Delete(n) + source.DeleteDropWatch(n) }, DeleteFunc: func(obj interface{}) { testDoneWG.Done()