Skip to content

Commit 690ac51

Browse files
authored
Merge pull request #583 from Iceber/optimize_code
kubeapiserver/discovery: use sets.Set[T] instead of `map[T]struct{}` and optimze other code
2 parents 77c48ae + b3d01ed commit 690ac51

File tree

4 files changed

+31
-46
lines changed

4 files changed

+31
-46
lines changed

pkg/kubeapiserver/discovery/discovery.go

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type APIGroupSource interface {
2323
type ResourceDiscoveryAPI struct {
2424
Group string
2525
Resource metav1.APIResource
26-
Versions map[schema.GroupVersion]struct{}
26+
Versions sets.Set[schema.GroupVersion]
2727
}
2828

2929
// DiscoveryManager 管理集群的 discovery api,并处理 /api 和 /apis 的请求
@@ -91,11 +91,7 @@ func (m *DiscoveryManager) ResourceEnabled(cluster string, gvr schema.GroupVersi
9191
handlers := m.versionHandler.handlers.Load().(map[string]*versionDiscoveryHandler)
9292
handler = handlers[cluster]
9393
}
94-
95-
if handler == nil {
96-
return false
97-
}
98-
return handler.gvrs.Has(gvr.String())
94+
return handler != nil && handler.gvrs.Has(gvr.String())
9995
}
10096

