X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/1e31ae09539d8265820a2f75f8a981f7d415ef58..78e0599b0773976167ccb720fc1596236295337a:/services/keepproxy/keepproxy.go diff --git a/services/keepproxy/keepproxy.go b/services/keepproxy/keepproxy.go index ea14c6ca48..581f7f4873 100644 --- a/services/keepproxy/keepproxy.go +++ b/services/keepproxy/keepproxy.go @@ -134,16 +134,27 @@ type ApiTokenCache struct { // Refresh the keep service list every five minutes. func RefreshServicesList(kc *keepclient.KeepClient) { + var sleeptime time.Duration for { - time.Sleep(300 * time.Second) oldservices := kc.ServiceRoots() - kc.DiscoverKeepServers() - newservices := kc.ServiceRoots() - s1 := fmt.Sprint(oldservices) - s2 := fmt.Sprint(newservices) - if s1 != s2 { - log.Printf("Updated server list to %v", s2) + newservices, err := kc.DiscoverKeepServers() + if err == nil && len(newservices) > 0 { + s1 := fmt.Sprint(oldservices) + s2 := fmt.Sprint(newservices) + if s1 != s2 { + log.Printf("Updated server list to %v", s2) + } + sleeptime = 300 * time.Second + } else { + // There was an error, or the list is empty, so wait 3 seconds and try again. + if err != nil { + log.Printf("Error retrieving server list: %v", err) + } else { + log.Printf("Retrieved an empty server list") + } + sleeptime = 3 * time.Second } + time.Sleep(sleeptime) } } @@ -312,14 +323,14 @@ func (this GetBlockHandler) ServeHTTP(resp http.ResponseWriter, req *http.Reques if req.Method == "GET" { reader, blocklen, _, err = kc.AuthorizedGet(hash, locator.Signature, locator.Timestamp) - defer reader.Close() + if reader != nil { + defer reader.Close() + } } else if req.Method == "HEAD" { blocklen, _, err = kc.AuthorizedAsk(hash, locator.Signature, locator.Timestamp) } - if blocklen > -1 { - resp.Header().Set("Content-Length", fmt.Sprint(blocklen)) - } else { + if blocklen == -1 { log.Printf("%s: %s %s Keep server did not return Content-Length", GetRemoteAddress(req), req.Method, hash) } @@ -328,6 +339,7 @@ func (this GetBlockHandler) ServeHTTP(resp http.ResponseWriter, req *http.Reques switch err { case nil: status = http.StatusOK + resp.Header().Set("Content-Length", fmt.Sprint(blocklen)) if reader != nil { n, err2 := io.Copy(resp, reader) if blocklen > -1 && n != blocklen { @@ -345,7 +357,7 @@ func (this GetBlockHandler) ServeHTTP(resp http.ResponseWriter, req *http.Reques } case keepclient.BlockNotFound: status = http.StatusNotFound - http.Error(resp, "Not found", http.StatusNotFound) + http.Error(resp, "Not Found", http.StatusNotFound) default: status = http.StatusBadGateway http.Error(resp, err.Error(), http.StatusBadGateway)