From 6a7c677207d0315bdc7b61b937e5d22589e5cdc8 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Sat, 9 Mar 2024 17:46:18 +0100 Subject: [PATCH 1/2] UPSTREAM: : ignore cluster in ctx for non-aware caches, and error for the inverse Signed-off-by: Dr. Stefan Schimanski --- pkg/cache/internal/cache_reader.go | 42 ++++++++++++++++++------------ 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/pkg/cache/internal/cache_reader.go b/pkg/cache/internal/cache_reader.go index b70756f6f9..d4115ad3ee 100644 --- a/pkg/cache/internal/cache_reader.go +++ b/pkg/cache/internal/cache_reader.go @@ -62,7 +62,17 @@ func (c *CacheReader) Get(ctx context.Context, key client.ObjectKey, out client. if c.scopeName == apimeta.RESTScopeNameRoot { key.Namespace = "" } - storeKey := objectKeyToStoreKey(ctx, key) + storeKey := objectKeyToStoreKey(key) + + // create cluster-aware key for KCP + _, isClusterAware := c.indexer.GetIndexers()[kcpcache.ClusterAndNamespaceIndexName] + clusterName, _ := kontext.ClusterFrom(ctx) + if isClusterAware && clusterName.Empty() { + return fmt.Errorf("cluster-aware cache requires a cluster in context") + } + if isClusterAware { + storeKey = clusterName.String() + "|" + storeKey + } // Lookup the object from the indexer cache obj, exists, err := c.indexer.GetByKey(storeKey) @@ -120,7 +130,11 @@ func (c *CacheReader) List(ctx context.Context, out client.ObjectList, opts ...c return fmt.Errorf("continue list option is not supported by the cache") } + _, isClusterAware := c.indexer.GetIndexers()[kcpcache.ClusterAndNamespaceIndexName] clusterName, _ := kontext.ClusterFrom(ctx) + if isClusterAware && clusterName.Empty() { + return fmt.Errorf("cluster-aware cache requires a cluster in context") + } switch { case listOpts.FieldSelector != nil: @@ -133,16 +147,16 @@ func (c *CacheReader) List(ctx context.Context, out client.ObjectList, opts ...c // namespace. objs, err = byIndexes(c.indexer, listOpts.FieldSelector.Requirements(), clusterName, listOpts.Namespace) case listOpts.Namespace != "": - if clusterName.Empty() { - objs, err = c.indexer.ByIndex(cache.NamespaceIndex, listOpts.Namespace) - } else { + if isClusterAware { objs, err = c.indexer.ByIndex(kcpcache.ClusterAndNamespaceIndexName, kcpcache.ClusterAndNamespaceIndexKey(clusterName, listOpts.Namespace)) + } else { + objs, err = c.indexer.ByIndex(cache.NamespaceIndex, listOpts.Namespace) } default: - if clusterName.Empty() { - objs = c.indexer.List() - } else { + if isClusterAware { objs, err = c.indexer.ByIndex(kcpcache.ClusterIndexName, kcpcache.ClusterIndexKey(clusterName)) + } else { + objs = c.indexer.List() } } if err != nil { @@ -198,13 +212,14 @@ func byIndexes(indexer cache.Indexer, requires fields.Requirements, clusterName vals []string ) indexers := indexer.GetIndexers() + _, isClusterAware := indexers[kcpcache.ClusterAndNamespaceIndexName] for idx, req := range requires { indexName := FieldIndexName(req.Field) var indexedValue string - if clusterName.Empty() { - indexedValue = KeyToNamespacedKey(namespace, req.Value) - } else { + if isClusterAware { indexedValue = KeyToClusteredKey(clusterName.String(), namespace, req.Value) + } else { + indexedValue = KeyToNamespacedKey(namespace, req.Value) } if idx == 0 { // we use first require to get snapshot data @@ -248,12 +263,7 @@ func byIndexes(indexer cache.Indexer, requires fields.Requirements, clusterName // It's akin to MetaNamespaceKeyFunc. It's separate from // String to allow keeping the key format easily in sync with // MetaNamespaceKeyFunc. -func objectKeyToStoreKey(ctx context.Context, k client.ObjectKey) string { - cluster, ok := kontext.ClusterFrom(ctx) - if ok { - return kcpcache.ToClusterAwareKey(cluster.String(), k.Namespace, k.Name) - } - +func objectKeyToStoreKey(k client.ObjectKey) string { if k.Namespace == "" { return k.Name } From 34979e836cf527dfcd8b95848636bba2361ee5cb Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Sun, 10 Mar 2024 19:22:04 +0100 Subject: [PATCH 2/2] Address comments Signed-off-by: Dr. Stefan Schimanski --- pkg/cache/internal/cache_reader.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pkg/cache/internal/cache_reader.go b/pkg/cache/internal/cache_reader.go index d4115ad3ee..4684946cf3 100644 --- a/pkg/cache/internal/cache_reader.go +++ b/pkg/cache/internal/cache_reader.go @@ -132,9 +132,6 @@ func (c *CacheReader) List(ctx context.Context, out client.ObjectList, opts ...c _, isClusterAware := c.indexer.GetIndexers()[kcpcache.ClusterAndNamespaceIndexName] clusterName, _ := kontext.ClusterFrom(ctx) - if isClusterAware && clusterName.Empty() { - return fmt.Errorf("cluster-aware cache requires a cluster in context") - } switch { case listOpts.FieldSelector != nil: @@ -147,13 +144,13 @@ func (c *CacheReader) List(ctx context.Context, out client.ObjectList, opts ...c // namespace. objs, err = byIndexes(c.indexer, listOpts.FieldSelector.Requirements(), clusterName, listOpts.Namespace) case listOpts.Namespace != "": - if isClusterAware { + if isClusterAware && !clusterName.Empty() { objs, err = c.indexer.ByIndex(kcpcache.ClusterAndNamespaceIndexName, kcpcache.ClusterAndNamespaceIndexKey(clusterName, listOpts.Namespace)) } else { objs, err = c.indexer.ByIndex(cache.NamespaceIndex, listOpts.Namespace) } default: - if isClusterAware { + if isClusterAware && !clusterName.Empty() { objs, err = c.indexer.ByIndex(kcpcache.ClusterIndexName, kcpcache.ClusterIndexKey(clusterName)) } else { objs = c.indexer.List()