Browse Source

dial seeds error handling

pull/456/head
rigelrozanski 7 years ago
parent
commit
26275ba66c
7 changed files with 98 additions and 17 deletions
  1. +16
    -0
      .gitignore
  2. +9
    -6
      addrbook_test.go
  3. +5
    -1
      listener.go
  4. +9
    -5
      netaddress.go
  5. +7
    -1
      pex_reactor.go
  6. +42
    -4
      switch.go
  7. +10
    -0
      switch_test.go

+ 16
- 0
.gitignore View File

@ -0,0 +1,16 @@
*.swp
*.swo
.bak
*.bak
.DS_Store
build/*
rpc/test/.tendermint
.debora
.tendermint
remote_dump
.revision
vendor
.vagrant
test/p2p/data/
test/logs
.glide

+ 9
- 6
addrbook_test.go View File

@ -5,6 +5,8 @@ import (
"io/ioutil"
"math/rand"
"testing"
"github.com/stretchr/testify/assert"
)
const addrBookStrict = true
@ -38,7 +40,7 @@ func TestEmpty(t *testing.T) {
}
}
func randIPv4Address() *NetAddress {
func randIPv4Address(t *testing.T) *NetAddress {
for {
ip := fmt.Sprintf("%v.%v.%v.%v",
rand.Intn(254)+1,
@ -47,7 +49,8 @@ func randIPv4Address() *NetAddress {
rand.Intn(255),
)
port := rand.Intn(65535-1) + 1
addr := NewNetAddressString(fmt.Sprintf("%v:%v", ip, port))
addr, err := NewNetAddressString(fmt.Sprintf("%v:%v", ip, port))
assert.Nil(t, err, "error generating rand network address")
if addr.Routable() {
return addr
}
@ -64,8 +67,8 @@ func TestSaveAddresses(t *testing.T) {
src *NetAddress
}{}
for i := 0; i < 100; i++ {
addr := randIPv4Address()
src := randIPv4Address()
addr := randIPv4Address(t)
src := randIPv4Address(t)
randAddrs = append(randAddrs, struct {
addr *NetAddress
src *NetAddress
@ -118,8 +121,8 @@ func TestPromoteToOld(t *testing.T) {
src *NetAddress
}{}
for i := 0; i < 100; i++ {
addr := randIPv4Address()
src := randIPv4Address()
addr := randIPv4Address(t)
src := randIPv4Address(t)
randAddrs = append(randAddrs, struct {
addr *NetAddress
src *NetAddress


+ 5
- 1
listener.go View File

@ -70,7 +70,11 @@ func NewDefaultListener(protocol string, lAddr string, skipUPNP bool) Listener {
log.Info("Local listener", "ip", listenerIP, "port", listenerPort)
// Determine internal address...
var intAddr *NetAddress = NewNetAddressString(lAddr)
var intAddr *NetAddress
intAddr, err = NewNetAddressString(lAddr)
if err != nil {
PanicCrisis(err)
}
// Determine external address...
var extAddr *NetAddress


+ 9
- 5
netaddress.go View File

@ -34,27 +34,31 @@ func NewNetAddress(addr net.Addr) *NetAddress {
}
// Also resolves the host if host is not an IP.
func NewNetAddressString(addr string) *NetAddress {
func NewNetAddressString(addr string) (*NetAddress, error) {
host, portStr, err := net.SplitHostPort(addr)
if err != nil {
PanicSanity(err)
return nil, err
}
ip := net.ParseIP(host)
if ip == nil {
if len(host) > 0 {
ips, err := net.LookupIP(host)
if err != nil {
PanicSanity(err)
return nil, err
}
ip = ips[0]
}
}
port, err := strconv.ParseUint(portStr, 10, 16)
if err != nil {
PanicSanity(err)
return nil, err
}
na := NewNetAddressIPPort(ip, uint16(port))
return na
return na, nil
}
func NewNetAddressIPPort(ip net.IP, port uint16) *NetAddress {


+ 7
- 1
pex_reactor.go View File

@ -64,7 +64,12 @@ func (pexR *PEXReactor) GetChannels() []*ChannelDescriptor {
// Implements Reactor
func (pexR *PEXReactor) AddPeer(peer *Peer) {
// Add the peer to the address book
netAddr := NewNetAddressString(peer.ListenAddr)
netAddr, err := NewNetAddressString(peer.ListenAddr)
if err != nil {
log.Warn("Error decoding message", "error", err)
return
}
if peer.IsOutbound() {
if pexR.book.NeedMoreAddrs() {
pexR.RequestPEX(peer)
@ -74,6 +79,7 @@ func (pexR *PEXReactor) AddPeer(peer *Peer) {
// (For outbound peers, the address is already in the books)
pexR.book.AddAddress(netAddr, netAddr)
}
return
}
// Implements Reactor


+ 42
- 4
switch.go View File

@ -296,20 +296,58 @@ 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
// Spawns a go routine for each dial
func (sw *Switch) DialSeeds(seeds []string) {
func (sw *Switch) DialSeeds(seeds []string) error {
ch := make(chan SeedError) //channel for collecting errors
passing := 0 //number of passing seeds
// 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 := NewNetAddressString(seeds[j])
sw.dialSeed(addr)
addr, err := NewNetAddressString(seeds[j])
if err != nil {
ch <- SeedError{seeds[j], err}
} else {
sw.dialSeed(addr)
passing++
}
}(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
}
func (sw *Switch) dialSeed(addr *NetAddress) {


+ 10
- 0
switch_test.go View File

@ -8,6 +8,8 @@ import (
"testing"
"time"
"github.com/stretchr/testify/assert"
. "github.com/tendermint/go-common"
cfg "github.com/tendermint/go-config"
"github.com/tendermint/go-crypto"
@ -119,6 +121,14 @@ 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"


Loading…
Cancel
Save