From 8d8047b1b185f2a67c0b4f21790deaf074378c8d Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Tue, 29 Apr 2025 11:04:17 +0200 Subject: [PATCH] eth: add pre-fetch in discovery to avoid stalls Signed-off-by: Csaba Kiraly --- eth/backend.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/eth/backend.go b/eth/backend.go index 63434a7c0b..762ecf518b 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -72,6 +72,12 @@ const ( // We expect a normal source to produce ~10 candidates per second. discmixTimeout = 100 * time.Millisecond + // discoveryPrefetchBuffer is the number of peers to pre-fetch from a discovery + // source. It is useful to avoid the negative effects of potential longer timeouts + // in the discovery, keeping dial progress while waiting for the next batch of + // candidates. + discoveryPrefetchBuffer = 32 + // maxParallelENRRequests is the maximum number of parallel ENR requests that can be // performed by a disc/v4 source. maxParallelENRRequests = 16 @@ -514,6 +520,7 @@ func (s *Ethereum) setupDiscovery() error { } iter = enode.AsyncFilter(iter, resolverFunc, maxParallelENRRequests) iter = enode.Filter(iter, eth.NewNodeFilter(s.blockchain)) + iter = enode.NewBufferIter(iter, discoveryPrefetchBuffer) s.discmix.AddSource(iter) } @@ -521,6 +528,7 @@ func (s *Ethereum) setupDiscovery() error { if s.p2pServer.DiscoveryV5() != nil { filter := eth.NewNodeFilter(s.blockchain) iter := enode.Filter(s.p2pServer.DiscoveryV5().RandomNodes(), filter) + iter = enode.NewBufferIter(iter, discoveryPrefetchBuffer) s.discmix.AddSource(iter) }