Skip to content

Commit 895e7ac

Browse files
committedJul 23, 2021
Prune unused ClusterServiceVersion fields from catalog's informer.
The catalog operator watches both copied and original ClusterServiceVersions in order to perform dependency resolution and to check for API ownership conflicts during installation, but it only reads a small subset of fields. Pruning those fields as CSVs are read from the wire can substantially reduce heap size on clusters with a significant total number of CSVs across all namespaces (for example, when operators target all namespaces on a cluster with thousands of namespaces). Signed-off-by: Ben Luddy <[email protected]>
1 parent f8217b7 commit 895e7ac

File tree

2 files changed

+36
-109
lines changed

2 files changed

+36
-109
lines changed
 

Diff for: ‎pkg/controller/operators/catalog/operator.go

+36-13
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ import (
4545
"github.com/operator-framework/api/pkg/operators/v1alpha1"
4646
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
4747
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/informers/externalversions"
48+
operatorsv1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
4849
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle"
4950
olmerrors "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/errors"
5051
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
5152
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/subscription"
53+
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning"
5254
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry"
5355
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc"
5456
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler"
@@ -105,7 +107,6 @@ type Operator struct {
105107
sourcesLastUpdate sharedtime.SharedTime
106108
resolver resolver.StepResolver
107109
reconciler reconciler.RegistryReconcilerFactory
108-
csvProvidedAPIsIndexer map[string]cache.Indexer
109110
catalogSubscriberIndexer map[string]cache.Indexer
110111
clientAttenuator *scoped.ClientAttenuator
111112
serviceAccountQuerier *scoped.UserDefinedServiceAccountQuerier
@@ -176,7 +177,6 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
176177
catsrcQueueSet: queueinformer.NewEmptyResourceQueueSet(),
177178
subQueueSet: queueinformer.NewEmptyResourceQueueSet(),
178179
ipQueueSet: queueinformer.NewEmptyResourceQueueSet(),
179-
csvProvidedAPIsIndexer: map[string]cache.Indexer{},
180180
catalogSubscriberIndexer: map[string]cache.Indexer{},
181181
serviceAccountQuerier: scoped.NewUserDefinedServiceAccountQuerier(logger, crClient),
182182
clientAttenuator: scoped.NewClientAttenuator(logger, config, opClient),
@@ -192,18 +192,41 @@ func NewOperator(ctx context.Context, kubeconfigPath string, clock utilclock.Clo
192192
// Wire OLM CR sharedIndexInformers
193193
crInformerFactory := externalversions.NewSharedInformerFactoryWithOptions(op.client, resyncPeriod())
194194

195-
// Wire CSVs
196-
csvInformer := crInformerFactory.Operators().V1alpha1().ClusterServiceVersions()
197-
op.lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(metav1.NamespaceAll, csvInformer.Lister())
198-
if err := op.RegisterInformer(csvInformer.Informer()); err != nil {
199-
return nil, err
200-
}
201-
202-
if err := csvInformer.Informer().AddIndexers(cache.Indexers{index.ProvidedAPIsIndexFuncKey: index.ProvidedAPIsIndexFunc}); err != nil {
195+
// Fields are pruned from local copies of the objects managed
196+
// by this informer in order to reduce cached size.
197+
prunedCSVInformer := cache.NewSharedIndexInformer(
198+
pruning.NewListerWatcher(op.client, metav1.NamespaceAll, func(*metav1.ListOptions) {}, pruning.PrunerFunc(func(csv *v1alpha1.ClusterServiceVersion) {
199+
*csv = v1alpha1.ClusterServiceVersion{
200+
TypeMeta: csv.TypeMeta,
201+
ObjectMeta: metav1.ObjectMeta{
202+
Name: csv.Name,
203+
Namespace: csv.Namespace,
204+
Labels: csv.Labels,
205+
Annotations: csv.Annotations,
206+
},
207+
Spec: v1alpha1.ClusterServiceVersionSpec{
208+
CustomResourceDefinitions: csv.Spec.CustomResourceDefinitions,
209+
APIServiceDefinitions: csv.Spec.APIServiceDefinitions,
210+
Replaces: csv.Spec.Replaces,
211+
Version: csv.Spec.Version,
212+
},
213+
Status: v1alpha1.ClusterServiceVersionStatus{
214+
Phase: csv.Status.Phase,
215+
Reason: csv.Status.Reason,
216+
},
217+
}
218+
})),
219+
&v1alpha1.ClusterServiceVersion{},
220+
resyncPeriod(),
221+
cache.Indexers{
222+
cache.NamespaceIndex: cache.MetaNamespaceIndexFunc,
223+
},
224+
)
225+
csvLister := operatorsv1alpha1listers.NewClusterServiceVersionLister(prunedCSVInformer.GetIndexer())
226+
op.lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(metav1.NamespaceAll, csvLister)
227+
if err := op.RegisterInformer(prunedCSVInformer); err != nil {
203228
return nil, err
204229
}
205-
csvIndexer := csvInformer.Informer().GetIndexer()
206-
op.csvProvidedAPIsIndexer[metav1.NamespaceAll] = csvIndexer
207230

208231
// TODO: Add namespace resolve sync
209232

@@ -1279,7 +1302,7 @@ func (o *Operator) setSubsCond(subs []*v1alpha1.Subscription, condType v1alpha1.
12791302
}
12801303

12811304
latest.Status = s.Status
1282-
_, err = o.client.OperatorsV1alpha1().Subscriptions(sub.Namespace).UpdateStatus(context.TODO(), latest, updateOpts)
1305+
_, err = o.client.OperatorsV1alpha1().Subscriptions(s.Namespace).UpdateStatus(context.TODO(), latest, updateOpts)
12831306

12841307
return err
12851308
}

Diff for: ‎pkg/lib/index/api.go

-96
This file was deleted.

0 commit comments

Comments
 (0)