From 4387dcd2a874eabae9b7f61cb2454ae3ae169e64 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 29 Oct 2019 13:31:23 +0100 Subject: [PATCH] p2p/enode: implement dynamic FairMix timeouts --- p2p/enode/iter.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/p2p/enode/iter.go b/p2p/enode/iter.go index a85f814306..112b76d06a 100644 --- a/p2p/enode/iter.go +++ b/p2p/enode/iter.go @@ -144,8 +144,9 @@ type FairMix struct { } type mixSource struct { - it Iterator - next chan *Node + it Iterator + next chan *Node + timeout time.Duration } // NewFairMix creates a mixer. @@ -172,7 +173,7 @@ func (m *FairMix) AddSource(it Iterator) { return } m.wg.Add(1) - source := &mixSource{it, make(chan *Node)} + source := &mixSource{it, make(chan *Node), m.timeout} m.sources = append(m.sources, source) go m.runSource(m.closed, source) } @@ -215,11 +216,13 @@ func (m *FairMix) Next() bool { case n, ok := <-source.next: if ok { m.cur = n + source.timeout = m.timeout return true } // This source has ended. m.deleteSource(source) case <-timeout: + source.timeout /= 2 return m.nextFromAny() } }