diff --git a/tools/cache/listers.go b/tools/cache/listers.go index 9e050ff4..dc4dfd2c 100644 --- a/tools/cache/listers.go +++ b/tools/cache/listers.go @@ -32,6 +32,10 @@ type AppendFunc func(interface{}) // ListAll lists items in the store matching the given selector, calling appendFn on each one. func ListAll(store Store, selector labels.Selector, appendFn AppendFunc) error { + if labels.MatchesNothing(selector) { + return nil + } + selectAll := selector.Empty() for _, m := range store.List() { if selectAll { @@ -55,6 +59,10 @@ func ListAll(store Store, selector labels.Selector, appendFn AppendFunc) error { // calling appendFn on each one. // If a blank namespace (NamespaceAll) is specified, this delegates to ListAll(). func ListAllByNamespace(indexer Indexer, namespace string, selector labels.Selector, appendFn AppendFunc) error { + if labels.MatchesNothing(selector) { + return nil + } + if namespace == metav1.NamespaceAll { return ListAll(indexer, selector, appendFn) } diff --git a/tools/cache/listers_test.go b/tools/cache/listers_test.go index 730807f6..18f3ee35 100644 --- a/tools/cache/listers_test.go +++ b/tools/cache/listers_test.go @@ -138,3 +138,23 @@ func BenchmarkLister_Match_100k_100(b *testing.B) { func BenchmarkLister_Match_1M_100(b *testing.B) { benchmarkLister(b, 1000000, 100, map[string]string{"match": "true"}) } + +func benchmarkNothingLister(b *testing.B, numObjects int, numMatching int, labelSelector *metav1.LabelSelector) { + store := mustCreateStore(numObjects, numMatching, nil) + selector, err := metav1.LabelSelectorAsSelector(labelSelector) + if err != nil { + b.Fatalf("LabelSelectorAsSelector returned an error: %v", err) + } + b.ResetTimer() + for n := 0; n < b.N; n++ { + err := ListAll(store, selector, func(m interface{}) { + }) + if err != nil { + b.Fatalf("ListAll returned an error: %v", err) + } + } +} + +func BenchmarkLister_Match_1M_0(b *testing.B) { + benchmarkNothingLister(b, 1000000, 0, nil) +}