+ go cacheEnt.poll()
+ svcListCache[kc.Arvados.ApiServer] = cacheEnt
+ }
+ svcListCacheMtx.Unlock()
+
+ 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
+// given JSON and disables automatic service discovery.
+func (kc *KeepClient) LoadKeepServicesFromJSON(services string) error {
+ kc.disableDiscovery = true
+
+ var list svcList
+ dec := json.NewDecoder(strings.NewReader(services))
+ if err := dec.Decode(&list); err != nil {
+ return err