From 876f47cbc8dc55f9ce0372788eaaad22f049a6fa Mon Sep 17 00:00:00 2001 From: Jefftree Date: Fri, 8 May 2026 11:41:20 -0400 Subject: [PATCH] Remove locked GA feature gate BtreeWatchCache --- pkg/features/kube_features.go | 7 -- pkg/registry/core/pod/strategy.go | 22 +----- .../apiserver/pkg/features/kube_features.go | 10 --- .../pkg/storage/cacher/cacher_test.go | 78 +++++-------------- .../pkg/storage/cacher/store/store.go | 7 +- .../reference/feature_list.md | 1 - .../reference/versioned_feature_list.yaml | 10 --- 7 files changed, 24 insertions(+), 111 deletions(-) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 2d1b70b0ae9..e168f20e2c8 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -2119,11 +2119,6 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, }, - genericfeatures.BtreeWatchCache: { - {Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - }, - genericfeatures.CBORServingAndStorage: { {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, }, @@ -2658,8 +2653,6 @@ var defaultKubernetesFeatureGateDependencies = map[featuregate.Feature][]feature genericfeatures.AllowUnsafeMalformedObjectDeletion: {}, - genericfeatures.BtreeWatchCache: {}, - genericfeatures.CBORServingAndStorage: {}, genericfeatures.ConcurrentWatchObjectDecode: {}, diff --git a/pkg/registry/core/pod/strategy.go b/pkg/registry/core/pod/strategy.go index f4cf111c322..f79b882e7c2 100644 --- a/pkg/registry/core/pod/strategy.go +++ b/pkg/registry/core/pod/strategy.go @@ -40,7 +40,6 @@ import ( utilnet "k8s.io/apimachinery/pkg/util/net" utilvalidation "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" - apiserverfeatures "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/storage" @@ -452,15 +451,11 @@ func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { // MatchPod returns a generic matcher for a given label and field selector. func MatchPod(label labels.Selector, field fields.Selector) storage.SelectionPredicate { - var indexFields = []string{"spec.nodeName"} - if utilfeature.DefaultFeatureGate.Enabled(features.StorageNamespaceIndex) && !utilfeature.DefaultFeatureGate.Enabled(apiserverfeatures.BtreeWatchCache) { - indexFields = append(indexFields, "metadata.namespace") - } return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: GetAttrs, - IndexFields: indexFields, + IndexFields: []string{"spec.nodeName"}, } } @@ -478,24 +473,11 @@ func NodeNameIndexFunc(obj interface{}) ([]string, error) { return []string{pod.Spec.NodeName}, nil } -// NamespaceIndexFunc return value name of given object. -func NamespaceIndexFunc(obj interface{}) ([]string, error) { - pod, ok := obj.(*api.Pod) - if !ok { - return nil, fmt.Errorf("not a pod") - } - return []string{pod.Namespace}, nil -} - // Indexers returns the indexers for pod storage. func Indexers() *cache.Indexers { - var indexers = cache.Indexers{ + return &cache.Indexers{ storage.FieldIndex("spec.nodeName"): NodeNameIndexFunc, } - if utilfeature.DefaultFeatureGate.Enabled(features.StorageNamespaceIndex) && !utilfeature.DefaultFeatureGate.Enabled(apiserverfeatures.BtreeWatchCache) { - indexers[storage.FieldIndex("metadata.namespace")] = NamespaceIndexFunc - } - return &indexers } // ToSelectableFields returns a field set that represents the object diff --git a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go index e3a50c18f4e..6bb53031d7e 100644 --- a/staging/src/k8s.io/apiserver/pkg/features/kube_features.go +++ b/staging/src/k8s.io/apiserver/pkg/features/kube_features.go @@ -75,11 +75,6 @@ const ( // resources using the Kubernetes API only. AllowUnsafeMalformedObjectDeletion featuregate.Feature = "AllowUnsafeMalformedObjectDeletion" - // owner: @serathius - // - // Replaces watch cache hashmap implementation with a btree based one, bringing performance improvements. - BtreeWatchCache featuregate.Feature = "BtreeWatchCache" - // owner: @benluddy // kep: https://kep.k8s.io/4222 // @@ -342,11 +337,6 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, }, - BtreeWatchCache: { - {Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, - }, - CBORServingAndStorage: { {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Alpha}, }, diff --git a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_test.go b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_test.go index 7fceb88a00c..05513c1ea42 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_test.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_test.go @@ -647,35 +647,17 @@ func (c *createWrapper) Create(ctx context.Context, key string, obj, out runtime func BenchmarkStoreCreateList(b *testing.B) { klog.SetLogger(logr.Discard()) - storeOptions := []struct { - name string - btreeEnabled bool - }{ - { - name: "Btree", - btreeEnabled: true, - }, - { - name: "Map", - btreeEnabled: false, - }, - } - for _, store := range storeOptions { - b.Run(fmt.Sprintf("Store=%s", store.name), func(b *testing.B) { - featuregatetesting.SetFeatureGateDuringTest(b, utilfeature.DefaultFeatureGate, features.BtreeWatchCache, store.btreeEnabled) - for _, rvm := range []metav1.ResourceVersionMatch{metav1.ResourceVersionMatchNotOlderThan, metav1.ResourceVersionMatchExact} { - b.Run(fmt.Sprintf("RV=%s", rvm), func(b *testing.B) { - for _, useIndex := range []bool{true, false} { - b.Run(fmt.Sprintf("Indexed=%v", useIndex), func(b *testing.B) { - opts := []setupOption{} - if useIndex { - opts = append(opts, withNodeNameAndNamespaceIndex) - } - ctx, cacher, _, terminate := testSetupWithEtcdServer(b, opts...) - b.Cleanup(terminate) - storagetesting.RunBenchmarkStoreListCreate(ctx, b, cacher, rvm) - }) + for _, rvm := range []metav1.ResourceVersionMatch{metav1.ResourceVersionMatchNotOlderThan, metav1.ResourceVersionMatchExact} { + b.Run(fmt.Sprintf("RV=%s", rvm), func(b *testing.B) { + for _, useIndex := range []bool{true, false} { + b.Run(fmt.Sprintf("Indexed=%v", useIndex), func(b *testing.B) { + opts := []setupOption{} + if useIndex { + opts = append(opts, withNodeNameAndNamespaceIndex) } + ctx, cacher, _, terminate := testSetupWithEtcdServer(b, opts...) + b.Cleanup(terminate) + storagetesting.RunBenchmarkStoreListCreate(ctx, b, cacher, rvm) }) } }) @@ -709,36 +691,18 @@ func BenchmarkStoreList(b *testing.B) { for _, dims := range dimensions { b.Run(fmt.Sprintf("Namespaces=%d/Pods=%d/Nodes=%d", dims.namespaceCount, dims.namespaceCount*dims.podPerNamespaceCount, dims.nodeCount), func(b *testing.B) { data := storagetesting.PrepareBenchchmarkData(dims.namespaceCount, dims.podPerNamespaceCount, dims.nodeCount) - storeOptions := []struct { - name string - btreeEnabled bool - }{ - { - name: "Btree", - btreeEnabled: true, - }, - { - name: "Map", - btreeEnabled: false, - }, + ctx, cacher, _, terminate := testSetupWithEtcdServer(b, withNodeNameAndNamespaceIndex) + b.Cleanup(terminate) + var out example.Pod + for _, pod := range data.Pods { + err := cacher.Create(ctx, computePodKey(pod), pod, &out, 0) + if err != nil { + b.Fatal(err) + } } - for _, store := range storeOptions { - b.Run(fmt.Sprintf("Store=%s", store.name), func(b *testing.B) { - featuregatetesting.SetFeatureGateDuringTest(b, utilfeature.DefaultFeatureGate, features.BtreeWatchCache, store.btreeEnabled) - ctx, cacher, _, terminate := testSetupWithEtcdServer(b, withNodeNameAndNamespaceIndex) - b.Cleanup(terminate) - var out example.Pod - for _, pod := range data.Pods { - err := cacher.Create(ctx, computePodKey(pod), pod, &out, 0) - if err != nil { - b.Fatal(err) - } - } - for _, useIndex := range []bool{true, false} { - b.Run(fmt.Sprintf("Indexed=%v", useIndex), func(b *testing.B) { - storagetesting.RunBenchmarkStoreList(ctx, b, cacher, data, useIndex) - }) - } + for _, useIndex := range []bool{true, false} { + b.Run(fmt.Sprintf("Indexed=%v", useIndex), func(b *testing.B) { + storagetesting.RunBenchmarkStoreList(ctx, b, cacher, data, useIndex) }) } }) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/cacher/store/store.go b/staging/src/k8s.io/apiserver/pkg/storage/cacher/store/store.go index 00dbc212987..89de895d9c0 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/cacher/store/store.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/cacher/store/store.go @@ -22,8 +22,6 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/features" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/cache" ) @@ -79,10 +77,7 @@ type OrderedLister interface { } func NewIndexer(indexers *cache.Indexers) Indexer { - if utilfeature.DefaultFeatureGate.Enabled(features.BtreeWatchCache) { - return newThreadedBtreeStoreIndexer(ElementIndexers(indexers), btreeDegree) - } - return cache.NewIndexer(ElementKey, ElementIndexers(indexers)) + return newThreadedBtreeStoreIndexer(ElementIndexers(indexers), btreeDegree) } // Computing a key of an object is generally non-trivial (it performs diff --git a/test/compatibility_lifecycle/reference/feature_list.md b/test/compatibility_lifecycle/reference/feature_list.md index 5c3c885233b..b9847c9be1f 100644 --- a/test/compatibility_lifecycle/reference/feature_list.md +++ b/test/compatibility_lifecycle/reference/feature_list.md @@ -18,7 +18,6 @@ | AllowUnsafeMalformedObjectDeletion | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbAllowUnsafeMalformedObjectDeletion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAllowUnsafeMalformedObjectDeletion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | AtomicFIFO | :ballot_box_with_check: 1.36+ | | | 1.36– | | | | [code](https://cs.k8s.io/?q=%5CbAtomicFIFO%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAtomicFIFO%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | AuthorizePodWebsocketUpgradeCreatePermission | :ballot_box_with_check: 1.35+ | | | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbAuthorizePodWebsocketUpgradeCreatePermission%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAuthorizePodWebsocketUpgradeCreatePermission%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | -| BtreeWatchCache | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.33+ | | 1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbBtreeWatchCache%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbBtreeWatchCache%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | CBORServingAndStorage | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbCBORServingAndStorage%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCBORServingAndStorage%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | CPUManagerPolicyAlphaOptions | | | 1.23– | | | | | [code](https://cs.k8s.io/?q=%5CbCPUManagerPolicyAlphaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCPUManagerPolicyAlphaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | CPUManagerPolicyBetaOptions | :ballot_box_with_check: 1.23+ | | | 1.23– | | | | [code](https://cs.k8s.io/?q=%5CbCPUManagerPolicyBetaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCPUManagerPolicyBetaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | diff --git a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml index fa648ecaa05..135a3b72341 100644 --- a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml +++ b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml @@ -113,16 +113,6 @@ lockToDefault: false preRelease: Beta version: "1.35" -- name: BtreeWatchCache - versionedSpecs: - - default: true - lockToDefault: false - preRelease: Beta - version: "1.32" - - default: true - lockToDefault: true - preRelease: GA - version: "1.33" - name: CBORServingAndStorage versionedSpecs: - default: false