From 190a72392ae712fbbee979e95a6017ccb578877d Mon Sep 17 00:00:00 2001 From: Joe Betz Date: Thu, 20 Feb 2020 13:40:23 -0800 Subject: [PATCH] Refresh discovery server resources for memCacheClient in parallel --- .../discovery/cached/memory/memcache.go | 23 ++++++-- .../discovery/cached/memory/memcache_test.go | 52 ++++++++++++------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/staging/src/k8s.io/client-go/discovery/cached/memory/memcache.go b/staging/src/k8s.io/client-go/discovery/cached/memory/memcache.go index 31e42156610..82a7cc470f3 100644 --- a/staging/src/k8s.io/client-go/discovery/cached/memory/memcache.go +++ b/staging/src/k8s.io/client-go/discovery/cached/memory/memcache.go @@ -190,16 +190,29 @@ func (d *memCacheClient) refreshLocked() error { return err } + wg := &sync.WaitGroup{} + resultLock := &sync.Mutex{} rl := map[string]*cacheEntry{} for _, g := range gl.Groups { for _, v := range g.Versions { - r, err := d.serverResourcesForGroupVersion(v.GroupVersion) - rl[v.GroupVersion] = &cacheEntry{r, err} - if err != nil { - utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", v.GroupVersion, err)) - } + gv := v.GroupVersion + wg.Add(1) + go func() { + defer wg.Done() + defer utilruntime.HandleCrash() + + r, err := d.serverResourcesForGroupVersion(gv) + if err != nil { + utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", gv, err)) + } + + resultLock.Lock() + defer resultLock.Unlock() + rl[gv] = &cacheEntry{r, err} + }() } } + wg.Wait() d.groupToServerResources, d.groupList = rl, gl d.cacheValid = true diff --git a/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go b/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go index 3a9d60da9bc..f8c2900cbb0 100644 --- a/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go +++ b/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go @@ -205,16 +205,22 @@ func TestServerGroupsFails(t *testing.T) { func TestPartialPermanentFailure(t *testing.T) { fake := &fakeDiscovery{ groupList: &metav1.APIGroupList{ - Groups: []metav1.APIGroup{{ - Name: "astronomy", - Versions: []metav1.GroupVersionForDiscovery{{ - GroupVersion: "astronomy/v8beta1", - Version: "v8beta1", - }, { - GroupVersion: "astronomy2/v8beta1", - Version: "v8beta1", - }}, - }}, + Groups: []metav1.APIGroup{ + { + Name: "astronomy", + Versions: []metav1.GroupVersionForDiscovery{{ + GroupVersion: "astronomy/v8beta1", + Version: "v8beta1", + }}, + }, + { + Name: "astronomy2", + Versions: []metav1.GroupVersionForDiscovery{{ + GroupVersion: "astronomy2/v8beta1", + Version: "v8beta1", + }}, + }, + }, }, resourceMap: map[string]*resourceMapEntry{ "astronomy/v8beta1": { @@ -286,16 +292,22 @@ func TestPartialPermanentFailure(t *testing.T) { func TestPartialRetryableFailure(t *testing.T) { fake := &fakeDiscovery{ groupList: &metav1.APIGroupList{ - Groups: []metav1.APIGroup{{ - Name: "astronomy", - Versions: []metav1.GroupVersionForDiscovery{{ - GroupVersion: "astronomy/v8beta1", - Version: "v8beta1", - }, { - GroupVersion: "astronomy2/v8beta1", - Version: "v8beta1", - }}, - }}, + Groups: []metav1.APIGroup{ + { + Name: "astronomy", + Versions: []metav1.GroupVersionForDiscovery{{ + GroupVersion: "astronomy/v8beta1", + Version: "v8beta1", + }}, + }, + { + Name: "astronomy2", + Versions: []metav1.GroupVersionForDiscovery{{ + GroupVersion: "astronomy2/v8beta1", + Version: "v8beta1", + }}, + }, + }, }, resourceMap: map[string]*resourceMapEntry{ "astronomy/v8beta1": {