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).
This commit is contained in:
Roman Khimov 2022-10-24 15:10:51 +03:00
parent 9d6b18adec
commit 28f54d352a

View file

@ -38,6 +38,7 @@ const (
defaultExtensiblePoolSize = 20 defaultExtensiblePoolSize = 20
defaultBroadcastFactor = 0 defaultBroadcastFactor = 0
maxBlockBatch = 200 maxBlockBatch = 200
peerTimeFactor = 1000
) )
var ( var (
@ -393,6 +394,12 @@ func (s *Server) ConnectedPeers() []string {
// run is a goroutine that starts another goroutine to manage protocol specifics // run is a goroutine that starts another goroutine to manage protocol specifics
// while itself dealing with peers management (handling connects/disconnects). // while itself dealing with peers management (handling connects/disconnects).
func (s *Server) run() { func (s *Server) run() {
var (
peerCheckTime = s.TimePerBlock * peerTimeFactor
peerCheckTimeout bool
timer = time.NewTimer(peerCheckTime)
)
defer timer.Stop()
go s.runProto() go s.runProto()
for loopCnt := 0; ; loopCnt++ { for loopCnt := 0; ; loopCnt++ {
var ( var (
@ -416,12 +423,16 @@ func (s *Server) run() {
s.discovery.RequestRemote(connN) s.discovery.RequestRemote(connN)
} }
if s.discovery.PoolCount() < s.AttemptConnPeers { if peerCheckTimeout || s.discovery.PoolCount() < s.AttemptConnPeers {
s.broadcastHPMessage(NewMessage(CMDGetAddr, payload.NewNullPayload())) s.broadcastHPMessage(NewMessage(CMDGetAddr, payload.NewNullPayload()))
peerCheckTimeout = false
} }
select { select {
case <-s.quit: case <-s.quit:
return return
case <-timer.C:
peerCheckTimeout = true
timer.Reset(peerCheckTime)
case p := <-s.register: case p := <-s.register:
s.lock.Lock() s.lock.Lock()
s.peers[p] = true s.peers[p] = true