mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 14:52:17 +00:00
some dial seeds fixes
This commit is contained in:
parent
26275ba66c
commit
0e7baf027b
@ -5,11 +5,12 @@
|
|||||||
package p2p
|
package p2p
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
. "github.com/tendermint/go-common"
|
cmn "github.com/tendermint/go-common"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NetAddress struct {
|
type NetAddress struct {
|
||||||
@ -61,6 +62,18 @@ func NewNetAddressString(addr string) (*NetAddress, error) {
|
|||||||
return na, nil
|
return na, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewNetAddressStrings(addrs []string) ([]*NetAddress, error) {
|
||||||
|
netAddrs := make([]*NetAddress, len(addrs))
|
||||||
|
for i, addr := range addrs {
|
||||||
|
netAddr, err := NewNetAddressString(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New(cmn.Fmt("Error in address %s: %v", addr, err))
|
||||||
|
}
|
||||||
|
netAddrs[i] = netAddr
|
||||||
|
}
|
||||||
|
return netAddrs, nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewNetAddressIPPort(ip net.IP, port uint16) *NetAddress {
|
func NewNetAddressIPPort(ip net.IP, port uint16) *NetAddress {
|
||||||
na := &NetAddress{
|
na := &NetAddress{
|
||||||
IP: ip,
|
IP: ip,
|
||||||
@ -85,7 +98,7 @@ func (na *NetAddress) Less(other interface{}) bool {
|
|||||||
if o, ok := other.(*NetAddress); ok {
|
if o, ok := other.(*NetAddress); ok {
|
||||||
return na.String() < o.String()
|
return na.String() < o.String()
|
||||||
} else {
|
} else {
|
||||||
PanicSanity("Cannot compare unequal types")
|
cmn.PanicSanity("Cannot compare unequal types")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
48
switch.go
48
switch.go
@ -296,58 +296,24 @@ func (sw *Switch) startInitPeer(peer *Peer) {
|
|||||||
sw.addPeerToReactors(peer) // run AddPeer on each reactor
|
sw.addPeerToReactors(peer) // run AddPeer on each reactor
|
||||||
}
|
}
|
||||||
|
|
||||||
//error type for seed errors
|
// Dial a list of seeds asynchronously in random order
|
||||||
type SeedError struct {
|
|
||||||
seed string
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
type SeedErrors []SeedError
|
|
||||||
|
|
||||||
func (se SeedErrors) Error() string {
|
|
||||||
var str string
|
|
||||||
for _, e := range se {
|
|
||||||
str += ("seed: " + e.seed + " error: " + e.err.Error() + "; ")
|
|
||||||
}
|
|
||||||
return str
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dial a list of seeds in random order
|
|
||||||
func (sw *Switch) DialSeeds(seeds []string) error {
|
func (sw *Switch) DialSeeds(seeds []string) error {
|
||||||
|
|
||||||
ch := make(chan SeedError) //channel for collecting errors
|
netAddrs, err := NewNetAddressStrings(seeds)
|
||||||
passing := 0 //number of passing seeds
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// permute the list, dial them in random order.
|
// permute the list, dial them in random order.
|
||||||
perm := rand.Perm(len(seeds))
|
perm := rand.Perm(len(seeds))
|
||||||
for i := 0; i < len(perm); i++ {
|
for i := 0; i < len(perm); i++ {
|
||||||
|
|
||||||
go func(i int) {
|
go func(i int) {
|
||||||
time.Sleep(time.Duration(rand.Int63n(3000)) * time.Millisecond)
|
time.Sleep(time.Duration(rand.Int63n(3000)) * time.Millisecond)
|
||||||
j := perm[i]
|
j := perm[i]
|
||||||
|
sw.dialSeed(netAddrs[j])
|
||||||
addr, err := NewNetAddressString(seeds[j])
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
ch <- SeedError{seeds[j], err}
|
|
||||||
} else {
|
|
||||||
sw.dialSeed(addr)
|
|
||||||
passing++
|
|
||||||
}
|
|
||||||
}(i)
|
}(i)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
//collect any errors from the channel
|
|
||||||
var seedErrs SeedErrors
|
|
||||||
for {
|
|
||||||
seedErr := <-ch
|
|
||||||
seedErrs = append(seedErrs, seedErr)
|
|
||||||
if len(seedErrs)+passing == len(perm) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return seedErrs
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sw *Switch) dialSeed(addr *NetAddress) {
|
func (sw *Switch) dialSeed(addr *NetAddress) {
|
||||||
|
@ -8,8 +8,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
|
|
||||||
. "github.com/tendermint/go-common"
|
. "github.com/tendermint/go-common"
|
||||||
cfg "github.com/tendermint/go-config"
|
cfg "github.com/tendermint/go-config"
|
||||||
"github.com/tendermint/go-crypto"
|
"github.com/tendermint/go-crypto"
|
||||||
@ -121,14 +119,6 @@ func TestSwitches(t *testing.T) {
|
|||||||
t.Errorf("Expected exactly 1 peer in s2, got %v", s2.Peers().Size())
|
t.Errorf("Expected exactly 1 peer in s2, got %v", s2.Peers().Size())
|
||||||
}
|
}
|
||||||
|
|
||||||
//Test DialSeeds
|
|
||||||
err := s1.DialSeeds([]string{s1.NodeInfo().Network}) //"0.0.0.0:46658"})
|
|
||||||
assert.Nil(t, err, "expected successful dial seeds")
|
|
||||||
|
|
||||||
//Test Bad Dial Seeds
|
|
||||||
err = s1.DialSeeds([]string{"0.0.0:46658"})
|
|
||||||
assert.NotNil(t, err, "expected unsuccessful dial seeds")
|
|
||||||
|
|
||||||
// Lets send some messages
|
// Lets send some messages
|
||||||
ch0Msg := "channel zero"
|
ch0Msg := "channel zero"
|
||||||
ch1Msg := "channel foo"
|
ch1Msg := "channel foo"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user