17417: Merge branch 'main' into 17417-add-arm64
[arvados.git] / sdk / go / keepclient / discover.go
index e2cd329fc4c22ccfdb73ff6099ce8c95f6f28d16..5eafbbe339a9d7d4baa29081a049aa5e924ac61f 100644 (file)
@@ -1,7 +1,12 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+
 package keepclient
 
 import (
        "encoding/json"
+       "errors"
        "fmt"
        "log"
        "os"
@@ -11,20 +16,27 @@ import (
        "syscall"
        "time"
 
-       "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+       "git.arvados.org/arvados.git/sdk/go/arvadosclient"
 )
 
-// ClearCache clears the Keep service discovery cache.
+// RefreshServiceDiscovery clears the Keep service discovery cache.
 func RefreshServiceDiscovery() {
+       var wg sync.WaitGroup
+       defer wg.Wait()
        svcListCacheMtx.Lock()
        defer svcListCacheMtx.Unlock()
        for _, ent := range svcListCache {
-               ent.clear <- struct{}{}
+               wg.Add(1)
+               clear := ent.clear
+               go func() {
+                       clear <- struct{}{}
+                       wg.Done()
+               }()
        }
 }
 
-// ClearCacheOnSIGHUP installs a signal handler that calls
-// ClearCache when SIGHUP is received.
+// RefreshServiceDiscoveryOnSIGHUP installs a signal handler that calls
+// RefreshServiceDiscovery when SIGHUP is received.
 func RefreshServiceDiscoveryOnSIGHUP() {
        svcListCacheMtx.Lock()
        defer svcListCacheMtx.Unlock()
@@ -126,6 +138,10 @@ func (kc *KeepClient) discoverServices() error {
                return nil
        }
 
+       if kc.Arvados.ApiServer == "" {
+               return fmt.Errorf("Arvados client is not configured (target API host is not set). Maybe env var ARVADOS_API_HOST should be set first?")
+       }
+
        svcListCacheMtx.Lock()
        cacheEnt, ok := svcListCache[kc.Arvados.ApiServer]
        if !ok {
@@ -140,7 +156,22 @@ func (kc *KeepClient) discoverServices() error {
        }
        svcListCacheMtx.Unlock()
 
-       return kc.loadKeepServers(<-cacheEnt.latest)
+       select {
+       case <-time.After(time.Minute):
+               return errors.New("timed out while getting initial list of keep services")
+       case sl := <-cacheEnt.latest:
+               return kc.loadKeepServers(sl)
+       }
+}
+
+func (kc *KeepClient) RefreshServiceDiscovery() {
+       svcListCacheMtx.Lock()
+       ent, ok := svcListCache[kc.Arvados.ApiServer]
+       svcListCacheMtx.Unlock()
+       if !ok || kc.Arvados.KeepServiceURIs != nil || kc.disableDiscovery {
+               return
+       }
+       ent.clear <- struct{}{}
 }
 
 // LoadKeepServicesFromJSON gets list of available keep services from