From 047a2e0a59b999004557d91602588ba729b824b4 Mon Sep 17 00:00:00 2001 From: Sahil-4555 Date: Wed, 3 Dec 2025 10:23:52 +0530 Subject: [PATCH] p2p/discover: optimize findnodeByID --- p2p/discover/table.go | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/p2p/discover/table.go b/p2p/discover/table.go index e5b2c7c8c5f7..a80967c1ac2c 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -245,28 +245,33 @@ func (tab *Table) refresh() <-chan struct{} { // preferLive is true and the table contains any verified nodes, the result will not // contain unverified nodes. However, if there are no verified nodes at all, the result // will contain unverified nodes. -func (tab *Table) findnodeByID(target enode.ID, nresults int, preferLive bool) *nodesByDistance { +func (tab *Table) findnodeByID(target enode.ID, nresults int, preferLive bool) (nodes nodesByDistance) { + nodes.target = target tab.mutex.Lock() defer tab.mutex.Unlock() // Scan all buckets. There might be a better way to do this, but there aren't that many // buckets, so this solution should be fine. The worst-case complexity of this loop // is O(tab.len() * nresults). - nodes := &nodesByDistance{target: target} - liveNodes := &nodesByDistance{target: target} - for _, b := range &tab.buckets { - for _, n := range b.entries { - nodes.push(n.Node, nresults) - if preferLive && n.isValidatedLive { - liveNodes.push(n.Node, nresults) + if preferLive { + for _, b := range &tab.buckets { + for _, n := range b.entries { + if n.isValidatedLive { + nodes.push(n.Node, nresults) + } } } + if len(nodes.entries) > 0 { + return + } } - if preferLive && len(liveNodes.entries) > 0 { - return liveNodes + for _, b := range &tab.buckets { + for _, n := range b.entries { + nodes.push(n.Node, nresults) + } } - return nodes + return } // appendBucketNodes adds nodes at the given distance to the result slice.