OSDN Git Service

Accelerate node dialing speed
authorYahtoo Ma <yahtoo.ma@gmail.com>
Tue, 8 May 2018 07:16:02 +0000 (15:16 +0800)
committerYahtoo Ma <yahtoo.ma@gmail.com>
Tue, 8 May 2018 07:36:19 +0000 (15:36 +0800)
netsync/handle.go
p2p/addrbook.go
p2p/listener.go
p2p/pex_reactor.go
p2p/public_ip.go
p2p/switch.go

index 4548b53..d551f57 100644 (file)
@@ -32,6 +32,7 @@ type SyncManager struct {
        blockKeeper *blockKeeper
        peers       *peerSet
        mapResult   bool
+       extIP       bool
 
        newBlockCh    chan *bc.Hash
        newPeerCh     chan struct{}
@@ -68,16 +69,17 @@ func NewSyncManager(config *cfg.Config, chain *core.Chain, txPool *core.TxPool,
        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 {
@@ -129,7 +131,7 @@ func (sm *SyncManager) makeNodeInfo(listenOpen bool) *p2p.NodeInfo {
 }
 
 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)
index b7216d8..c9c3fe9 100644 (file)
@@ -15,7 +15,7 @@ import (
        "time"
 
        log "github.com/sirupsen/logrus"
-       crypto "github.com/tendermint/go-crypto"
+       "github.com/tendermint/go-crypto"
        cmn "github.com/tendermint/tmlibs/common"
 )
 
@@ -590,7 +590,7 @@ func (a *AddrBook) addAddress(addr, src *NetAddress) {
        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.
@@ -837,8 +837,8 @@ func (ka *knownAddress) removeBucketRef(bucketIdx int) int {
    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
        }
 
@@ -853,8 +853,7 @@ func (ka *knownAddress) isBad() bool {
        }
 
        // 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
        }
 
index 30bbecc..7a49d7e 100644 (file)
@@ -49,7 +49,7 @@ func splitHostPort(addr string) (host string, port int) {
 }
 
 // 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)
 
@@ -57,6 +57,8 @@ func NewDefaultListener(protocol string, lAddr string, skipUPNP bool, logger tlo
        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 {
@@ -90,12 +92,17 @@ func NewDefaultListener(protocol string, lAddr string, skipUPNP bool, logger tlo
                        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...
@@ -114,7 +121,7 @@ func NewDefaultListener(protocol string, lAddr string, skipUPNP bool, logger tlo
        }
        dl.BaseService = *cmn.NewBaseService(logger, "DefaultListener", dl)
        dl.Start() // Started upon construction
-       return dl, mapResult
+       return dl, mapResult, extIP
 }
 
 func (l *DefaultListener) OnStart() error {
index ccec69a..44ff6f2 100644 (file)
@@ -232,15 +232,21 @@ func (r *PEXReactor) ensurePeersRoutine() {
        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
@@ -260,9 +266,9 @@ func (r *PEXReactor) ensurePeersRoutine() {
 // 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,
@@ -310,7 +316,7 @@ func (r *PEXReactor) ensurePeers() {
                        if alreadySelected || alreadyDialing || alreadyConnected {
                                continue
                        } else {
-                               log.WithField("addr", try).Info("Will dial address")
+                               log.Debug("Will dial address addr:", try)
                                picked = try
                                break
                        }
@@ -320,14 +326,15 @@ func (r *PEXReactor) ensurePeers() {
                }
                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.
index 3db86d9..441f7b6 100644 (file)
@@ -11,12 +11,15 @@ import (
 )
 
 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 {
index 5947225..b8d3fc7 100644 (file)
@@ -331,7 +331,7 @@ func (sw *Switch) DialSeeds(addrBook *AddrBook, seeds []string) error {
        }
        //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])
        }
@@ -363,13 +363,10 @@ func (sw *Switch) DialPeerWithAddress(addr *NetAddress, persistent bool) (*Peer,
        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))