From: Brad Fitzpatrick Date: Tue, 14 Feb 2012 04:04:29 +0000 (+1100) Subject: net/http: don't spin on temporary accept failure X-Git-Tag: weekly.2012-02-14~48 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=913abfee3bd25af5d80b3b9079d22f8e296d94c8;p=gostls13.git net/http: don't spin on temporary accept failure R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5658049 --- diff --git a/src/pkg/net/http/server.go b/src/pkg/net/http/server.go index fb3bc81756..e715c73cb6 100644 --- a/src/pkg/net/http/server.go +++ b/src/pkg/net/http/server.go @@ -1007,15 +1007,26 @@ func (srv *Server) ListenAndServe() error { // then call srv.Handler to reply to them. func (srv *Server) Serve(l net.Listener) error { defer l.Close() + var tempDelay time.Duration // how long to sleep on accept failure for { rw, e := l.Accept() if e != nil { if ne, ok := e.(net.Error); ok && ne.Temporary() { - log.Printf("http: Accept error: %v", e) + if tempDelay == 0 { + tempDelay = 5 * time.Millisecond + } else { + tempDelay *= 2 + } + if max := 1 * time.Second; tempDelay > max { + tempDelay = max + } + log.Printf("http: Accept error: %v; retrying in %v", e, tempDelay) + time.Sleep(tempDelay) continue } return e } + tempDelay = 0 if srv.ReadTimeout != 0 { rw.SetReadDeadline(time.Now().Add(srv.ReadTimeout)) }