From 3513b6f2f7f9008458c101ffc98d6da607416428 Mon Sep 17 00:00:00 2001 From: W-Mark Kubacki Date: Sat, 16 Apr 2016 20:59:24 +0200 Subject: [PATCH] fileserver: When out of filedescriptors, spread retry attempts --- middleware/fileserver.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/middleware/fileserver.go b/middleware/fileserver.go index cb619dc54..b1c3d66d5 100644 --- a/middleware/fileserver.go +++ b/middleware/fileserver.go @@ -2,10 +2,12 @@ package middleware import ( "fmt" + "math/rand" "net/http" "os" "path" "path/filepath" + "strconv" "strings" ) @@ -65,7 +67,8 @@ func (fh *fileHandler) serveFile(w http.ResponseWriter, r *http.Request, name st return http.StatusForbidden, err } // Likely the server is under load and ran out of file descriptors - w.Header().Set("Retry-After", "5") // TODO: 5 seconds enough delay? Or too much? + backoff := int(3 + rand.Int31()%3) // 3–5 seconds to prevent a stampede + w.Header().Set("Retry-After", strconv.Itoa(backoff)) return http.StatusServiceUnavailable, err } defer f.Close()