13994: Fix service discovery race.
authorTom Clegg <tclegg@veritasgenetics.com>
Mon, 17 Sep 2018 18:33:59 +0000 (14:33 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Mon, 17 Sep 2018 18:33:59 +0000 (14:33 -0400)
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 <tclegg@veritasgenetics.com>

sdk/go/keepclient/discover.go

index 6778b39fbc8369fbcae4646071aa49dd19227f74..4377c1951528c4eab88a3525934669c9457f954c 100644 (file)
@@ -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()