Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 64ce2e5

Browse files
authored
Merge pull request kubernetes#73345 from sttts/sttts-speedup-cache-miss-kubectl
discovery: speedup kubectl restmapper cache misses by a two-digit factor
2 parents dad8bc8 + 2cdddd8 commit 64ce2e5

File tree

12 files changed

+354
-81
lines changed

12 files changed

+354
-81
lines changed

pkg/controller/garbagecollector/garbagecollector_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,10 +948,15 @@ func (_ *fakeServerResources) ServerResourcesForGroupVersion(groupVersion string
948948
return nil, nil
949949
}
950950

951+
// Deprecated: use ServerGroupsAndResources instead.
951952
func (_ *fakeServerResources) ServerResources() ([]*metav1.APIResourceList, error) {
952953
return nil, nil
953954
}
954955

956+
func (_ *fakeServerResources) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
957+
return nil, nil, nil
958+
}
959+
955960
func (f *fakeServerResources) ServerPreferredResources() ([]*metav1.APIResourceList, error) {
956961
f.Lock.Lock()
957962
defer f.Lock.Unlock()

pkg/kubectl/cmd/testing/fake.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,15 @@ func (d *fakeCachedDiscoveryClient) Fresh() bool {
275275
func (d *fakeCachedDiscoveryClient) Invalidate() {
276276
}
277277

278+
// Deprecated: use ServerGroupsAndResources instead.
278279
func (d *fakeCachedDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) {
279280
return []*metav1.APIResourceList{}, nil
280281
}
281282

283+
func (d *fakeCachedDiscoveryClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
284+
return []*metav1.APIGroup{}, []*metav1.APIResourceList{}, nil
285+
}
286+
282287
// TestFactory extends cmdutil.Factory
283288
type TestFactory struct {
284289
cmdutil.Factory

pkg/kubectl/cmd/top/top_pod_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,10 +405,16 @@ func (d *fakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*me
405405
}
406406

407407
// ServerResources returns the supported resources for all groups and versions.
408+
// Deprecated: use ServerGroupsAndResources instead.
408409
func (d *fakeDiscovery) ServerResources() ([]*metav1.APIResourceList, error) {
409410
return nil, nil
410411
}
411412

413+
// ServerGroupsAndResources returns the supported groups and resources for all groups and versions.
414+
func (d *fakeDiscovery) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
415+
return nil, nil, nil
416+
}
417+
412418
// ServerPreferredResources returns the supported resources with the version preferred by the
413419
// server.
414420
func (d *fakeDiscovery) ServerPreferredResources() ([]*metav1.APIResourceList, error) {

staging/src/k8s.io/client-go/discovery/cached/memcache.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,16 @@ func (d *memCacheClient) ServerResourcesForGroupVersion(groupVersion string) (*m
118118
}
119119

120120
// ServerResources returns the supported resources for all groups and versions.
121+
// Deprecated: use ServerGroupsAndResources instead.
121122
func (d *memCacheClient) ServerResources() ([]*metav1.APIResourceList, error) {
122123
return discovery.ServerResources(d)
123124
}
124125

126+
// ServerGroupsAndResources returns the groups and supported resources for all groups and versions.
127+
func (d *memCacheClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
128+
return discovery.ServerGroupsAndResources(d)
129+
}
130+
125131
func (d *memCacheClient) ServerGroups() (*metav1.APIGroupList, error) {
126132
d.lock.Lock()
127133
defer d.lock.Unlock()

staging/src/k8s.io/client-go/discovery/cached_discovery.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,15 @@ func (d *CachedDiscoveryClient) ServerResourcesForGroupVersion(groupVersion stri
9090
}
9191

9292
// ServerResources returns the supported resources for all groups and versions.
93+
// Deprecated: use ServerGroupsAndResources instead.
9394
func (d *CachedDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) {
94-
return ServerResources(d)
95+
_, rs, err := ServerGroupsAndResources(d)
96+
return rs, err
97+
}
98+
99+
// ServerGroupsAndResources returns the supported groups and resources for all groups and versions.
100+
func (d *CachedDiscoveryClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
101+
return ServerGroupsAndResources(d)
95102
}
96103

97104
// ServerGroups returns the supported groups, with information like supported versions and the

staging/src/k8s.io/client-go/discovery/cached_discovery_test.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ func (c *fakeDiscoveryClient) RESTClient() restclient.Interface {
112112

113113
func (c *fakeDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) {
114114
c.groupCalls = c.groupCalls + 1
115+
return c.serverGroups()
116+
}
117+
118+
func (c *fakeDiscoveryClient) serverGroups() (*metav1.APIGroupList, error) {
115119
return &metav1.APIGroupList{
116120
Groups: []metav1.APIGroup{
117121
{
@@ -140,12 +144,26 @@ func (c *fakeDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string
140144
return nil, errors.NewNotFound(schema.GroupResource{}, "")
141145
}
142146

147+
// Deprecated: use ServerGroupsAndResources instead.
143148
func (c *fakeDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) {
149+
_, rs, err := c.ServerGroupsAndResources()
150+
return rs, err
151+
}
152+
153+
func (c *fakeDiscoveryClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
144154
c.resourceCalls = c.resourceCalls + 1
155+
156+
gs, _ := c.serverGroups()
157+
resultGroups := []*metav1.APIGroup{}
158+
for i := range gs.Groups {
159+
resultGroups = append(resultGroups, &gs.Groups[i])
160+
}
161+
145162
if c.serverResourcesHandler != nil {
146-
return c.serverResourcesHandler()
163+
rs, err := c.serverResourcesHandler()
164+
return resultGroups, rs, err
147165
}
148-
return []*metav1.APIResourceList{}, nil
166+
return resultGroups, []*metav1.APIResourceList{}, nil
149167
}
150168

151169
func (c *fakeDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) {

staging/src/k8s.io/client-go/discovery/discovery_client.go

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,28 @@ type ServerResourcesInterface interface {
8888
// ServerResourcesForGroupVersion returns the supported resources for a group and version.
8989
ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error)
9090
// ServerResources returns the supported resources for all groups and versions.
91+
//
92+
// The returned resource list might be non-nil with partial results even in the case of
93+
// non-nil error.
94+
//
95+
// Deprecated: use ServerGroupsAndResources instead.
9196
ServerResources() ([]*metav1.APIResourceList, error)
97+
// ServerResources returns the supported groups and resources for all groups and versions.
98+
//
99+
// The returned group and resource lists might be non-nil with partial results even in the
100+
// case of non-nil error.
101+
ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error)
92102
// ServerPreferredResources returns the supported resources with the version preferred by the
93103
// server.
104+
//
105+
// The returned group and resource lists might be non-nil with partial results even in the
106+
// case of non-nil error.
94107
ServerPreferredResources() ([]*metav1.APIResourceList, error)
95108
// ServerPreferredNamespacedResources returns the supported namespaced resources with the
96109
// version preferred by the server.
110+
//
111+
// The returned resource list might be non-nil with partial results even in the case of
112+
// non-nil error.
97113
ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error)
98114
}
99115

@@ -191,14 +207,18 @@ func (d *DiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (r
191207
return resources, nil
192208
}
193209

194-
// serverResources returns the supported resources for all groups and versions.
195-
func (d *DiscoveryClient) serverResources() ([]*metav1.APIResourceList, error) {
196-
return ServerResources(d)
197-
}
198-
199210
// ServerResources returns the supported resources for all groups and versions.
211+
// Deprecated: use ServerGroupsAndResources instead.
200212
func (d *DiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) {
201-
return withRetries(defaultRetries, d.serverResources)
213+
_, rs, err := d.ServerGroupsAndResources()
214+
return rs, err
215+
}
216+
217+
// ServerGroupsAndResources returns the supported resources for all groups and versions.
218+
func (d *DiscoveryClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
219+
return withRetries(defaultRetries, func() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
220+
return ServerGroupsAndResources(d)
221+
})
202222
}
203223

204224
// ErrGroupDiscoveryFailed is returned if one or more API groups fail to load.
@@ -224,23 +244,28 @@ func IsGroupDiscoveryFailedError(err error) bool {
224244
return err != nil && ok
225245
}
226246

227-
// serverPreferredResources returns the supported resources with the version preferred by the server.
228-
func (d *DiscoveryClient) serverPreferredResources() ([]*metav1.APIResourceList, error) {
229-
return ServerPreferredResources(d)
230-
}
231-
232247
// ServerResources uses the provided discovery interface to look up supported resources for all groups and versions.
248+
// Deprecated: use ServerGroupsAndResources instead.
233249
func ServerResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) {
234-
apiGroups, err := d.ServerGroups()
235-
if err != nil {
236-
return nil, err
250+
_, rs, err := ServerGroupsAndResources(d)
251+
return rs, err
252+
}
253+
254+
func ServerGroupsAndResources(d DiscoveryInterface) ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
255+
sgs, err := d.ServerGroups()
256+
if sgs == nil {
257+
return nil, nil, err
258+
}
259+
resultGroups := []*metav1.APIGroup{}
260+
for i := range sgs.Groups {
261+
resultGroups = append(resultGroups, &sgs.Groups[i])
237262
}
238263

239-
groupVersionResources, failedGroups := fetchGroupVersionResources(d, apiGroups)
264+
groupVersionResources, failedGroups := fetchGroupVersionResources(d, sgs)
240265

241266
// order results by group/version discovery order
242267
result := []*metav1.APIResourceList{}
243-
for _, apiGroup := range apiGroups.Groups {
268+
for _, apiGroup := range sgs.Groups {
244269
for _, version := range apiGroup.Versions {
245270
gv := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version}
246271
if resources, ok := groupVersionResources[gv]; ok {
@@ -250,10 +275,10 @@ func ServerResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) {
250275
}
251276

252277
if len(failedGroups) == 0 {
253-
return result, nil
278+
return resultGroups, result, nil
254279
}
255280

256-
return result, &ErrGroupDiscoveryFailed{Groups: failedGroups}
281+
return resultGroups, result, &ErrGroupDiscoveryFailed{Groups: failedGroups}
257282
}
258283

259284
// ServerPreferredResources uses the provided discovery interface to look up preferred resources
@@ -317,7 +342,7 @@ func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList,
317342
return result, &ErrGroupDiscoveryFailed{Groups: failedGroups}
318343
}
319344

320-
// fetchServerResourcesForGroupVersions uses the discovery client to fetch the resources for the specified groups in parallel
345+
// fetchServerResourcesForGroupVersions uses the discovery client to fetch the resources for the specified groups in parallel.
321346
func fetchGroupVersionResources(d DiscoveryInterface, apiGroups *metav1.APIGroupList) (map[schema.GroupVersion]*metav1.APIResourceList, map[schema.GroupVersion]error) {
322347
groupVersionResources := make(map[schema.GroupVersion]*metav1.APIResourceList)
323348
failedGroups := make(map[schema.GroupVersion]error)
@@ -341,7 +366,9 @@ func fetchGroupVersionResources(d DiscoveryInterface, apiGroups *metav1.APIGroup
341366
if err != nil {
342367
// TODO: maybe restrict this to NotFound errors
343368
failedGroups[groupVersion] = err
344-
} else {
369+
}
370+
if apiResourceList != nil {
371+
// even in case of error, some fallback might have been returned
345372
groupVersionResources[groupVersion] = apiResourceList
346373
}
347374
}()
@@ -355,7 +382,11 @@ func fetchGroupVersionResources(d DiscoveryInterface, apiGroups *metav1.APIGroup
355382
// ServerPreferredResources returns the supported resources with the version preferred by the
356383
// server.
357384
func (d *DiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) {
358-
return withRetries(defaultRetries, d.serverPreferredResources)
385+
_, rs, err := withRetries(defaultRetries, func() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
386+
rs, err := ServerPreferredResources(d)
387+
return nil, rs, err
388+
})
389+
return rs, err
359390
}
360391

361392
// ServerPreferredNamespacedResources returns the supported namespaced resources with the
@@ -410,19 +441,20 @@ func (d *DiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) {
410441
}
411442

412443
// withRetries retries the given recovery function in case the groups supported by the server change after ServerGroup() returns.
413-
func withRetries(maxRetries int, f func() ([]*metav1.APIResourceList, error)) ([]*metav1.APIResourceList, error) {
444+
func withRetries(maxRetries int, f func() ([]*metav1.APIGroup, []*metav1.APIResourceList, error)) ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
414445
var result []*metav1.APIResourceList
446+
var resultGroups []*metav1.APIGroup
415447
var err error
416448
for i := 0; i < maxRetries; i++ {
417-
result, err = f()
449+
resultGroups, result, err = f()
418450
if err == nil {
419-
return result, nil
451+
return resultGroups, result, nil
420452
}
421453
if _, ok := err.(*ErrGroupDiscoveryFailed); !ok {
422-
return nil, err
454+
return nil, nil, err
423455
}
424456
}
425-
return result, err
457+
return resultGroups, result, err
426458
}
427459

428460
func setDiscoveryDefaults(config *restclient.Config) error {

staging/src/k8s.io/client-go/discovery/fake/discovery.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,29 @@ func (c *FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*me
5353
}
5454

5555
// ServerResources returns the supported resources for all groups and versions.
56+
// Deprecated: use ServerGroupsAndResources instead.
5657
func (c *FakeDiscovery) ServerResources() ([]*metav1.APIResourceList, error) {
58+
_, rs, err := c.ServerGroupsAndResources()
59+
return rs, err
60+
}
61+
62+
// ServerGroupsAndResources returns the supported groups and resources for all groups and versions.
63+
func (c *FakeDiscovery) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
64+
sgs, err := c.ServerGroups()
65+
if err != nil {
66+
return nil, nil, err
67+
}
68+
resultGroups := []*metav1.APIGroup{}
69+
for i := range sgs.Groups {
70+
resultGroups = append(resultGroups, &sgs.Groups[i])
71+
}
72+
5773
action := testing.ActionImpl{
5874
Verb: "get",
5975
Resource: schema.GroupVersionResource{Resource: "resource"},
6076
}
6177
c.Invokes(action, nil)
62-
return c.Resources, nil
78+
return resultGroups, c.Resources, nil
6379
}
6480

6581
// ServerPreferredResources returns the supported resources with the version

staging/src/k8s.io/client-go/restmapper/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ go_test(
3636
"//staging/src/k8s.io/client-go/discovery:go_default_library",
3737
"//staging/src/k8s.io/client-go/rest:go_default_library",
3838
"//staging/src/k8s.io/client-go/rest/fake:go_default_library",
39+
"//vendor/github.com/davecgh/go-spew/spew:go_default_library",
3940
"//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library",
4041
"//vendor/github.com/stretchr/testify/assert:go_default_library",
4142
],

staging/src/k8s.io/client-go/restmapper/discovery.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -145,27 +145,26 @@ func NewDiscoveryRESTMapper(groupResources []*APIGroupResources) meta.RESTMapper
145145
// GetAPIGroupResources uses the provided discovery client to gather
146146
// discovery information and populate a slice of APIGroupResources.
147147
func GetAPIGroupResources(cl discovery.DiscoveryInterface) ([]*APIGroupResources, error) {
148-
apiGroups, err := cl.ServerGroups()
149-
if err != nil {
150-
if apiGroups == nil || len(apiGroups.Groups) == 0 {
151-
return nil, err
152-
}
148+
gs, rs, err := cl.ServerGroupsAndResources()
149+
if rs == nil || gs == nil {
150+
return nil, err
153151
// TODO track the errors and update callers to handle partial errors.
154152
}
153+
rsm := map[string]*metav1.APIResourceList{}
154+
for _, r := range rs {
155+
rsm[r.GroupVersion] = r
156+
}
157+
155158
var result []*APIGroupResources
156-
for _, group := range apiGroups.Groups {
159+
for _, group := range gs {
157160
groupResources := &APIGroupResources{
158-
Group: group,
161+
Group: *group,
159162
VersionedResources: make(map[string][]metav1.APIResource),
160163
}
161164
for _, version := range group.Versions {
162-
resources, err := cl.ServerResourcesForGroupVersion(version.GroupVersion)
163-
if err != nil {
164-
// continue as best we can
165-
// TODO track the errors and update callers to handle partial errors.
166-
if resources == nil || len(resources.APIResources) == 0 {
167-
continue
168-
}
165+
resources, ok := rsm[version.GroupVersion]
166+
if !ok {
167+
continue
169168
}
170169
groupResources.VersionedResources[version.Version] = resources.APIResources
171170
}

0 commit comments

Comments
 (0)