From ae171ba134b6e4bc2f7445a080025a80d07773ba Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Wed, 6 May 2015 10:50:57 -0700 Subject: [PATCH] random dialing --- common/random.go | 4 ++++ node/node.go | 14 +++++++++----- p2p/pex_reactor.go | 4 ++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/common/random.go b/common/random.go index b767dcdb4..12ce8a24d 100644 --- a/common/random.go +++ b/common/random.go @@ -95,6 +95,10 @@ func RandUint64Exp() uint64 { return n } +func RandFloat32() float32 { + return rand.Float32() +} + func RandTime() time.Time { return time.Unix(int64(RandUint64Exp()), 0) } diff --git a/node/node.go b/node/node.go index 143b0a789..9f533e518 100644 --- a/node/node.go +++ b/node/node.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "strconv" + "time" bc "github.com/tendermint/tendermint/blockchain" . "github.com/tendermint/tendermint/common" @@ -152,6 +153,7 @@ func (n *Node) AddListener(l p2p.Listener) { n.book.AddOurAddress(l.ExternalAddress()) } +// NOTE: Blocking func (n *Node) DialSeed() { // if the single seed node is available, use only it prioritySeed := config.App().GetString("SeedNode") @@ -161,14 +163,16 @@ func (n *Node) DialSeed() { return } - // permute the list, dial half of them + // permute the list, dial them in random order. seeds := config.App().GetStringSlice("SeedNodes") perm := rand.Perm(len(seeds)) - // TODO: we shouldn't necessarily connect to all of them every time ... for i := 0; i < len(perm); i++ { - j := perm[i] - addr := p2p.NewNetAddressString(seeds[j]) - n.dialSeed(addr) + go func(i int) { + time.Sleep(time.Duration(rand.Int63n(3000)) * time.Millisecond) + j := perm[i] + addr := p2p.NewNetAddressString(seeds[j]) + n.dialSeed(addr) + }(i) } } diff --git a/p2p/pex_reactor.go b/p2p/pex_reactor.go index f5d26d573..b6a070f46 100644 --- a/p2p/pex_reactor.go +++ b/p2p/pex_reactor.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "math/rand" "reflect" "sync/atomic" "time" @@ -130,6 +131,9 @@ func (pexR *PEXReactor) SendAddrs(peer *Peer, addrs []*NetAddress) { // Ensures that sufficient peers are connected. (continuous) func (pexR *PEXReactor) ensurePeersRoutine() { + // Randomize when routine starts + time.Sleep(time.Duration(rand.Int63n(500*ensurePeersPeriodSeconds)) * time.Millisecond) + // fire once immediately. pexR.ensurePeers() // fire periodically