blockKeeper *blockKeeper
peers *peerSet
mapResult bool
+ extIP bool
newBlockCh chan *bc.Hash
newPeerCh chan struct{}
manager.sw.AddReactor("PROTOCOL", protocolReactor)
// Create & add listener
- var mapResult bool
+ var mapResult, extIP bool
var l p2p.Listener
if !config.VaultMode {
p, address := protocolAndAddress(manager.config.P2P.ListenAddress)
- l, mapResult = p2p.NewDefaultListener(p, address, manager.config.P2P.SkipUPNP, nil)
+ l, mapResult, extIP = p2p.NewDefaultListener(p, address, manager.config.P2P.SkipUPNP, nil)
manager.sw.AddListener(l)
}
manager.sw.SetNodeInfo(manager.makeNodeInfo(mapResult))
manager.sw.SetNodePrivKey(manager.privKey)
manager.mapResult = mapResult
+ manager.extIP = extIP
// Optionally, start the pex reactor
//var addrBook *p2p.AddrBook
if config.P2P.PexReactor {
}
func (sm *SyncManager) netStart() error {
- if !sm.mapResult {
+ if !sm.mapResult && sm.extIP {
p2pListener := sm.sw.Listeners()[0]
ListenAddr := cmn.Fmt("%v:%v", p2pListener.ExternalAddress().IP.String(), p2pListener.ExternalAddress().Port)
conn, err := net.DialTimeout("tcp", ListenAddr, 3*time.Second)
"time"
log "github.com/sirupsen/logrus"
- crypto "github.com/tendermint/go-crypto"
+ "github.com/tendermint/go-crypto"
cmn "github.com/tendermint/tmlibs/common"
)
bucket := a.calcNewBucket(addr, src)
a.addToNewBucket(ka, bucket)
- log.Info("Added new address ", "address:", addr, " total:", a.size())
+ log.Debug("Added new address ", "address:", addr, " total:", a.size())
}
// Make space in the new buckets by expiring the really bad entries.
worth keeping hold of.
*/
func (ka *knownAddress) isBad() bool {
- // Has been attempted in the last minute --> good
- if ka.LastAttempt.After(time.Now().Add(-1 * time.Minute)) {
+ // Has been attempted in the last minute --> bad
+ if ka.LastAttempt.After(time.Now().Add(-1*time.Minute)) && ka.Attempts != 0 {
return true
}
}
// Hasn't succeeded in too long?
- if ka.LastSuccess.Before(time.Now().Add(-1*minBadDays*time.Hour*24)) &&
- ka.Attempts >= maxFailures {
+ if ka.LastSuccess.Before(time.Now().Add(-1*minBadDays*time.Hour*24)) && ka.Attempts >= maxFailures {
return true
}
}
// skipUPNP: If true, does not try getUPNPExternalAddress()
-func NewDefaultListener(protocol string, lAddr string, skipUPNP bool, logger tlog.Logger) (Listener, bool) {
+func NewDefaultListener(protocol string, lAddr string, skipUPNP bool, logger tlog.Logger) (Listener, bool, bool) {
// Local listen IP & port
lAddrIP, lAddrPort := splitHostPort(lAddr)
var listener net.Listener
var err error
var mapResult = false
+ var extIP = false
+
for i := 0; i < tryListenSeconds; i++ {
listener, err = net.Listen(protocol, lAddr)
if err == nil {
extAddr = getUPNPExternalAddress(lAddrPort, listenerPort)
if extAddr != nil {
mapResult = true
+ } else {
+ extIP = true
}
}
}
if extAddr == nil {
if address := GetIP([]string{}, time.Duration(0)); address.Success == true {
extAddr = NewNetAddressIPPort(net.ParseIP(address.Ip), uint16(lAddrPort))
+ extIP = true
+ } else {
+ log.Info("Error get external ip:", address.Error)
}
}
// Otherwise just use the local address...
}
dl.BaseService = *cmn.NewBaseService(logger, "DefaultListener", dl)
dl.Start() // Started upon construction
- return dl, mapResult
+ return dl, mapResult, extIP
}
func (l *DefaultListener) OnStart() error {
time.Sleep(time.Duration(rand.Int63n(ensurePeersPeriodMs)) * time.Millisecond)
// fire once immediately.
- r.ensurePeers()
+ r.ensurePeers(r.sw.peers.Size())
// fire periodically
ticker := time.NewTicker(r.ensurePeersPeriod)
-
+ quickTicker := time.NewTicker(time.Second * 5)
for {
select {
case <-ticker.C:
- r.ensurePeers()
+ if r.sw.peers.Size() >= 3 {
+ r.ensurePeers(r.sw.peers.Size())
+ }
+ case <-quickTicker.C:
+ if r.sw.peers.Size() < 3 {
+ r.ensurePeers(r.sw.peers.Size())
+ }
case <-r.Quit:
ticker.Stop()
return
// What we're currently doing in terms of marking good/bad peers is just a
// placeholder. It should not be the case that an address becomes old/vetted
// upon a single successful connection.
-func (r *PEXReactor) ensurePeers() {
+func (r *PEXReactor) ensurePeers(num int) {
numOutPeers, _, numDialing := r.Switch.NumPeers()
- numToDial := minNumOutboundPeers - (numOutPeers + numDialing)
+ numToDial := minNumOutboundPeers*(minNumOutboundPeers-num) - (numOutPeers + numDialing)
log.WithFields(log.Fields{
"numOutPeers": numOutPeers,
"numDialing": numDialing,
if alreadySelected || alreadyDialing || alreadyConnected {
continue
} else {
- log.WithField("addr", try).Info("Will dial address")
+ log.Debug("Will dial address addr:", try)
picked = try
break
}
}
toDial[picked.IP.String()] = picked
}
-
// Dial picked addresses
for _, item := range toDial {
- if _, err := r.Switch.DialPeerWithAddress(item, false); err != nil {
- r.book.MarkAttempt(item)
- } else {
- r.book.MarkGood(item)
- }
+ go func(picked *NetAddress) {
+ if _, err := r.Switch.DialPeerWithAddress(picked, false); err != nil {
+ r.book.MarkAttempt(picked)
+ } else {
+ r.book.MarkGood(picked)
+ }
+ }(item)
}
// If we need more addresses, pick a random peer and ask for more.
)
var defaultServices = []string{
+ "http://members.3322.org/dyndns/getip",
+ "http://ifconfig.me/",
"http://icanhazip.com/",
"http://ifconfig.io/ip",
"http://ident.me/",
"http://whatismyip.akamai.com/",
"http://myip.dnsomatic.com/",
"http://diagnostic.opendns.com/myip",
+ "http://myexternalip.com/raw",
}
type IpResult struct {
}
//permute the list, dial them in random order.
perm := rand.Perm(len(netAddrs))
- for i := 0; i < len(perm); i+=2 {
+ for i := 0; i < len(perm); i += 2 {
j := perm[i]
sw.dialSeed(netAddrs[j])
}
sw.dialing.Set(addr.IP.String(), addr)
defer sw.dialing.Delete(addr.IP.String())
- log.WithField("address", addr).Info("Dialing peer")
+ log.Debug("Dialing peer address:", addr)
peer, err := newOutboundPeerWithConfig(addr, sw.reactorsByCh, sw.chDescs, sw.StopPeerForError, sw.nodePrivKey, sw.peerConfig)
if err != nil {
- log.WithFields(log.Fields{
- "address": addr,
- "error": err,
- }).Info("Failed to dial peer")
+ log.Debug("Failed to dial peer", " address:", addr, " error:", err)
return nil, err
}
peer.SetLogger(sw.Logger.With("peer", addr))