diff --git a/p2p/conn/connection.go b/p2p/conn/connection.go index 4e461b35e..b02e1ccb4 100644 --- a/p2p/conn/connection.go +++ b/p2p/conn/connection.go @@ -352,7 +352,10 @@ FOR_LOOP: c.flush() case <-c.quit: if c.pongTimer != nil { - _ = c.pongTimer.Stop() + if !c.pongTimer.Stop() { + <-c.pongTimer.C + } + drain(c.pongTimeoutCh) } break FOR_LOOP case <-c.send: @@ -488,7 +491,10 @@ FOR_LOOP: case packetTypePong: c.Logger.Debug("Receive Pong") if c.pongTimer != nil { - _ = c.pongTimer.Stop() + if !c.pongTimer.Stop() { + <-c.pongTimer.C + } + drain(c.pongTimeoutCh) } case packetTypeMsg: pkt, n, err := msgPacket{}, int(0), error(nil) @@ -764,3 +770,13 @@ type msgPacket struct { func (p msgPacket) String() string { return fmt.Sprintf("MsgPacket{%X:%X T:%X}", p.ChannelID, p.Bytes, p.EOF) } + +func drain(ch <-chan struct{}) { + for { + select { + case <-ch: + default: + return + } + } +}