From: Tom Clegg Date: Mon, 17 Sep 2018 18:33:59 +0000 (-0400) Subject: 13994: Fix service discovery race. X-Git-Tag: 1.3.0~108^2~2 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/ddc180fa5200d9d8fac59cc5041d7d452b68e6a2 13994: Fix service discovery race. Making keepclient.RefreshServiceDiscovery asynchronous didn't work out: tests rely on it to ensure old services won't be used. Instead, speed things up a bit by refreshing all known clients' service lists concurrently instead of serially. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- diff --git a/sdk/go/keepclient/discover.go b/sdk/go/keepclient/discover.go index 6778b39fbc..4377c19515 100644 --- a/sdk/go/keepclient/discover.go +++ b/sdk/go/keepclient/discover.go @@ -22,12 +22,15 @@ import ( func RefreshServiceDiscovery() { svcListCacheMtx.Lock() defer svcListCacheMtx.Unlock() + var wg sync.WaitGroup for _, ent := range svcListCache { - select { - case ent.clear <- struct{}{}: - default: - } + wg.Add(1) + go func() { + ent.clear <- struct{}{} + wg.Done() + }() } + wg.Wait() } // ClearCacheOnSIGHUP installs a signal handler that calls @@ -139,7 +142,7 @@ func (kc *KeepClient) discoverServices() error { arv := *kc.Arvados cacheEnt = cachedSvcList{ latest: make(chan svcList), - clear: make(chan struct{}, 1), + clear: make(chan struct{}), arv: &arv, } go cacheEnt.poll()