From 05696cfea1f1dbb4409191411d738d44a426892d Mon Sep 17 00:00:00 2001 From: Connor Doyle Date: Tue, 14 Mar 2017 15:25:55 -0700 Subject: [PATCH] Add sync barrier to event obs helper. - This change should guarantee that in observeEventAfterAction, the action is only executed after the informer begins watching the event stream. --- test/e2e/common/events.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/e2e/common/events.go b/test/e2e/common/events.go index b8e03c0f566..aa1192eb36f 100644 --- a/test/e2e/common/events.go +++ b/test/e2e/common/events.go @@ -50,10 +50,10 @@ func ObserveNodeUpdateAfterAction(f *framework.Framework, nodeName string, nodeP return ls, err }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + // Signal parent goroutine that watching has begun. + defer informerStartedGuard.Do(func() { close(informerStartedChan) }) options.FieldSelector = nodeSelector.String() w, err := f.ClientSet.Core().Nodes().Watch(options) - // Signal parent goroutine that watching has begun. - informerStartedGuard.Do(func() { close(informerStartedChan) }) return w, err }, }, @@ -96,6 +96,8 @@ func ObserveNodeUpdateAfterAction(f *framework.Framework, nodeName string, nodeP // after performing the supplied action. func ObserveEventAfterAction(f *framework.Framework, eventPredicate func(*v1.Event) bool, action func() error) (bool, error) { observedMatchingEvent := false + informerStartedChan := make(chan struct{}) + var informerStartedGuard sync.Once // Create an informer to list/watch events from the test framework namespace. _, controller := cache.NewInformer( @@ -105,6 +107,8 @@ func ObserveEventAfterAction(f *framework.Framework, eventPredicate func(*v1.Eve return ls, err }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + // Signal parent goroutine that watching has begun. + defer informerStartedGuard.Do(func() { close(informerStartedChan) }) w, err := f.ClientSet.Core().Events(f.Namespace.Name).Watch(options) return w, err }, @@ -123,9 +127,11 @@ func ObserveEventAfterAction(f *framework.Framework, eventPredicate func(*v1.Eve }, ) + // Start the informer and block this goroutine waiting for the started signal. informerStopChan := make(chan struct{}) defer func() { close(informerStopChan) }() go controller.Run(informerStopChan) + <-informerStartedChan // Invoke the action function. err := action()