// 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)
}
}
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)
}
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 {
}
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)