From 28f54d352a0e358cd7aada95e8acad6dff4222f0 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 24 Oct 2022 15:10:51 +0300 Subject: [PATCH] network: do getaddr requests periodically, fix #2745 Every 1000 blocks seems to be OK for big networks (that only had done some initial requests previously and then effectively never requested addresses again because there was a sufficient number of addresses), won't hurt smaller ones as well (that effectively keep doing this on every connect/disconnect, peer changes are very rare there, but when they happen we want to have some quick reaction to these changes). --- pkg/network/server.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/network/server.go b/pkg/network/server.go index a4a80cebc..67a8d8525 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -38,6 +38,7 @@ const ( defaultExtensiblePoolSize = 20 defaultBroadcastFactor = 0 maxBlockBatch = 200 + peerTimeFactor = 1000 ) var ( @@ -393,6 +394,12 @@ func (s *Server) ConnectedPeers() []string { // run is a goroutine that starts another goroutine to manage protocol specifics // while itself dealing with peers management (handling connects/disconnects). func (s *Server) run() { + var ( + peerCheckTime = s.TimePerBlock * peerTimeFactor + peerCheckTimeout bool + timer = time.NewTimer(peerCheckTime) + ) + defer timer.Stop() go s.runProto() for loopCnt := 0; ; loopCnt++ { var ( @@ -416,12 +423,16 @@ func (s *Server) run() { s.discovery.RequestRemote(connN) } - if s.discovery.PoolCount() < s.AttemptConnPeers { + if peerCheckTimeout || s.discovery.PoolCount() < s.AttemptConnPeers { s.broadcastHPMessage(NewMessage(CMDGetAddr, payload.NewNullPayload())) + peerCheckTimeout = false } select { case <-s.quit: return + case <-timer.C: + peerCheckTimeout = true + timer.Reset(peerCheckTime) case p := <-s.register: s.lock.Lock() s.peers[p] = true