Skip to content

Commit c202f9d

Browse files
committed
correct laziness
1 parent 29c1fb6 commit c202f9d

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

pkg/client/apiutil/dynamicrestmapper.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package apiutil
1818

1919
import (
20+
"sync"
2021
"time"
2122

2223
"golang.org/x/time/rate"
@@ -57,7 +58,10 @@ type dynamicRESTMapper struct {
5758
client discovery.DiscoveryInterface
5859
staticMapper meta.RESTMapper
5960
limiter *dynamicLimiter
60-
lazy bool
61+
62+
lazy bool
63+
// Used for lazy init.
64+
initOnce sync.Once
6165
}
6266

6367
// WithLimiter sets the RESTMapper's underlying limiter to lim.
@@ -121,6 +125,16 @@ func (drm *dynamicRESTMapper) setStaticMapper() error {
121125
return nil
122126
}
123127

128+
// init initializes drm only once if drm is lazy.
129+
func (drm *dynamicRESTMapper) init() (err error) {
130+
drm.initOnce.Do(func() {
131+
if drm.lazy {
132+
err = drm.setStaticMapper()
133+
}
134+
})
135+
return err
136+
}
137+
124138
// reload reloads the static RESTMapper, and will return an error only
125139
// if a rate limit has been hit.
126140
func (drm *dynamicRESTMapper) reload() error {
@@ -134,6 +148,9 @@ func (drm *dynamicRESTMapper) reload() error {
134148
}
135149

136150
func (drm *dynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) {
151+
if err := drm.init(); err != nil {
152+
return schema.GroupVersionKind{}, err
153+
}
137154
gvk, err := drm.staticMapper.KindFor(resource)
138155
if xerrors.Is(err, &meta.NoKindMatchError{}) {
139156
if rerr := drm.reload(); rerr != nil {
@@ -145,6 +162,9 @@ func (drm *dynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (sch
145162
}
146163

147164
func (drm *dynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
165+
if err := drm.init(); err != nil {
166+
return nil, err
167+
}
148168
gvks, err := drm.staticMapper.KindsFor(resource)
149169
if xerrors.Is(err, &meta.NoKindMatchError{}) {
150170
if rerr := drm.reload(); rerr != nil {
@@ -156,6 +176,9 @@ func (drm *dynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]
156176
}
157177

158178
func (drm *dynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error) {
179+
if err := drm.init(); err != nil {
180+
return schema.GroupVersionResource{}, err
181+
}
159182
gvr, err := drm.staticMapper.ResourceFor(input)
160183
if xerrors.Is(err, &meta.NoKindMatchError{}) {
161184
if rerr := drm.reload(); rerr != nil {
@@ -167,6 +190,9 @@ func (drm *dynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (sc
167190
}
168191

169192
func (drm *dynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error) {
193+
if err := drm.init(); err != nil {
194+
return nil, err
195+
}
170196
gvrs, err := drm.staticMapper.ResourcesFor(input)
171197
if xerrors.Is(err, &meta.NoKindMatchError{}) {
172198
if rerr := drm.reload(); rerr != nil {
@@ -178,6 +204,9 @@ func (drm *dynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([
178204
}
179205

180206
func (drm *dynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) {
207+
if err := drm.init(); err != nil {
208+
return nil, err
209+
}
181210
mapping, err := drm.staticMapper.RESTMapping(gk, versions...)
182211
if xerrors.Is(err, &meta.NoKindMatchError{}) {
183212
if rerr := drm.reload(); rerr != nil {
@@ -189,6 +218,9 @@ func (drm *dynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...strin
189218
}
190219

191220
func (drm *dynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) {
221+
if err := drm.init(); err != nil {
222+
return nil, err
223+
}
192224
mappings, err := drm.staticMapper.RESTMappings(gk, versions...)
193225
if xerrors.Is(err, &meta.NoKindMatchError{}) {
194226
if rerr := drm.reload(); rerr != nil {
@@ -200,6 +232,9 @@ func (drm *dynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...stri
200232
}
201233

202234
func (drm *dynamicRESTMapper) ResourceSingularizer(resource string) (string, error) {
235+
if err := drm.init(); err != nil {
236+
return "", err
237+
}
203238
singular, err := drm.staticMapper.ResourceSingularizer(resource)
204239
if xerrors.Is(err, &meta.NoKindMatchError{}) {
205240
if rerr := drm.reload(); rerr != nil {

0 commit comments

Comments
 (0)