diff --git a/eth/backend.go b/eth/backend.go index 1feb8865a2..63434a7c0b 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -505,9 +505,12 @@ func (s *Ethereum) setupDiscovery() error { // Add DHT nodes from discv4. if s.p2pServer.DiscoveryV4() != nil { iter := s.p2pServer.DiscoveryV4().RandomNodes() - resolverFunc := func(ctx context.Context, enr *enode.Node) (*enode.Node, error) { + resolverFunc := func(ctx context.Context, enr *enode.Node) *enode.Node { // RequestENR does not yet support context. It will simply time out. - return s.p2pServer.DiscoveryV4().RequestENR(enr) + // If the ENR can't be resolved, RequestENR will return nil. We don't + // care about the specific error here, so we ignore it. + nn, _ := s.p2pServer.DiscoveryV4().RequestENR(enr) + return nn } iter = enode.AsyncFilter(iter, resolverFunc, maxParallelENRRequests) iter = enode.Filter(iter, eth.NewNodeFilter(s.blockchain)) diff --git a/p2p/enode/iter.go b/p2p/enode/iter.go index ee0c12fdd4..3735a2ddcf 100644 --- a/p2p/enode/iter.go +++ b/p2p/enode/iter.go @@ -163,7 +163,7 @@ type AsyncFilterIter struct { cancel context.CancelFunc closeOnce sync.Once } -type AsyncFilterFunc func(context.Context, *Node) (*Node, error) +type AsyncFilterFunc func(context.Context, *Node) *Node // AsyncFilter creates an iterator which checks nodes in parallel. func AsyncFilter(it Iterator, check AsyncFilterFunc, workers int) Iterator { @@ -192,7 +192,7 @@ func AsyncFilter(it Iterator, check AsyncFilterFunc, workers int) Iterator { <-f.slots // check the node async, in a separate goroutine go func() { - if nn, err := check(ctx, n); err == nil { + if nn := check(ctx, n); nn != nil { select { case f.passed <- nn: case <-ctx.Done(): // bale out if downstream is already closed and not calling Next