From 4b9161e8c4f8d90015fb2d14709747c387074c3b Mon Sep 17 00:00:00 2001 From: Mehmet Enes Date: Wed, 1 May 2024 23:09:22 +0300 Subject: [PATCH] fix cache early read problem --- .../controller/apiextensions/claim/reconciler.go | 16 +++++++++++----- .../apiextensions/composite/reconciler.go | 14 ++++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/internal/controller/apiextensions/claim/reconciler.go b/internal/controller/apiextensions/claim/reconciler.go index 061e74661d5..456700a2bf6 100644 --- a/internal/controller/apiextensions/claim/reconciler.go +++ b/internal/controller/apiextensions/claim/reconciler.go @@ -175,7 +175,8 @@ func (fn DefaultsSelectorFn) SelectDefaults(ctx context.Context, cm resource.Com // for each XR kind they can bind to. Each controller must watch its subset of // claims and any XRs they bind to. type Reconciler struct { - client client.Client + client client.Client + apiReader client.Reader gvkClaim schema.GroupVersionKind gvkXR schema.GroupVersionKind @@ -302,8 +303,10 @@ func WithPollInterval(after time.Duration) ReconcilerOption { // configure their composite resources. func NewReconciler(m manager.Manager, of resource.CompositeClaimKind, with resource.CompositeKind, o ...ReconcilerOption) *Reconciler { c := unstructured.NewClient(m.GetClient()) + ar := m.GetAPIReader() r := &Reconciler{ client: c, + apiReader: ar, gvkClaim: schema.GroupVersionKind(of), gvkXR: schema.GroupVersionKind(with), managedFields: &NopManagedFieldsUpgrader{}, @@ -330,10 +333,13 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (reco cm := claim.New(claim.WithGroupVersionKind(r.gvkClaim)) if err := r.client.Get(ctx, req.NamespacedName, cm); err != nil { - // There's no need to requeue if we no longer exist. Otherwise we'll be - // requeued implicitly because we return an error. - log.Debug(errGetClaim, "error", err) - return reconcile.Result{}, errors.Wrap(resource.IgnoreNotFound(err), errGetClaim) + // If the unstructured cache does not have the claim, hit the API Server + if err := r.apiReader.Get(ctx, req.NamespacedName, cm); err != nil { + // There's no need to requeue if we no longer exist. Otherwise we'll be + // requeued implicitly because we return an error. + log.Debug(errGetClaim, "error", err) + return reconcile.Result{}, errors.Wrap(resource.IgnoreNotFound(err), errGetClaim) + } } record := r.record.WithAnnotations("external-name", meta.GetExternalName(cm)) diff --git a/internal/controller/apiextensions/composite/reconciler.go b/internal/controller/apiextensions/composite/reconciler.go index 2d5b69304d0..dc860b7e7a8 100644 --- a/internal/controller/apiextensions/composite/reconciler.go +++ b/internal/controller/apiextensions/composite/reconciler.go @@ -395,9 +395,11 @@ func (fn KindObserverFunc) WatchComposedResources(kind ...schema.GroupVersionKin // NewReconciler returns a new Reconciler of composite resources. func NewReconciler(mgr manager.Manager, of resource.CompositeKind, opts ...ReconcilerOption) *Reconciler { kube := unstructured.NewClient(mgr.GetClient()) + ar := mgr.GetAPIReader() r := &Reconciler{ - client: kube, + client: kube, + apiReader: ar, gvk: schema.GroupVersionKind(of), @@ -449,7 +451,8 @@ func NewReconciler(mgr manager.Manager, of resource.CompositeKind, opts ...Recon // A Reconciler reconciles composite resources. type Reconciler struct { - client client.Client + client client.Client + apiReader client.Reader gvk schema.GroupVersionKind @@ -477,8 +480,11 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (reco xr := composite.New(composite.WithGroupVersionKind(r.gvk)) if err := r.client.Get(ctx, req.NamespacedName, xr); err != nil { - log.Debug(errGet, "error", err) - return reconcile.Result{}, errors.Wrap(resource.IgnoreNotFound(err), errGet) + // If the cache does not have the composite, hit the API Server + if err := r.apiReader.Get(ctx, req.NamespacedName, xr); err != nil { + log.Debug(errGet, "error", err) + return reconcile.Result{}, errors.Wrap(resource.IgnoreNotFound(err), errGet) + } } log = log.WithValues(