X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7c7dc19ffa0a20fff6d97e51c874bfaca9596b24..46f0c0faf4f032697d59c2d663018ae67d1059d4:/sdk/go/keepclient/discover.go?ds=sidebyside diff --git a/sdk/go/keepclient/discover.go b/sdk/go/keepclient/discover.go index c5413d4a4b..5eafbbe339 100644 --- a/sdk/go/keepclient/discover.go +++ b/sdk/go/keepclient/discover.go @@ -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,21 +16,28 @@ 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. -func ClearCache() { +// 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. -func ClearCacheOnSIGHUP() { +// RefreshServiceDiscoveryOnSIGHUP installs a signal handler that calls +// RefreshServiceDiscovery when SIGHUP is received. +func RefreshServiceDiscoveryOnSIGHUP() { svcListCacheMtx.Lock() defer svcListCacheMtx.Unlock() if svcListCacheSignal != nil { @@ -35,7 +47,7 @@ func ClearCacheOnSIGHUP() { signal.Notify(svcListCacheSignal, syscall.SIGHUP) go func() { for range svcListCacheSignal { - ClearCache() + RefreshServiceDiscovery() } }() } @@ -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