Skip to content

Commit 8da9852

Browse files
authored
Reduce the number of instantiated/used ackrtcache.Caches objects. (#32)
Issue: N/A Currently, each ACK reconciler uses its own `ackrtcache.Caches` instance. Long term this might cause some issues since each Cache instance require its own KubeClient/shared informer etc... This patch reduces the number of instantiated and used `ackrtcache.Caches` to one. All the reconcilers will now use a copy of the same cache instance since it's thread-safe. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 05eaa05 commit 8da9852

File tree

5 files changed

+27
-26
lines changed

5 files changed

+27
-26
lines changed

pkg/runtime/adoption_reconciler.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import (
2121
corev1 "k8s.io/api/core/v1"
2222
apierrors "k8s.io/apimachinery/pkg/api/errors"
2323
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24-
kubernetes "k8s.io/client-go/kubernetes"
24+
"k8s.io/apimachinery/pkg/runtime/schema"
2525
ctrlrt "sigs.k8s.io/controller-runtime"
26+
"sigs.k8s.io/controller-runtime/pkg/client"
27+
k8sctrlutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2628

2729
ackv1alpha1 "github.com/aws-controllers-k8s/runtime/apis/core/v1alpha1"
2830
ackcfg "github.com/aws-controllers-k8s/runtime/pkg/config"
@@ -32,9 +34,6 @@ import (
3234
ackrtcache "github.com/aws-controllers-k8s/runtime/pkg/runtime/cache"
3335
ackrtlog "github.com/aws-controllers-k8s/runtime/pkg/runtime/log"
3436
acktypes "github.com/aws-controllers-k8s/runtime/pkg/types"
35-
"k8s.io/apimachinery/pkg/runtime/schema"
36-
"sigs.k8s.io/controller-runtime/pkg/client"
37-
k8sctrlutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3837
)
3938

4039
const (
@@ -52,14 +51,7 @@ type adoptionReconciler struct {
5251
// BindControllerManager sets up the AWSResourceReconciler with an instance
5352
// of an upstream controller-runtime.Manager
5453
func (r *adoptionReconciler) BindControllerManager(mgr ctrlrt.Manager) error {
55-
clusterConfig := mgr.GetConfig()
56-
clientset, err := kubernetes.NewForConfig(clusterConfig)
57-
if err != nil {
58-
return err
59-
}
6054
r.kc = mgr.GetClient()
61-
r.cache = ackrtcache.New(clientset, r.log, r.cfg.WatchNamespace)
62-
r.cache.Run()
6355
return ctrlrt.NewControllerManagedBy(
6456
mgr,
6557
).For(
@@ -468,13 +460,15 @@ func NewAdoptionReconciler(
468460
log logr.Logger,
469461
cfg ackcfg.Config,
470462
metrics *ackmetrics.Metrics,
463+
cache ackrtcache.Caches,
471464
) acktypes.Reconciler {
472465
return &adoptionReconciler{
473466
reconciler: reconciler{
474467
sc: sc,
475468
log: log.WithName("adopted-reconciler"),
476469
cfg: cfg,
477470
metrics: metrics,
471+
cache: cache,
478472
},
479473
}
480474
}

pkg/runtime/cache/cache.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ type Caches struct {
5858

5959
// New creates a new Caches object from a kubernetes.Interface and
6060
// a logr.Logger
61-
func New(clientset kubernetes.Interface, log logr.Logger, watchNamespace string) Caches {
61+
func New(clientset kubernetes.Interface, log logr.Logger, watchNamespace string) Caches {
6262
return Caches{
6363
Accounts: NewAccountCache(clientset, log),
6464
Namespaces: NewNamespaceCache(clientset, log, watchNamespace),

pkg/runtime/reconciler.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
corev1 "k8s.io/api/core/v1"
2323
apierrors "k8s.io/apimachinery/pkg/api/errors"
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25-
kubernetes "k8s.io/client-go/kubernetes"
2625
ctrlrt "sigs.k8s.io/controller-runtime"
2726
"sigs.k8s.io/controller-runtime/pkg/client"
2827

@@ -75,14 +74,7 @@ func (r *resourceReconciler) BindControllerManager(mgr ctrlrt.Manager) error {
7574
if r.rmf == nil {
7675
return ackerr.NilResourceManagerFactory
7776
}
78-
clusterConfig := mgr.GetConfig()
79-
clientset, err := kubernetes.NewForConfig(clusterConfig)
80-
if err != nil {
81-
return err
82-
}
8377
r.kc = mgr.GetClient()
84-
r.cache = ackrtcache.New(clientset, r.log, r.cfg.WatchNamespace)
85-
r.cache.Run()
8678
rd := r.rmf.ResourceDescriptor()
8779
return ctrlrt.NewControllerManagedBy(
8880
mgr,
@@ -619,8 +611,9 @@ func NewReconciler(
619611
log logr.Logger,
620612
cfg ackcfg.Config,
621613
metrics *ackmetrics.Metrics,
614+
cache ackrtcache.Caches,
622615
) acktypes.AWSResourceReconciler {
623-
return NewReconcilerWithClient(sc, nil, rmf, log, cfg, metrics)
616+
return NewReconcilerWithClient(sc, nil, rmf, log, cfg, metrics, cache)
624617
}
625618

626619
// NewReconcilerWithClient returns a new reconciler object
@@ -632,6 +625,7 @@ func NewReconcilerWithClient(
632625
log logr.Logger,
633626
cfg ackcfg.Config,
634627
metrics *ackmetrics.Metrics,
628+
cache ackrtcache.Caches,
635629
) acktypes.AWSResourceReconciler {
636630
return &resourceReconciler{
637631
reconciler: reconciler{
@@ -640,6 +634,7 @@ func NewReconcilerWithClient(
640634
log: log.WithName("ackrt"),
641635
cfg: cfg,
642636
metrics: metrics,
637+
cache: cache,
643638
},
644639
rmf: rmf,
645640
rd: rmf.ResourceDescriptor(),

pkg/runtime/reconciler_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
ackcfg "github.com/aws-controllers-k8s/runtime/pkg/config"
3131
ackmetrics "github.com/aws-controllers-k8s/runtime/pkg/metrics"
3232
ackrt "github.com/aws-controllers-k8s/runtime/pkg/runtime"
33+
ackrtcache "github.com/aws-controllers-k8s/runtime/pkg/runtime/cache"
3334

3435
k8srtmocks "github.com/aws-controllers-k8s/runtime/mocks/apimachinery/pkg/runtime"
3536
k8srtschemamocks "github.com/aws-controllers-k8s/runtime/mocks/apimachinery/pkg/runtime/schema"
@@ -142,7 +143,7 @@ func TestReconcilerUpdate(t *testing.T) {
142143
// `AWSResourceDescriptor.Delta()` returned a non-empty Delta, that we end
143144
// up calling the AWSResourceManager.Update() call in the Reconciler.Sync()
144145
// method,
145-
r := ackrt.NewReconcilerWithClient(sc, kc, rmf, fakeLogger, cfg, metrics)
146+
r := ackrt.NewReconcilerWithClient(sc, kc, rmf, fakeLogger, cfg, metrics, ackrtcache.Caches{})
146147

147148
err := r.Sync(ctx, rm, desired)
148149
require.Nil(err)
@@ -259,7 +260,7 @@ func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInMetadata(t *testing.T) {
259260
// `AWSResourceDescriptor.Delta()` returned a non-empty Delta, that we end
260261
// up calling the AWSResourceManager.Update() call in the Reconciler.Sync()
261262
// method,
262-
r := ackrt.NewReconcilerWithClient(sc, kc, rmf, fakeLogger, cfg, metrics)
263+
r := ackrt.NewReconcilerWithClient(sc, kc, rmf, fakeLogger, cfg, metrics, ackrtcache.Caches{})
263264

264265
err := r.Sync(ctx, rm, desired)
265266
require.Nil(err)
@@ -375,7 +376,7 @@ func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInSpec(t *testing.T) {
375376
// `AWSResourceDescriptor.Delta()` returned a non-empty Delta, that we end
376377
// up calling the AWSResourceManager.Update() call in the Reconciler.Sync()
377378
// method,
378-
r := ackrt.NewReconcilerWithClient(sc, kc, rmf, fakeLogger, cfg, metrics)
379+
r := ackrt.NewReconcilerWithClient(sc, kc, rmf, fakeLogger, cfg, metrics, ackrtcache.Caches{})
379380

380381
err := r.Sync(ctx, rm, desired)
381382
require.Nil(err)

pkg/runtime/service_controller.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ import (
1818

1919
"github.com/go-logr/logr"
2020
"github.com/prometheus/client_golang/prometheus"
21+
kubernetes "k8s.io/client-go/kubernetes"
2122
ctrlrt "sigs.k8s.io/controller-runtime"
2223

2324
ackcfg "github.com/aws-controllers-k8s/runtime/pkg/config"
2425
ackmetrics "github.com/aws-controllers-k8s/runtime/pkg/metrics"
26+
ackrtcache "github.com/aws-controllers-k8s/runtime/pkg/runtime/cache"
2527
acktypes "github.com/aws-controllers-k8s/runtime/pkg/types"
2628
)
2729

@@ -130,15 +132,24 @@ func (c *serviceController) WithResourceManagerFactories(
130132
func (c *serviceController) BindControllerManager(mgr ctrlrt.Manager, cfg ackcfg.Config) error {
131133
c.metaLock.Lock()
132134
defer c.metaLock.Unlock()
135+
136+
clusterConfig := mgr.GetConfig()
137+
clientset, err := kubernetes.NewForConfig(clusterConfig)
138+
if err != nil {
139+
return err
140+
}
141+
cache := ackrtcache.New(clientset, c.log, cfg.WatchNamespace)
142+
cache.Run()
143+
133144
for _, rmf := range c.rmFactories {
134-
rec := NewReconciler(c, rmf, c.log, cfg, c.metrics)
145+
rec := NewReconciler(c, rmf, c.log, cfg, c.metrics, cache)
135146
if err := rec.BindControllerManager(mgr); err != nil {
136147
return err
137148
}
138149
c.reconcilers = append(c.reconcilers, rec)
139150
}
140151

141-
rec := NewAdoptionReconciler(c, c.log, cfg, c.metrics)
152+
rec := NewAdoptionReconciler(c, c.log, cfg, c.metrics, cache)
142153
if err := rec.BindControllerManager(mgr); err != nil {
143154
return err
144155
}

0 commit comments

Comments
 (0)