Skip to content

Commit 5dbbc58

Browse files
seans3k8s-publishing-bot
authored andcommitted
Tolerate empty discovery response in memcache client
Kubernetes-commit: 6e8addd9a0a9e2983e3040e337b1b7ba6df83d87
1 parent 62133a9 commit 5dbbc58

1 file changed

Lines changed: 25 additions & 3 deletions

File tree

discovery/cached/memory/memcache.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/client-go/openapi"
3434
cachedopenapi "k8s.io/client-go/openapi/cached"
3535
restclient "k8s.io/client-go/rest"
36+
"k8s.io/klog/v2"
3637
)
3738

3839
type cacheEntry struct {
@@ -61,6 +62,15 @@ var (
6162
ErrCacheNotFound = errors.New("not found")
6263
)
6364

65+
// Server returning empty ResourceList for Group/Version.
66+
type emptyResponseError struct {
67+
gv string
68+
}
69+
70+
func (e *emptyResponseError) Error() string {
71+
return fmt.Sprintf("received empty response for: %s", e.gv)
72+
}
73+
6474
var _ discovery.CachedDiscoveryInterface = &memCacheClient{}
6575

6676
// isTransientConnectionError checks whether given error is "Connection refused" or
@@ -103,7 +113,13 @@ func (d *memCacheClient) ServerResourcesForGroupVersion(groupVersion string) (*m
103113
if cachedVal.err != nil && isTransientError(cachedVal.err) {
104114
r, err := d.serverResourcesForGroupVersion(groupVersion)
105115
if err != nil {
106-
utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", groupVersion, err))
116+
// Don't log "empty response" as an error; it is a common response for metrics.
117+
if _, emptyErr := err.(*emptyResponseError); emptyErr {
118+
// Log at same verbosity as disk cache.
119+
klog.V(3).Infof("%v", err)
120+
} else {
121+
utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", groupVersion, err))
122+
}
107123
}
108124
cachedVal = &cacheEntry{r, err}
109125
d.groupToServerResources[groupVersion] = cachedVal
@@ -252,7 +268,13 @@ func (d *memCacheClient) refreshLocked() error {
252268

253269
r, err := d.serverResourcesForGroupVersion(gv)
254270
if err != nil {
255-
utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", gv, err))
271+
// Don't log "empty response" as an error; it is a common response for metrics.
272+
if _, emptyErr := err.(*emptyResponseError); emptyErr {
273+
// Log at same verbosity as disk cache.
274+
klog.V(3).Infof("%v", err)
275+
} else {
276+
utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", gv, err))
277+
}
256278
}
257279

258280
resultLock.Lock()
@@ -274,7 +296,7 @@ func (d *memCacheClient) serverResourcesForGroupVersion(groupVersion string) (*m
274296
return r, err
275297
}
276298
if len(r.APIResources) == 0 {
277-
return r, fmt.Errorf("Got empty response for: %v", groupVersion)
299+
return r, &emptyResponseError{gv: groupVersion}
278300
}
279301
return r, nil
280302
}

0 commit comments

Comments
 (0)