10197
func (m *DiscoveryManager) ServeHTTP(w http.ResponseWriter, req *http.Request) {
@@ -164,10 +160,8 @@ func (m *DiscoveryManager) handleLegacyAPI(pathParts []string, w http.ResponseWr
164160
}
165161

166162
func (m *DiscoveryManager) SetClusterGroupResource(cluster string, apis map[schema.GroupResource]ResourceDiscoveryAPI) {
167-
groups := sets.Set[string]{}
168163
apiversions := make(map[schema.GroupVersion][]metav1.APIResource)
169-
for gr, api := range apis {
170-
groups.Insert(gr.Group)
164+
for _, api := range apis {
171165
for version := range api.Versions {
172166
apiversions[version] = append(apiversions[version], api.Resource)
173167
}
@@ -185,13 +179,8 @@ func (m *DiscoveryManager) SetClusterGroupResource(cluster string, apis map[sche
185179
m.versionHandler.setClusterDiscoveryAPI(cluster, apiversions)
186180
m.versionHandler.rebuildGlobalDiscoveryAPI()
187181

188-
groupversions := make(map[schema.GroupVersion]struct{}, len(apiversions))
189-
for gv := range apiversions {
190-
groupversions[gv] = struct{}{}
191-
}
192-
193182
allgroups := m.groupSource.GetAPIGroups()
194-
apigroups := buildAPIGroups(groups, groupversions, allgroups)
183+
apigroups := buildAPIGroups(sets.KeySet(apiversions), allgroups)
195184

196185
currentgroups := m.groupHandler.getClusterDiscoveryAPI(cluster)
197186
if reflect.DeepEqual(apigroups, currentgroups) {
@@ -220,11 +209,9 @@ func (m *DiscoveryManager) rebuildClusterDiscoveryAPI(cluster string) {
220209

221210
apigroups := make([]metav1.APIGroup, 0, len(currentgroups))
222211
for name, group := range currentgroups {
223-
if name == "" {
224-
continue
212+
if name != "" {
213+
apigroups = append(apigroups, group)
225214
}
226-
227-
apigroups = append(apigroups, group)
228215
}
229216
sortAPIGroupByName(apigroups)
230217

@@ -237,10 +224,9 @@ func (m *DiscoveryManager) rebuildGlobalDiscoveryAPI() {
237224

238225
apigroups := make([]metav1.APIGroup, 0, len(currentgroups))
239226
for name, group := range currentgroups {
240-
if name == "" {
241-
continue
227+
if name != "" {
228+
apigroups = append(apigroups, group)
242229
}
243-
apigroups = append(apigroups, group)
244230
}
245231
sortAPIGroupByName(apigroups)
246232

pkg/kubeapiserver/discovery/group.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,24 @@ func (h *clusterGroupDiscoveryHandler) removeClusterDiscoveryAPI(cluster string)
105105

106106
handlers := make(map[string]*groupDiscoveryHandler, len(currentHandlers)-1)
107107
for name, handler := range currentHandlers {
108-
if name == cluster {
109-
continue
108+
if name != cluster {
109+
handlers[name] = handler
110110
}
111-
handlers[name] = handler
112111
}
113112
h.handlers.Store(handlers)
114113
}
115114

116115
func (h *clusterGroupDiscoveryHandler) rebuildGlobalDiscoveryAPI(source map[string]metav1.APIGroup) {
117-
groups := sets.Set[string]{}
118-
groupversions := make(map[schema.GroupVersion]struct{})
116+
groupversions := sets.Set[schema.GroupVersion]{}
119117
for _, handler := range h.handlers.Load().(map[string]*groupDiscoveryHandler) {
120118
for group, apiGroup := range handler.groups {
121-
groups.Insert(group)
122119
for _, version := range apiGroup.Versions {
123-
groupversions[schema.GroupVersion{Group: group, Version: version.Version}] = struct{}{}
120+
groupversions.Insert(schema.GroupVersion{Group: group, Version: version.Version})
124121
}
125122
}
126123
}
127124

128-
apiGroups := buildAPIGroups(groups, groupversions, source)
125+
apiGroups := buildAPIGroups(groupversions, source)
129126
h.global.Store(&groupDiscoveryHandler{
130127
serializer: h.serializer,
131128
stripVersionNegotiatedSerializer: h.stripVersionNegotiatedSerializer,
@@ -134,9 +131,12 @@ func (h *clusterGroupDiscoveryHandler) rebuildGlobalDiscoveryAPI(source map[stri
134131
})
135132
}
136133

137-
func buildAPIGroups(groups sets.Set[string], groupversions map[schema.GroupVersion]struct{}, source map[string]metav1.APIGroup) map[string]metav1.APIGroup {
134+
func buildAPIGroups(groupversions sets.Set[schema.GroupVersion], source map[string]metav1.APIGroup) map[string]metav1.APIGroup {
135+
groups := sets.Set[string]{}
138136
unsortedVersions := make(map[string][]metav1.GroupVersionForDiscovery)
139137
for gv := range groupversions {
138+
groups.Insert(gv.Group)
139+
140140
if apiGroup := source[gv.Group]; len(apiGroup.Versions) == 0 {
141141
unsortedVersions[gv.Group] = append(unsortedVersions[gv.Group],
142142
metav1.GroupVersionForDiscovery{

pkg/kubeapiserver/discovery/version.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,18 @@ type clusterVersionDiscoveryHandler struct {
7575
}
7676

7777
func (h *clusterVersionDiscoveryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
78-
if cluster := request.ClusterNameValue(req.Context()); cluster != "" {
79-
handlers := h.handlers.Load().(map[string]*versionDiscoveryHandler)
80-
handler, ok := handlers[cluster]
81-
if !ok {
82-
h.delegate.ServeHTTP(w, req)
83-
return
84-
}
85-
86-
handler.ServeHTTP(w, req)
78+
cluster := request.ClusterNameValue(req.Context())
79+
if cluster == "" {
80+
h.global.Load().(*versionDiscoveryHandler).ServeHTTP(w, req)
8781
return
8882
}
8983

90-
h.global.Load().(*versionDiscoveryHandler).ServeHTTP(w, req)
84+
handlers := h.handlers.Load().(map[string]*versionDiscoveryHandler)
85+
if handler, ok := handlers[cluster]; !ok {
86+
h.delegate.ServeHTTP(w, req)
87+
} else {
88+
handler.ServeHTTP(w, req)
89+
}
9190
}
9291

9392
func (h *clusterVersionDiscoveryHandler) getClusterDiscoveryAPI(cluster string) map[schema.GroupVersion][]metav1.APIResource {
@@ -131,10 +130,9 @@ func (h *clusterVersionDiscoveryHandler) removeClusterDiscoveryAPI(cluster strin
131130

132131
handlers := make(map[string]*versionDiscoveryHandler, len(currentHandlers)-1)
133132
for name, handler := range currentHandlers {
134-
if name == cluster {
135-
continue
133+
if name != cluster {
134+
handlers[name] = handler
136135
}
137-
handlers[name] = handler
138136
}
139137
h.handlers.Store(handlers)
140138
}

pkg/kubeapiserver/restmanager.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"k8s.io/apimachinery/pkg/runtime/serializer/json"
1515
"k8s.io/apimachinery/pkg/runtime/serializer/protobuf"
1616
"k8s.io/apimachinery/pkg/runtime/serializer/versioning"
17+
"k8s.io/apimachinery/pkg/util/sets"
1718
"k8s.io/apiserver/pkg/endpoints/handlers"
1819
"k8s.io/apiserver/pkg/registry/rest"
1920
"k8s.io/client-go/restmapper"
@@ -153,10 +154,10 @@ func (m *RESTManager) LoadResources(infos ResourceInfoMap) map[schema.GroupResou
153154
api := discovery.ResourceDiscoveryAPI{
154155
Group: gr.Group,
155156
Resource: resource,
156-
Versions: make(map[schema.GroupVersion]struct{}, len(versions)),
157+
Versions: make(sets.Set[schema.GroupVersion], len(versions)),
157158
}
158159
for _, version := range versions {
159-
api.Versions[version] = struct{}{}
160+
api.Versions.Insert(version)
160161

161162
gvr := gr.WithVersion(version.Version)
162163
if _, ok := restinfos[gvr]; !ok {

0 commit comments

Comments
 (0)