Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions p2p/discover/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down