]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: don't spin on temporary accept failure
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 14 Feb 2012 04:04:29 +0000 (15:04 +1100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 14 Feb 2012 04:04:29 +0000 (15:04 +1100)
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5658049

src/pkg/net/http/server.go

index fb3bc817562d74fbdffacaf93dc7b76108fefbdf..e715c73cb6e9586d1757f4f84e8f97546185130a 100644 (file)
@@ -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))
                }