diff --git a/test/e2e/density.go b/test/e2e/density.go index c90bf570b0c..1b31f0fb179 100644 --- a/test/e2e/density.go +++ b/test/e2e/density.go @@ -211,6 +211,8 @@ var _ = Describe("Density [Skipped]", func() { } // Create a listener for events. + // eLock is a lock protects the events + var eLock sync.Mutex events := make([](*api.Event), 0) _, controller := controllerframework.NewInformer( &cache.ListWatch{ @@ -225,6 +227,8 @@ var _ = Describe("Density [Skipped]", func() { 0, controllerframework.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { + eLock.Lock() + defer eLock.Unlock() events = append(events, obj.(*api.Event)) }, }, @@ -232,6 +236,34 @@ var _ = Describe("Density [Skipped]", func() { stop := make(chan struct{}) go controller.Run(stop) + // Create a listener for api updates + // uLock is a lock protects the updateCount + var uLock sync.Mutex + updateCount := 0 + label := labels.SelectorFromSet(labels.Set(map[string]string{"name": RCName})) + _, updateController := controllerframework.NewInformer( + &cache.ListWatch{ + ListFunc: func(options api.ListOptions) (runtime.Object, error) { + options.LabelSelector = label + return c.Pods(ns).List(options) + }, + WatchFunc: func(options api.ListOptions) (watch.Interface, error) { + options.LabelSelector = label + return c.Pods(ns).Watch(options) + }, + }, + &api.Pod{}, + 0, + controllerframework.ResourceEventHandlerFuncs{ + UpdateFunc: func(_, _ interface{}) { + uLock.Lock() + defer uLock.Unlock() + updateCount++ + }, + }, + ) + go updateController.Run(stop) + // Start the replication controller. startTime := time.Now() expectNoError(RunRC(config)) @@ -241,10 +273,22 @@ var _ = Describe("Density [Skipped]", func() { By("Waiting for all events to be recorded") last := -1 current := len(events) + lastCount := -1 + currentCount := updateCount timeout := 10 * time.Minute - for start := time.Now(); last < current && time.Since(start) < timeout; time.Sleep(10 * time.Second) { - last = current - current = len(events) + for start := time.Now(); (last < current || lastCount < currentCount) && time.Since(start) < timeout; time.Sleep(10 * time.Second) { + func() { + eLock.Lock() + defer eLock.Unlock() + last = current + current = len(events) + }() + func() { + uLock.Lock() + defer uLock.Unlock() + lastCount = currentCount + currentCount = updateCount + }() } close(stop) @@ -252,6 +296,10 @@ var _ = Describe("Density [Skipped]", func() { Logf("Warning: Not all events were recorded after waiting %.2f minutes", timeout.Minutes()) } Logf("Found %d events", current) + if currentCount != lastCount { + Logf("Warning: Not all updates were recorded after waiting %.2f minutes", timeout.Minutes()) + } + Logf("Found %d updates", currentCount) // Tune the threshold for allowed failures. badEvents := BadEvents(events)