diff --git a/pkg/network/discovery.go b/pkg/network/discovery.go index f8edc7dd8..2f44d5ddf 100644 --- a/pkg/network/discovery.go +++ b/pkg/network/discovery.go @@ -107,8 +107,21 @@ func (d *DefaultDiscovery) work(addrCh chan string) { } } -func (d *DefaultDiscovery) next() string { - return <-d.pool +func (d *DefaultDiscovery) requestToWork(workCh chan string) { + var requested int + + for { + for requested = <-d.requestCh; requested > 0; requested-- { + select { + case r := <-d.requestCh: + if requested < r { + requested = r + } + case addr := <-d.pool: + workCh <- addr + } + } + } } func (d *DefaultDiscovery) run() { @@ -121,6 +134,7 @@ func (d *DefaultDiscovery) run() { go d.work(workCh) } + go d.requestToWork(workCh) for { select { case addr := <-d.backFill: @@ -132,18 +146,10 @@ func (d *DefaultDiscovery) run() { d.unconnectedAddrs[addr] = true d.pool <- addr } - case n := <-d.requestCh: - go func() { - for i := 0; i < n; i++ { - workCh <- d.next() - } - }() case addr := <-d.badAddrCh: d.badAddrs[addr] = true delete(d.unconnectedAddrs, addr) - go func() { - workCh <- d.next() - }() + d.RequestRemote(1) case addr := <-d.connectedCh: delete(d.unconnectedAddrs, addr) diff --git a/pkg/network/server.go b/pkg/network/server.go index 84d0f7ab3..a91c331cb 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -15,7 +15,9 @@ import ( ) const ( + // peer numbers are arbitrary at the moment minPeers = 5 + maxPeers = 20 maxBlockBatch = 200 minPoolCount = 30 ) @@ -90,12 +92,7 @@ func (s *Server) Start(errChan chan error) { "headerHeight": s.chain.HeaderHeight(), }).Info("node started") - for _, addr := range s.Seeds { - if err := s.transport.Dial(addr, s.DialTimeout); err != nil { - log.Warnf("failed to connect to remote node %s", addr) - continue - } - } + s.discovery.BackFill(s.Seeds...) go s.transport.Accept() s.run() @@ -122,6 +119,10 @@ func (s *Server) BadPeers() []string { func (s *Server) run() { for { + c := s.PeerCount() + if c < minPeers { + s.discovery.RequestRemote(maxPeers - c) + } select { case <-s.quit: s.transport.Close() @@ -147,6 +148,7 @@ func (s *Server) run() { "reason": drop.reason, "peerCount": s.PeerCount(), }).Warn("peer disconnected") + s.discovery.BackFill(drop.peer.NetAddr().String()) } } }