diff --git a/pkg/network/server.go b/pkg/network/server.go index cbcc40634..5f8d4f4ea 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -1385,7 +1385,7 @@ func (s *Server) iteratePeersWithSendMsg(msg *Message, send func(Peer, bool, []b peer.AddGetAddrSent() } sentN++ - } else if errors.Is(err, errBusy) { + } else if !blocking && errors.Is(err, errBusy) { // Can be retried. continue } else { diff --git a/pkg/network/tcp_peer.go b/pkg/network/tcp_peer.go index e7684f156..6d7dc8bf2 100644 --- a/pkg/network/tcp_peer.go +++ b/pkg/network/tcp_peer.go @@ -87,11 +87,18 @@ func (p *TCPPeer) putPacketIntoQueue(queue chan<- []byte, block bool, msg []byte if !p.Handshaked() { return errStateMismatch } + var ret error if block { + timer := time.NewTimer(p.server.TimePerBlock / 2) select { case queue <- msg: case <-p.done: - return errGone + ret = errGone + case <-timer.C: + ret = errBusy + } + if !errors.Is(ret, errBusy) && !timer.Stop() { + <-timer.C } } else { select { @@ -102,7 +109,7 @@ func (p *TCPPeer) putPacketIntoQueue(queue chan<- []byte, block bool, msg []byte return errBusy } } - return nil + return ret } // EnqueuePacket implements the Peer interface.