Skip to content

Commit 4abc2b3

Browse files
chenk008wuhua.ck
authored andcommitted
Fix: StorageObjectCountTracker is nil, apf estimator got ObjectCountNotFoundErr
1 parent 9791f0d commit 4abc2b3

File tree

4 files changed

+77
-1
lines changed

4 files changed

+77
-1
lines changed

pkg/controlplane/apiserver/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ func BuildGenericConfig(
140140
if lastErr != nil {
141141
return
142142
}
143+
// storageFactory.StorageConfig is copied from etcdOptions.StorageConfig,
144+
// the StorageObjectCountTracker is still nil. Here we copy from genericConfig.
145+
storageFactory.StorageConfig.StorageObjectCountTracker = genericConfig.StorageObjectCountTracker
143146
if lastErr = s.Etcd.ApplyWithStorageFactoryTo(storageFactory, genericConfig); lastErr != nil {
144147
return
145148
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package apiserver
2+
3+
import (
4+
extensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
5+
"k8s.io/apimachinery/pkg/runtime"
6+
"k8s.io/apimachinery/pkg/runtime/schema"
7+
apiserveroptions "k8s.io/apiserver/pkg/server/options"
8+
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
9+
"k8s.io/kubernetes/pkg/api/legacyscheme"
10+
"k8s.io/kubernetes/pkg/controlplane/apiserver/options"
11+
generatedopenapi "k8s.io/kubernetes/pkg/generated/openapi"
12+
netutils "k8s.io/utils/net"
13+
"net"
14+
"testing"
15+
)
16+
17+
func TestBuildGenericConfig(t *testing.T) {
18+
opts := options.NewOptions()
19+
s := (&apiserveroptions.SecureServingOptions{
20+
BindAddress: netutils.ParseIPSloppy("127.0.0.1"),
21+
}).WithLoopback()
22+
ln, err := net.Listen("tcp", "127.0.0.1:0")
23+
if err != nil {
24+
t.Fatalf("failed to listen on 127.0.0.1:0")
25+
}
26+
defer ln.Close()
27+
s.Listener = ln
28+
s.BindPort = ln.Addr().(*net.TCPAddr).Port
29+
opts.SecureServing = s
30+
31+
completedOptions, err := opts.Complete(nil, nil)
32+
if err != nil {
33+
t.Fatalf("Failed to complete apiserver options: %v", err)
34+
}
35+
36+
genericConfig, _, storageFactory, err := BuildGenericConfig(
37+
completedOptions,
38+
[]*runtime.Scheme{legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme},
39+
generatedopenapi.GetOpenAPIDefinitions,
40+
)
41+
if err != nil {
42+
t.Fatalf("Failed to build generic config: %v", err)
43+
}
44+
if genericConfig.StorageObjectCountTracker == nil {
45+
t.Errorf("genericConfig StorageObjectCountTracker is absent")
46+
}
47+
if genericConfig.StorageObjectCountTracker != storageFactory.StorageConfig.StorageObjectCountTracker {
48+
t.Errorf("There are different StorageObjectCountTracker in genericConfig and storageFactory")
49+
}
50+
51+
restOptions, err := genericConfig.RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: "", Resource: ""})
52+
if err != nil {
53+
t.Fatal(err)
54+
}
55+
if restOptions.StorageConfig.StorageObjectCountTracker != genericConfig.StorageObjectCountTracker {
56+
t.Errorf("There are different StorageObjectCountTracker in restOptions and serverConfig")
57+
}
58+
}

staging/src/k8s.io/apiserver/pkg/server/options/etcd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ func (f *StorageFactoryRestOptionsFactory) GetRESTOptions(resource schema.GroupR
396396
EnableGarbageCollection: f.Options.EnableGarbageCollection,
397397
ResourcePrefix: f.StorageFactory.ResourcePrefix(resource),
398398
CountMetricPollPeriod: f.Options.StorageConfig.CountMetricPollPeriod,
399-
StorageObjectCountTracker: f.Options.StorageConfig.StorageObjectCountTracker,
399+
StorageObjectCountTracker: storageConfig.StorageObjectCountTracker,
400400
}
401401

402402
if f.Options.EnableWatchCache {

staging/src/k8s.io/apiserver/pkg/server/options/etcd_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,3 +430,18 @@ func healthChecksAreEqual(t *testing.T, want []string, healthChecks []healthz.He
430430
t.Errorf("%s checks are not equal, missing=%q, extra=%q", checkerType, wantSet.Difference(gotSet).List(), gotSet.Difference(wantSet).List())
431431
}
432432
}
433+
434+
func TestRestOptionsStorageObjectCountTracker(t *testing.T) {
435+
serverConfig := server.NewConfig(codecs)
436+
etcdOptions := &EtcdOptions{}
437+
if err := etcdOptions.ApplyTo(serverConfig); err != nil {
438+
t.Fatalf("Failed to apply etcd options error: %v", err)
439+
}
440+
restOptions, err := serverConfig.RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: "", Resource: ""})
441+
if err != nil {
442+
t.Fatal(err)
443+
}
444+
if restOptions.StorageConfig.StorageObjectCountTracker != serverConfig.StorageObjectCountTracker {
445+
t.Errorf("There are different StorageObjectCountTracker in restOptions and serverConfig")
446+
}
447+
}

0 commit comments

Comments
 (0)