From ff441d3b3ecd17e6551becd49dee1a29fea900dd Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 27 Jun 2018 08:24:30 +0200 Subject: [PATCH] lib/connections: Don't spin on accept failures (fixes #5025) (#5036) --- lib/connections/tcp_listen.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/connections/tcp_listen.go b/lib/connections/tcp_listen.go index 21205e119..5bd6661a2 100644 --- a/lib/connections/tcp_listen.go +++ b/lib/connections/tcp_listen.go @@ -79,6 +79,9 @@ func (t *tcpListener) Serve() { t.mapping = mapping t.mut.Unlock() + acceptFailures := 0 + const maxAcceptFailures = 10 + for { listener.SetDeadline(time.Now().Add(time.Second)) conn, err := listener.Accept() @@ -96,10 +99,21 @@ func (t *tcpListener) Serve() { if err != nil { if err, ok := err.(*net.OpError); !ok || !err.Timeout() { l.Warnln("Listen (BEP/tcp): Accepting connection:", err) + + acceptFailures++ + if acceptFailures > maxAcceptFailures { + // Return to restart the listener, because something + // seems permanently damaged. + return + } + + // Slightly increased delay for each failure. + time.Sleep(time.Duration(acceptFailures) * time.Second) } continue } + acceptFailures = 0 l.Debugln("Listen (BEP/tcp): connect from", conn.RemoteAddr()) if err := dialer.SetTCPOptions(conn); err != nil {