diff --git a/server/const.go b/server/const.go index 313adf24..5895b4a9 100644 --- a/server/const.go +++ b/server/const.go @@ -40,4 +40,8 @@ const ( DEFAULT_FLUSH_DEADLINE = 500 * time.Millisecond DEFAULT_HTTP_PORT = 8333 + + // Accept sleep times on temporary errors + ACCEPT_MIN_SLEEP = 10 * time.Millisecond + ACCEPT_MAX_SLEEP = 1 * time.Second ) diff --git a/server/server.go b/server/server.go index 271c1352..7b07c96c 100644 --- a/server/server.go +++ b/server/server.go @@ -173,14 +173,25 @@ func (s *Server) AcceptLoop() { s.running = true s.mu.Unlock() + tmpDelay := ACCEPT_MIN_SLEEP + for s.isRunning() { conn, err := l.Accept() if err != nil { if ne, ok := err.(net.Error); ok && ne.Temporary() { + Debug("Temporary Accept Error(%v), sleeping %dms", + ne, tmpDelay/time.Millisecond) + time.Sleep(tmpDelay) + tmpDelay *= 2 + if tmpDelay > ACCEPT_MAX_SLEEP { + tmpDelay = ACCEPT_MAX_SLEEP + } + } else { Logf("Accept error: %v", err) } continue } + tmpDelay = ACCEPT_MIN_SLEEP s.createClient(conn) } s.done <- true