)
var (
- maxNumOfBlocksPerMsg = uint64(1000)
- maxNumOfHeadersPerMsg = uint64(1000)
+ maxNumOfBlocksPerMsg = uint64(1000)
+ maxNumOfHeadersPerMsg = uint64(1000)
+ maxNumOfBlocksRegularSync = uint64(128)
)
type FastSync interface {
headers := make([]*types.BlockHeader, 0)
stopHeader, err := bk.chain.GetHeaderByHash(stopHash)
if err != nil {
- return headers, nil
+ return headers, err
}
if !bk.chain.InMainChain(*stopHash) || stopHeader.Height < startHeader.Height {
func (bk *blockKeeper) regularBlockSync() error {
peerHeight := bk.syncPeer.Height()
bestHeight := bk.chain.BestBlockHeight()
+ targetHeight := bestHeight + maxNumOfBlocksRegularSync
+ if targetHeight > peerHeight {
+ targetHeight = peerHeight
+ }
+
i := bestHeight + 1
- for i <= peerHeight {
+ for i <= targetHeight {
block, err := bk.msgFetcher.requireBlock(bk.syncPeer.ID(), i)
if err != nil {
bk.peers.ProcessIllegal(bk.syncPeer.ID(), security.LevelConnException, err.Error())
}
func (bk *blockKeeper) checkSyncType() int {
- peer := bk.peers.BestIrreversiblePeer(consensus.SFFullNode | consensus.SFFastSync)
- if peer == nil {
- log.WithFields(log.Fields{"module": logModule}).Debug("can't find fast sync peer")
- return noNeedSync
- }
-
bestHeight := bk.chain.BestBlockHeight()
- if peerIrreversibleHeight := peer.IrreversibleHeight(); peerIrreversibleHeight >= bestHeight+minGapStartFastSync {
- bk.fastSync.setSyncPeer(peer)
- return fastSyncType
+ peer := bk.peers.BestIrreversiblePeer(consensus.SFFullNode | consensus.SFFastSync)
+ if peer != nil {
+ if peerIrreversibleHeight := peer.IrreversibleHeight(); peerIrreversibleHeight >= bestHeight+minGapStartFastSync {
+ bk.fastSync.setSyncPeer(peer)
+ return fastSyncType
+ }
}
peer = bk.peers.BestPeer(consensus.SFFullNode)
return noNeedSync
}
- peerHeight := peer.Height()
- if peerHeight > bestHeight {
+ if peer.Height() > bestHeight {
bk.syncPeer = peer
return regularSyncType
}
log.WithFields(log.Fields{"module": logModule, "err": err}).Warning("fail on regularBlockSync")
return false
}
+ default:
+ return false
}
return true