mirror of
https://github.com/kubernetes/kubernetes.git
synced 2026-06-08 16:30:57 -04:00
Remove locked GA feature gate BtreeWatchCache
This commit is contained in:
parent
5511cc46c8
commit
876f47cbc8
7 changed files with 24 additions and 111 deletions
|
|
@ -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: {},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue