diff --git a/pkg/controller/framework/informers/factory.go b/pkg/controller/framework/informers/factory.go index 850b42af00e..d3292535788 100644 --- a/pkg/controller/framework/informers/factory.go +++ b/pkg/controller/framework/informers/factory.go @@ -46,15 +46,20 @@ type sharedInformerFactory struct { client clientset.Interface lock sync.Mutex defaultResync time.Duration - informers map[reflect.Type]framework.SharedIndexInformer + + informers map[reflect.Type]framework.SharedIndexInformer + // startedInformers is used for tracking which informers have been started + // this allows calling of Start method multiple times + startedInformers map[reflect.Type]bool } // NewSharedInformerFactory constructs a new instance of sharedInformerFactory func NewSharedInformerFactory(client clientset.Interface, defaultResync time.Duration) SharedInformerFactory { return &sharedInformerFactory{ - client: client, - defaultResync: defaultResync, - informers: make(map[reflect.Type]framework.SharedIndexInformer), + client: client, + defaultResync: defaultResync, + informers: make(map[reflect.Type]framework.SharedIndexInformer), + startedInformers: make(map[reflect.Type]bool), } } @@ -63,8 +68,11 @@ func (s *sharedInformerFactory) Start(stopCh <-chan struct{}) { s.lock.Lock() defer s.lock.Unlock() - for _, informer := range s.informers { - go informer.Run(stopCh) + for informerType, informer := range s.informers { + if !s.startedInformers[informerType] { + go informer.Run(stopCh) + s.startedInformers[informerType] = true + } } }