From 3e7042d8cd83574be5298c450b69733a17f6f453 Mon Sep 17 00:00:00 2001 From: Josh Rickmar Date: Tue, 7 Nov 2023 20:45:41 +0000 Subject: [PATCH] peer: select on p.quit during stall control chan writes Hangs at peer disconnect were observed due to the blocking writes on the buffered stall control channel. This is a new bug that was introduced after the recent queuing changes that allow more messages to be read at a time. --- peer/peer.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/peer/peer.go b/peer/peer.go index 57d793d933..e88f6f428e 100644 --- a/peer/peer.go +++ b/peer/peer.go @@ -1256,10 +1256,18 @@ out: break out } atomic.StoreInt64(&p.lastRecv, time.Now().Unix()) - p.stallControl <- stallControlMsg{sccReceiveMessage, rmsg} + select { + case p.stallControl <- stallControlMsg{sccReceiveMessage, rmsg}: + case <-p.quit: + break out + } // Handle each supported message type. - p.stallControl <- stallControlMsg{sccHandlerStart, rmsg} + select { + case p.stallControl <- stallControlMsg{sccHandlerStart, rmsg}: + case <-p.quit: + break out + } switch msg := rmsg.(type) { case *wire.MsgVersion: // Limit to one version message per peer. @@ -1432,7 +1440,11 @@ out: log.Debugf("Received unhandled message of type %v "+ "from %v", rmsg.Command(), p) } - p.stallControl <- stallControlMsg{sccHandlerDone, rmsg} + select { + case p.stallControl <- stallControlMsg{sccHandlerDone, rmsg}: + case <-p.quit: + break out + } } // Ensure connection is closed. @@ -1609,7 +1621,11 @@ out: p.statsMtx.Unlock() } - p.stallControl <- stallControlMsg{sccSendMessage, msg.msg} + select { + case p.stallControl <- stallControlMsg{sccSendMessage, msg.msg}: + case <-p.quit: + break out + } if err := p.writeMessage(msg.msg); err != nil { p.Disconnect() if p.shouldLogWriteError(err) {