network: don't wait indefinitely for packet to be sent
Peers can be slow, very slow, slow enough to affect node's regular operation. We can't wait for them indefinitely, there has to be a timeout for send operations. This patch uses TimePerBlock as a reference for its timeout. It's relatively big and it doesn't affect tests much, 4+1 scenarios tend to perform a little worse with while 7+2 scenarios work a little better. The difference is in some percents, but all of these tests easily have 10-15% variations from run to run. It's an important step in making our gossip better because we can't have any behavior where neighbors directly block the node forever, refs. #2678 and
This commit is contained in:
parent
478b4b0c1c
commit
dabdad20ad
2 changed files with 10 additions and 3 deletions
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue