p2p/discover: optimize findnodeByID

This commit is contained in:
Sahil-4555 2025-12-03 10:23:52 +05:30
parent d3679c2f2e
commit 047a2e0a59

View file

@ -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.