forked from TrueCloudLab/neoneo-go
network: pings are broadcasted, don't send them to everyone
Follow the general rules of broadcasts, even though it's somewhat different from Inv, we just want to get some reply from our neighbors to see if we're behind. We don't strictly need all neighbors for it.
This commit is contained in:
parent
ec4983e88e
commit
b345581c72
4 changed files with 11 additions and 18 deletions
|
@ -159,10 +159,8 @@ func (p *localPeer) HandleVersionAck() error {
|
|||
p.handshaked = true
|
||||
return nil
|
||||
}
|
||||
func (p *localPeer) SendPing(m *Message) error {
|
||||
func (p *localPeer) SetPingTimer() {
|
||||
p.pingSent++
|
||||
_ = p.EnqueueMessage(m)
|
||||
return nil
|
||||
}
|
||||
func (p *localPeer) HandlePing(ping *payload.Ping) error {
|
||||
p.lastBlockIndex = ping.LastBlockIndex
|
||||
|
|
|
@ -59,10 +59,9 @@ type Peer interface {
|
|||
Handshaked() bool
|
||||
IsFullNode() bool
|
||||
|
||||
// SendPing enqueues a ping message to be sent to the peer and does
|
||||
// appropriate protocol handling like timeouts and outstanding pings
|
||||
// management.
|
||||
SendPing(*Message) error
|
||||
// SetPingTimer adds an outgoing ping to the counter and sets a PingTimeout
|
||||
// timer that will shut the connection down in case of no response.
|
||||
SetPingTimer()
|
||||
// SendVersion checks handshake status and sends a version message to
|
||||
// the peer.
|
||||
SendVersion() error
|
||||
|
|
|
@ -465,10 +465,7 @@ func (s *Server) runProto() {
|
|||
return
|
||||
case <-pingTimer.C:
|
||||
if s.chain.BlockHeight() == prevHeight {
|
||||
// Get a copy of s.peers to avoid holding a lock while sending.
|
||||
for _, peer := range s.getPeers(nil) {
|
||||
_ = peer.SendPing(NewMessage(CMDPing, payload.NewPing(s.chain.BlockHeight(), s.id)))
|
||||
}
|
||||
s.broadcastMessage(NewMessage(CMDPing, payload.NewPing(s.chain.BlockHeight(), s.id)))
|
||||
}
|
||||
pingTimer.Reset(s.PingInterval)
|
||||
}
|
||||
|
@ -1371,6 +1368,9 @@ func (s *Server) iteratePeersWithSendMsg(msg *Message, send func(Peer, context.C
|
|||
if msg.Command == CMDGetAddr {
|
||||
p.AddGetAddrSent()
|
||||
}
|
||||
if msg.Command == CMDPing {
|
||||
p.SetPingTimer()
|
||||
}
|
||||
replies <- send(p, ctx, pkt)
|
||||
}(peer, ctx, pkt)
|
||||
}
|
||||
|
|
|
@ -454,12 +454,9 @@ func (p *TCPPeer) LastBlockIndex() uint32 {
|
|||
return p.lastBlockIndex
|
||||
}
|
||||
|
||||
// SendPing sends a ping message to the peer and does an appropriate accounting of
|
||||
// outstanding pings and timeouts.
|
||||
func (p *TCPPeer) SendPing(msg *Message) error {
|
||||
if !p.Handshaked() {
|
||||
return errStateMismatch
|
||||
}
|
||||
// SetPingTimer adds an outgoing ping to the counter and sets a PingTimeout timer
|
||||
// that will shut the connection down in case of no response.
|
||||
func (p *TCPPeer) SetPingTimer() {
|
||||
p.lock.Lock()
|
||||
p.pingSent++
|
||||
if p.pingTimer == nil {
|
||||
|
@ -468,7 +465,6 @@ func (p *TCPPeer) SendPing(msg *Message) error {
|
|||
})
|
||||
}
|
||||
p.lock.Unlock()
|
||||
return p.EnqueueMessage(msg)
|
||||
}
|
||||
|
||||
// HandlePing handles a ping message received from the peer.
|
||||
|
|
Loading…
Reference in a new issue