diff --git a/pkg/controller/garbagecollector/garbagecollector.go b/pkg/controller/garbagecollector/garbagecollector.go index d9306331e6..2b675d4774 100644 --- a/pkg/controller/garbagecollector/garbagecollector.go +++ b/pkg/controller/garbagecollector/garbagecollector.go @@ -125,6 +125,10 @@ func (gc *GarbageCollector) Run(workers int, stopCh <-chan struct{}) { glog.Infof("Garbage Collector: Shutting down") } +func (gc *GarbageCollector) HasSynced() bool { + return gc.dependencyGraphBuilder.HasSynced() +} + func (gc *GarbageCollector) runAttemptToDeleteWorker() { for gc.attemptToDeleteWorker() { } diff --git a/test/integration/garbagecollector/garbage_collector_test.go b/test/integration/garbagecollector/garbage_collector_test.go index 8d6806adf5..d9c806c40d 100644 --- a/test/integration/garbagecollector/garbage_collector_test.go +++ b/test/integration/garbagecollector/garbage_collector_test.go @@ -37,6 +37,7 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" restclient "k8s.io/client-go/rest" + "k8s.io/client-go/tools/cache" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" @@ -607,7 +608,7 @@ func TestBlockingOwnerRefDoesBlock(t *testing.T) { s, gc, clientSet := setup(t) defer s.Close() - ns := framework.CreateTestingNamespace("gc-foreground2", s, t) + ns := framework.CreateTestingNamespace("gc-foreground3", s, t) defer framework.DeleteTestingNamespace(ns, s, t) podClient := clientSet.Core().Pods(ns.Name) @@ -632,6 +633,19 @@ func TestBlockingOwnerRefDoesBlock(t *testing.T) { go gc.Run(5, stopCh) defer close(stopCh) + // this makes sure the garbage collector will have added the pod to its + // dependency graph before handling the foreground deletion of the rc. + timeout := make(chan struct{}) + go func() { + select { + case <-time.After(5 * time.Second): + close(timeout) + } + }() + if !cache.WaitForCacheSync(timeout, gc.HasSynced) { + t.Fatalf("failed to wait for garbage collector to be synced") + } + err = rcClient.Delete(toBeDeletedRCName, getForegroundOptions()) if err != nil { t.Fatalf("Failed to delete the rc: %v", err)