@@ -3,11 +3,13 @@ package factory
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "reflect"
6
7
"time"
7
8
8
9
"github.com/robfig/cron"
9
10
"k8s.io/apimachinery/pkg/runtime"
10
11
errorutil "k8s.io/apimachinery/pkg/util/errors"
12
+ "k8s.io/apimachinery/pkg/util/sets"
11
13
"k8s.io/client-go/tools/cache"
12
14
13
15
"github.com/openshift/library-go/pkg/operator/events"
@@ -245,6 +247,11 @@ func (f *Factory) WithControllerInstanceName(controllerInstanceName string) *Fac
245
247
return f
246
248
}
247
249
250
+ type informerHandleTuple struct {
251
+ informer Informer
252
+ filter uintptr
253
+ }
254
+
248
255
// Controller produce a runnable controller.
249
256
func (f * Factory ) ToController (name string , eventRecorder events.Recorder ) Controller {
250
257
if f .sync == nil {
@@ -286,19 +293,37 @@ func (f *Factory) ToController(name string, eventRecorder events.Recorder) Contr
286
293
cacheSyncTimeout : defaultCacheSyncTimeout ,
287
294
}
288
295
296
+ // avoid adding an informer more than once
297
+ informerQueueKeySet := sets .New [informerHandleTuple ]()
289
298
for i := range f .informerQueueKeys {
290
299
for d := range f .informerQueueKeys [i ].informers {
291
300
informer := f .informerQueueKeys [i ].informers [d ]
292
301
queueKeyFn := f .informerQueueKeys [i ].queueKeyFn
293
- informer .AddEventHandler (c .syncContext .(syncContext ).eventHandler (queueKeyFn , f .informerQueueKeys [i ].filter ))
302
+ tuple := informerHandleTuple {
303
+ informer : informer ,
304
+ filter : reflect .ValueOf (f .informerQueueKeys [i ].filter ).Pointer (),
305
+ }
306
+ if ! informerQueueKeySet .Has (tuple ) {
307
+ sets .Insert (informerQueueKeySet , tuple )
308
+ informer .AddEventHandler (c .syncContext .(syncContext ).eventHandler (queueKeyFn , f .informerQueueKeys [i ].filter ))
309
+ }
294
310
c .cachesToSync = append (c .cachesToSync , informer .HasSynced )
295
311
}
296
312
}
297
313
314
+ // avoid adding an informer more than once
315
+ informerSet := sets .New [informerHandleTuple ]()
298
316
for i := range f .informers {
299
317
for d := range f .informers [i ].informers {
300
318
informer := f .informers [i ].informers [d ]
301
- informer .AddEventHandler (c .syncContext .(syncContext ).eventHandler (DefaultQueueKeysFunc , f .informers [i ].filter ))
319
+ tuple := informerHandleTuple {
320
+ informer : informer ,
321
+ filter : reflect .ValueOf (f .informers [i ].filter ).Pointer (),
322
+ }
323
+ if ! informerSet .Has (tuple ) {
324
+ sets .Insert (informerSet , tuple )
325
+ informer .AddEventHandler (c .syncContext .(syncContext ).eventHandler (DefaultQueueKeysFunc , f .informers [i ].filter ))
326
+ }
302
327
c .cachesToSync = append (c .cachesToSync , informer .HasSynced )
303
328
}
304
329
}
0 commit comments