diff --git a/p2p/discover/lookup.go b/p2p/discover/lookup.go index f988e06838..ab825fb05d 100644 --- a/p2p/discover/lookup.go +++ b/p2p/discover/lookup.go @@ -18,6 +18,7 @@ package discover import ( "context" + "time" "github.com/ethereum/go-ethereum/p2p/enode" ) @@ -106,6 +107,12 @@ func (it *lookup) startQueries() bool { it.tab.mutex.Lock() closest := it.tab.closest(it.result.target, bucketSize, false) it.tab.mutex.Unlock() + // Avoid finishing the lookup too quickly if table is empty. It'd be better to wait + // for the table to fill in this case, but there is no good mechanism for that + // yet. + if len(closest.entries) == 0 { + it.slowdown() + } it.queries = 1 it.replyCh <- closest.entries return true @@ -124,6 +131,15 @@ func (it *lookup) startQueries() bool { return it.queries > 0 } +func (it *lookup) slowdown() { + sleep := time.NewTimer(1 * time.Second) + defer sleep.Stop() + select { + case <-sleep.C: + case <-it.tab.closeReq: + } +} + func (it *lookup) query(n *node, reply chan<- []*node) { fails := it.tab.db.FindFails(n.ID(), n.IP()) r, err := it.queryfunc(n)