From 65ed5813f3129be447419cde2a71de5327ffa4fb Mon Sep 17 00:00:00 2001 From: Chun-Hung Hsiao Date: Thu, 19 Dec 2024 17:30:24 -0800 Subject: [PATCH] Return error when object limit exceeded for cached list calls Since the cache does not implement strongly consistent paginated list calls, if the Limit option is set and the number of items listed exceeds this limit, there is no way for the caller to get a complete list of objects, so return an error here to notify the caller. Fixes #3044. --- pkg/cache/internal/cache_reader.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pkg/cache/internal/cache_reader.go b/pkg/cache/internal/cache_reader.go index 81ee960b73..4d77683398 100644 --- a/pkg/cache/internal/cache_reader.go +++ b/pkg/cache/internal/cache_reader.go @@ -139,15 +139,17 @@ func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...cli labelSel = listOpts.LabelSelector } + // Since the cache does not implement strongly consistent paginated list + // calls, if the Limit option is set and the number of items listed exceeds + // this limit, there is no way for the caller to get a complete list of + // objects, so return an error here to notify the caller. limitSet := listOpts.Limit > 0 + if limitSet && int64(len(objs)) > listOpts.Limit { + return fmt.Errorf("object limit exceeded but paginated list is not supported by the cache") + } runtimeObjs := make([]runtime.Object, 0, len(objs)) for _, item := range objs { - // if the Limit option is set and the number of items - // listed exceeds this limit, then stop reading. - if limitSet && int64(len(runtimeObjs)) >= listOpts.Limit { - break - } obj, isObj := item.(runtime.Object) if !isObj { return fmt.Errorf("cache contained %T, which is not an Object", item)