• R/O
  • HTTP
  • SSH
  • HTTPS

bytom: 提交

Official Go implementation of the Bytom protocol


Commit MetaInfo

修订版a480139f4a8be097228dd3691d883a20e9e7d691 (tree)
时间2018-04-17 14:42:36
作者Yongfeng LI <wliyongfeng@gmai...>
CommiterGitHub

Log Message

Merge pull request #673 from Bytom/dev

merge dev

更改概述

差异

--- a/netsync/handle.go
+++ b/netsync/handle.go
@@ -141,7 +141,7 @@ func (sm *SyncManager) netStart() error {
141141
142142 //Start start sync manager service
143143 func (sm *SyncManager) Start() {
144- sm.netStart()
144+ go sm.netStart()
145145 // broadcast transactions
146146 go sm.txBroadcastLoop()
147147
--- a/netsync/protocol_reactor.go
+++ b/netsync/protocol_reactor.go
@@ -2,6 +2,7 @@ package netsync
22
33 import (
44 "reflect"
5+ "sync"
56 "time"
67
78 log "github.com/sirupsen/logrus"
@@ -19,11 +20,13 @@ const (
1920 // BlockchainChannel is a channel for blocks and status updates
2021 BlockchainChannel = byte(0x40)
2122 protocolHandshakeTimeout = time.Second * 10
23+ handshakeRetryTicker = 4 * time.Second
2224 )
2325
2426 var (
2527 //ErrProtocolHandshakeTimeout peers handshake timeout
2628 ErrProtocolHandshakeTimeout = errors.New("Protocol handshake timeout")
29+ ErrStatusRequest = errors.New("Status request error")
2730 )
2831
2932 // Response describes the response standard.
@@ -49,6 +52,7 @@ type ProtocolReactor struct {
4952 sw *p2p.Switch
5053 fetcher *Fetcher
5154 peers *peerSet
55+ handshakeMu sync.Mutex
5256
5357 newPeerCh chan struct{}
5458 quitReqBlockCh chan *string
@@ -111,7 +115,13 @@ func (pr *ProtocolReactor) syncTransactions(p *peer) {
111115
112116 // AddPeer implements Reactor by sending our state to peer.
113117 func (pr *ProtocolReactor) AddPeer(peer *p2p.Peer) error {
114- peer.Send(BlockchainChannel, struct{ BlockchainMessage }{&StatusRequestMessage{}})
118+ pr.handshakeMu.Lock()
119+ defer pr.handshakeMu.Unlock()
120+
121+ if ok := peer.Send(BlockchainChannel, struct{ BlockchainMessage }{&StatusRequestMessage{}}); !ok {
122+ return ErrStatusRequest
123+ }
124+ retryTicker := time.Tick(handshakeRetryTicker)
115125 handshakeWait := time.NewTimer(protocolHandshakeTimeout)
116126 for {
117127 select {
@@ -123,6 +133,10 @@ func (pr *ProtocolReactor) AddPeer(peer *p2p.Peer) error {
123133 pr.newPeerCh <- struct{}{}
124134 return nil
125135 }
136+ case <-retryTicker:
137+ if ok := peer.Send(BlockchainChannel, struct{ BlockchainMessage }{&StatusRequestMessage{}}); !ok {
138+ return ErrStatusRequest
139+ }
126140 case <-handshakeWait.C:
127141 return ErrProtocolHandshakeTimeout
128142 }
--- a/netsync/sync.go
+++ b/netsync/sync.go
@@ -88,6 +88,13 @@ func (sm *SyncManager) synchronise() {
8888 if peer == nil {
8989 return
9090 }
91+
92+ if ok := sm.Switch().Peers().Has(peer.Key); !ok {
93+ log.Info("Peer disconnected")
94+ sm.sw.StopPeerGracefully(peer)
95+ return
96+ }
97+
9198 if bestHeight > sm.chain.BestBlockHeight() {
9299 log.Info("sync peer:", peer.Addr(), " height:", bestHeight)
93100 sm.blockKeeper.BlockRequestWorker(peer.Key, bestHeight)
--- a/p2p/connection.go
+++ b/p2p/connection.go
@@ -409,19 +409,19 @@ FOR_LOOP:
409409 // Block until .recvMonitor says we can read.
410410 c.recvMonitor.Limit(maxMsgPacketTotalSize, atomic.LoadInt64(&c.config.RecvRate), true)
411411
412-/*
413- // Peek into bufReader for debugging
414- if numBytes := c.bufReader.Buffered(); numBytes > 0 {
415- log.Infof("Peek connection buffer numBytes:", numBytes)
416- bytes, err := c.bufReader.Peek(cmn.MinInt(numBytes, 100))
417- if err == nil {
418- log.Infof("bytes:", bytes)
412+ /*
413+ // Peek into bufReader for debugging
414+ if numBytes := c.bufReader.Buffered(); numBytes > 0 {
415+ log.Infof("Peek connection buffer numBytes:", numBytes)
416+ bytes, err := c.bufReader.Peek(cmn.MinInt(numBytes, 100))
417+ if err == nil {
418+ log.Infof("bytes:", bytes)
419+ } else {
420+ log.Warning("Error peeking connection buffer err:", err)
421+ }
419422 } else {
420- log.Warning("Error peeking connection buffer err:", err)
423+ log.Warning("Received bytes number is:", numBytes)
421424 }
422- } else {
423- log.Warning("Received bytes number is:", numBytes)
424- }
425425 */
426426
427427 // Read packet type
--- a/p2p/pex_reactor.go
+++ b/p2p/pex_reactor.go
@@ -5,10 +5,13 @@ import (
55 "fmt"
66 "math/rand"
77 "reflect"
8+ "strings"
89 "time"
10+
911 log "github.com/sirupsen/logrus"
1012 wire "github.com/tendermint/go-wire"
1113 cmn "github.com/tendermint/tmlibs/common"
14+
1215 "github.com/bytom/errors"
1316 )
1417
@@ -244,6 +247,7 @@ func (r *PEXReactor) ensurePeers() {
244247 return
245248 }
246249
250+ newBias := cmn.MinInt(numOutPeers, 8)*10 + 10
247251 toDial := make(map[string]*NetAddress)
248252
249253 // Try to pick numToDial addresses to dial.
@@ -253,7 +257,7 @@ func (r *PEXReactor) ensurePeers() {
253257 // if we already have many connections. This algorithm isn't perfect, but
254258 // it somewhat ensures that we prioritize connecting to more-vetted
255259 // peers.
256- newBias := cmn.MinInt(numOutPeers, 8)*10 + 10
260+
257261 var picked *NetAddress
258262 // Try to fetch a new peer 3 times.
259263 // This caps the maximum number of tries to 3 * numToDial.
@@ -265,8 +269,9 @@ func (r *PEXReactor) ensurePeers() {
265269 _, alreadySelected := toDial[try.IP.String()]
266270 alreadyDialing := r.Switch.IsDialing(try)
267271 var alreadyConnected bool
272+
268273 for _, v := range r.Switch.Peers().list {
269- if v.mconn.RemoteAddress.String() == try.String() {
274+ if strings.Compare(v.mconn.RemoteAddress.IP.String(), try.IP.String()) == 0 {
270275 alreadyConnected = true
271276 break
272277 }
@@ -287,12 +292,9 @@ func (r *PEXReactor) ensurePeers() {
287292
288293 // Dial picked addresses
289294 for _, item := range toDial {
290- go func(picked *NetAddress) {
291- _, err := r.Switch.DialPeerWithAddress(picked, false)
292- if err != nil {
293- r.book.MarkAttempt(picked)
294- }
295- }(item)
295+ if _, err := r.Switch.DialPeerWithAddress(item, false); err != nil {
296+ r.book.MarkAttempt(item)
297+ }
296298 }
297299
298300 // If we need more addresses, pick a random peer and ask for more.
--- a/p2p/switch.go
+++ b/p2p/switch.go
@@ -7,6 +7,7 @@ import (
77 "net"
88 "sync"
99 "time"
10+ "strings"
1011
1112 log "github.com/sirupsen/logrus"
1213 crypto "github.com/tendermint/go-crypto"
@@ -19,8 +20,8 @@ import (
1920 )
2021
2122 const (
22- reconnectAttempts = 30
23- reconnectInterval = 3 * time.Second
23+ reconnectAttempts = 10
24+ reconnectInterval = 10 * time.Second
2425
2526 bannedPeerKey = "BannedPeer"
2627 defaultBanDuration = time.Hour * 24
@@ -94,6 +95,8 @@ type Switch struct {
9495
9596 var (
9697 ErrSwitchDuplicatePeer = errors.New("Duplicate peer")
98+ ErrConnectSelf = errors.New("Connect self")
99+ ErrPeerConnected = errors.New("Peer is connected")
97100 )
98101
99102 func NewSwitch(config *cfg.P2PConfig, trustHistoryDB dbm.DB) *Switch {
@@ -340,11 +343,8 @@ func (sw *Switch) DialSeeds(addrBook *AddrBook, seeds []string) error {
340343 // permute the list, dial them in random order.
341344 perm := rand.Perm(len(netAddrs))
342345 for i := 0; i < len(perm); i++ {
343- go func(i int) {
344- time.Sleep(time.Duration(rand.Int63n(3000)) * time.Millisecond)
345- j := perm[i]
346- sw.dialSeed(netAddrs[j])
347- }(i)
346+ j := perm[i]
347+ sw.dialSeed(netAddrs[j])
348348 }
349349 return nil
350350 }
@@ -362,7 +362,14 @@ func (sw *Switch) DialPeerWithAddress(addr *NetAddress, persistent bool) (*Peer,
362362 if err := sw.checkBannedPeer(addr.IP.String()); err != nil {
363363 return nil, err
364364 }
365-
365+ if strings.Compare(addr.IP.String(), sw.nodeInfo.ListenHost()) == 0 {
366+ return nil, ErrConnectSelf
367+ }
368+ for _, v := range sw.Peers().list {
369+ if strings.Compare(v.mconn.RemoteAddress.IP.String(), addr.IP.String()) == 0 {
370+ return nil, ErrPeerConnected
371+ }
372+ }
366373 sw.dialing.Set(addr.IP.String(), addr)
367374 defer sw.dialing.Delete(addr.IP.String())
368375
@@ -446,38 +453,38 @@ func (sw *Switch) StopPeerForError(peer *Peer, reason interface{}) {
446453 sw.stopAndRemovePeer(peer, reason)
447454
448455 if peer.IsPersistent() {
449- go func() {
450- log.WithField("peer", peer).Info("Reconnecting to peer")
451- for i := 1; i < reconnectAttempts; i++ {
452- if !sw.IsRunning() {
453- return
454- }
456+ log.WithField("peer", peer).Info("Reconnecting to peer")
457+ for i := 1; i < reconnectAttempts; i++ {
458+ if !sw.IsRunning() {
459+ return
460+ }
455461
456- peer, err := sw.DialPeerWithAddress(addr, true)
457- if err != nil {
458- if i == reconnectAttempts {
459- log.WithFields(log.Fields{
460- "retries": i,
461- "error": err,
462- }).Info("Error reconnecting to peer. Giving up")
463- return
464- }
465- if errors.Root(err) == ErrSwitchDuplicatePeer {
466- log.WithField("error", err).Info("Error reconnecting to peer. ")
467- return
468- }
462+ peer, err := sw.DialPeerWithAddress(addr, true)
463+ if err != nil {
464+ if i == reconnectAttempts {
469465 log.WithFields(log.Fields{
470466 "retries": i,
471467 "error": err,
472- }).Info("Error reconnecting to peer. Trying again")
473- time.Sleep(reconnectInterval)
474- continue
468+ }).Info("Error reconnecting to peer. Giving up")
469+ return
475470 }
476471
477- log.WithField("peer", peer).Info("Reconnected to peer")
478- return
472+ if errors.Root(err) == ErrConnectBannedPeer || errors.Root(err) == ErrPeerConnected || errors.Root(err) == ErrSwitchDuplicatePeer || errors.Root(err) == ErrConnectSelf {
473+ log.WithField("error", err).Info("Error reconnecting to peer. ")
474+ return
475+ }
476+
477+ log.WithFields(log.Fields{
478+ "retries": i,
479+ "error": err,
480+ }).Info("Error reconnecting to peer. Trying again")
481+ time.Sleep(reconnectInterval)
482+ continue
479483 }
480- }()
484+
485+ log.WithField("peer", peer).Info("Reconnected to peer")
486+ return
487+ }
481488 }
482489 }
483490
@@ -506,6 +513,8 @@ func (sw *Switch) listenerRoutine(l Listener) {
506513 // ignore connection if we already have enough
507514 maxPeers := sw.config.MaxNumPeers
508515 if maxPeers <= sw.peers.Size() {
516+ // close inConn
517+ inConn.Close()
509518 log.WithFields(log.Fields{
510519 "address": inConn.RemoteAddr().String(),
511520 "numPeers": sw.peers.Size(),
@@ -517,6 +526,8 @@ func (sw *Switch) listenerRoutine(l Listener) {
517526 // New inbound connection!
518527 err := sw.addPeerWithConnectionAndConfig(inConn, sw.peerConfig)
519528 if err != nil {
529+ // conn close for returing err
530+ inConn.Close()
520531 log.WithFields(log.Fields{
521532 "address": inConn.RemoteAddr().String(),
522533 "error": err,
@@ -652,12 +663,10 @@ func (sw *Switch) addPeerWithConnectionAndConfig(conn net.Conn, config *PeerConf
652663
653664 peer, err := newInboundPeerWithConfig(conn, sw.reactorsByCh, sw.chDescs, sw.StopPeerForError, sw.nodePrivKey, config)
654665 if err != nil {
655- conn.Close()
656666 return err
657667 }
658668 peer.SetLogger(sw.Logger.With("peer", conn.RemoteAddr()))
659669 if err = sw.AddPeer(peer); err != nil {
660- conn.Close()
661670 return err
662671 }
663672
Show on old repository browser