Skip to content

Commit ab09a67

Browse files
committed
StaticResourceController: Avoid adding the same informer more than once
Adding the same informer several times is useless and has a negative side-effect: a change of object on API-server leads to scheduling reconcile loop several times. Calling reconcile more often than necessary is not great.
1 parent ac3ba9e commit ab09a67

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

pkg/operator/staticresourcecontroller/static_resource_controller.go

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"k8s.io/apimachinery/pkg/runtime/serializer"
2727
utilerrors "k8s.io/apimachinery/pkg/util/errors"
2828
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
29+
"k8s.io/apimachinery/pkg/util/sets"
2930
"k8s.io/client-go/informers"
3031
"k8s.io/client-go/tools/cache"
3132
"k8s.io/klog/v2"
@@ -187,6 +188,9 @@ func (c *StaticResourceController) AddKubeInformers(kubeInformersByNamespace v1h
187188
// set the informers so we can have caching clients
188189
c.clients = c.clients.WithKubernetesInformers(kubeInformersByNamespace)
189190

191+
// avoid adding an informer more than once
192+
informerSet := sets.New[cache.SharedIndexInformer]()
193+
190194
ret := c
191195
for _, conditionalManifest := range c.manifests {
192196
for _, file := range conditionalManifest.files {
@@ -227,29 +231,29 @@ func (c *StaticResourceController) AddKubeInformers(kubeInformersByNamespace v1h
227231
case *corev1.Namespace:
228232
ret = ret.AddNamespaceInformer(informer.Core().V1().Namespaces().Informer(), t.Name)
229233
case *corev1.Service:
230-
ret = ret.AddInformer(informer.Core().V1().Services().Informer())
234+
ret = ret.AddInformer(informerSet, informer.Core().V1().Services().Informer())
231235
case *corev1.Pod:
232-
ret = ret.AddInformer(informer.Core().V1().Pods().Informer())
236+
ret = ret.AddInformer(informerSet, informer.Core().V1().Pods().Informer())
233237
case *corev1.ServiceAccount:
234-
ret = ret.AddInformer(informer.Core().V1().ServiceAccounts().Informer())
238+
ret = ret.AddInformer(informerSet, informer.Core().V1().ServiceAccounts().Informer())
235239
case *corev1.ConfigMap:
236-
ret = ret.AddInformer(informer.Core().V1().ConfigMaps().Informer())
240+
ret = ret.AddInformer(informerSet, informer.Core().V1().ConfigMaps().Informer())
237241
case *corev1.Secret:
238-
ret = ret.AddInformer(informer.Core().V1().Secrets().Informer())
242+
ret = ret.AddInformer(informerSet, informer.Core().V1().Secrets().Informer())
239243
case *rbacv1.ClusterRole:
240-
ret = ret.AddInformer(informer.Rbac().V1().ClusterRoles().Informer())
244+
ret = ret.AddInformer(informerSet, informer.Rbac().V1().ClusterRoles().Informer())
241245
case *rbacv1.ClusterRoleBinding:
242-
ret = ret.AddInformer(informer.Rbac().V1().ClusterRoleBindings().Informer())
246+
ret = ret.AddInformer(informerSet, informer.Rbac().V1().ClusterRoleBindings().Informer())
243247
case *rbacv1.Role:
244-
ret = ret.AddInformer(informer.Rbac().V1().Roles().Informer())
248+
ret = ret.AddInformer(informerSet, informer.Rbac().V1().Roles().Informer())
245249
case *rbacv1.RoleBinding:
246-
ret = ret.AddInformer(informer.Rbac().V1().RoleBindings().Informer())
250+
ret = ret.AddInformer(informerSet, informer.Rbac().V1().RoleBindings().Informer())
247251
case *policyv1.PodDisruptionBudget:
248-
ret = ret.AddInformer(informer.Policy().V1().PodDisruptionBudgets().Informer())
252+
ret = ret.AddInformer(informerSet, informer.Policy().V1().PodDisruptionBudgets().Informer())
249253
case *storagev1.StorageClass:
250-
ret = ret.AddInformer(informer.Storage().V1().StorageClasses().Informer())
254+
ret = ret.AddInformer(informerSet, informer.Storage().V1().StorageClasses().Informer())
251255
case *storagev1.CSIDriver:
252-
ret = ret.AddInformer(informer.Storage().V1().CSIDrivers().Informer())
256+
ret = ret.AddInformer(informerSet, informer.Storage().V1().CSIDrivers().Informer())
253257
default:
254258
// if there's a missing case, the caller can add an informer or count on a time based trigger.
255259
// if the controller doesn't handle it, then there will be failure from the underlying apply.
@@ -261,8 +265,11 @@ func (c *StaticResourceController) AddKubeInformers(kubeInformersByNamespace v1h
261265
return ret
262266
}
263267

264-
func (c *StaticResourceController) AddInformer(informer cache.SharedIndexInformer) *StaticResourceController {
265-
c.factory.WithInformers(informer)
268+
func (c *StaticResourceController) AddInformer(set sets.Set[cache.SharedIndexInformer], informer cache.SharedIndexInformer) *StaticResourceController {
269+
if !set.Has(informer) {
270+
sets.Insert(set, informer)
271+
c.factory.WithInformers(informer)
272+
}
266273
return c
267274
}
268275

0 commit comments

Comments
 (0)