Merge branch '4253-gitolite-migration-wip'
[arvados.git] / services / keepproxy / keepproxy.go
index ea14c6ca48e89e59c5bc414dedfaf87e1ac0f782..581f7f48739fd2fef826ef6b6dfae6c9a8baefec 100644 (file)
@@ -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)