最近在学习Tendermint的代码,记录下同步区块的流程,直接跳过P2P阶段,后续再写一篇文章记录P2P流程吧
blockchain/pool.go的OnStart()新建了gorountine来发起获取区块请求
func (pool *BlockPool) OnStart() error {
go pool.makeRequestersRoutine()
pool.startTime = time.Now()
return nil
}
看下makeRequestersRoutine的代码
// Run spawns requesters as needed.
func (pool *BlockPool) makeRequestersRoutine() {
for {
if !pool.IsRunning() {
break
}
_, numPending, lenRequesters := pool.GetStatus()
if numPending >= maxPendingRequests {
// sleep for a bit.
time.Sleep(requestIntervalMS * time.Millisecond)
// check for timed out peers
pool.removeTimedoutPeers()
} else if lenRequesters >= maxTotalRequesters {
// sleep for a bit.
time.Sleep(requestIntervalMS * time.Millisecond)
// check for timed out peers
pool.removeTimedoutPeers()
} else {
// request for more blocks.
pool.makeNextRequester()
}
}
}
这里是一个for循环,获取当前pool的状态
1 如果当前pending的个数大于等于10000个,sleep 100ms,并且remove掉timeout的peer(remove timeout peer的逻辑是当前接收peer的bitrate小于10KB/S
2 如果当前request的个数大于等于10000个,sleep 100ms并且remove timeout的peer
3 新建一个请求
func (pool *BlockPool) makeNextRequester() {
pool.mtx.Lock()
defer pool.mtx.Unlock()
nextHeight := pool.height + pool.requestersLen()
request := newBPRequester(pool, nextHeight)
// request.SetLogger(pool.Logger.With("height", nextHei