diff --git a/netaddress.go b/netaddress.go index 331dc44d9..90fcf6a43 100644 --- a/netaddress.go +++ b/netaddress.go @@ -5,11 +5,12 @@ package p2p import ( + "errors" "net" "strconv" "time" - . "github.com/tendermint/go-common" + cmn "github.com/tendermint/go-common" ) type NetAddress struct { @@ -61,6 +62,18 @@ func NewNetAddressString(addr string) (*NetAddress, error) { 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 { na := &NetAddress{ IP: ip, @@ -85,7 +98,7 @@ func (na *NetAddress) Less(other interface{}) bool { if o, ok := other.(*NetAddress); ok { return na.String() < o.String() } else { - PanicSanity("Cannot compare unequal types") + cmn.PanicSanity("Cannot compare unequal types") return false } } diff --git a/switch.go b/switch.go index 9ee933640..2f7177bf0 100644 --- a/switch.go +++ b/switch.go @@ -296,58 +296,24 @@ func (sw *Switch) startInitPeer(peer *Peer) { sw.addPeerToReactors(peer) // run AddPeer on each reactor } -//error type for seed errors -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 +// Dial a list of seeds asynchronously in random order func (sw *Switch) DialSeeds(seeds []string) error { - ch := make(chan SeedError) //channel for collecting errors - passing := 0 //number of passing seeds + netAddrs, err := NewNetAddressStrings(seeds) + if err != nil { + return err + } // permute the list, dial them in random order. perm := rand.Perm(len(seeds)) for i := 0; i < len(perm); i++ { - go func(i int) { time.Sleep(time.Duration(rand.Int63n(3000)) * time.Millisecond) j := perm[i] - - addr, err := NewNetAddressString(seeds[j]) - - if err != nil { - ch <- SeedError{seeds[j], err} - } else { - sw.dialSeed(addr) - passing++ - } + sw.dialSeed(netAddrs[j]) }(i) } - - //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 + return nil } func (sw *Switch) dialSeed(addr *NetAddress) { diff --git a/switch_test.go b/switch_test.go index 85a1e080e..1b2ccd743 100644 --- a/switch_test.go +++ b/switch_test.go @@ -8,8 +8,6 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - . "github.com/tendermint/go-common" cfg "github.com/tendermint/go-config" "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()) } - //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 ch0Msg := "channel zero" ch1Msg := "channel foo"