import (
"encoding/json"
+ "errors"
"fmt"
"log"
"os"
"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()
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 {
}
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