diff --git a/p2p/discover/table.go b/p2p/discover/table.go index e5b2c7c8c5f..a80967c1ac2 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.