lib/connections: Don't spin on accept failures (fixes #5025) (#5036)

This commit is contained in:
Jakob Borg 2018-06-27 08:24:30 +02:00 committed by GitHub
parent 950f4a8672
commit ff441d3b3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 0 deletions

View File

@ -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 {