一、pipeline结构体
pipeline通道主要负责传递快照数据
pipeline结构体及相关字段如下:
type pipeline struct {
peerID types.ID //该pipeline对应节点的ID
tr *Transport //关联的rafthttp.Transport实例
picker *urlPicker //用于选择可用的url
status *peerStatus //当前peer的状态
raft Raft //底层的raft实例
errorc chan error
// deprecate when we depercate v2 API
followerStats *stats.FollowerStats
msgc chan raftpb.Message //pipeline实例从该通道中获取待发送的消息
// wait for the handling routines
wg sync.WaitGroup //负责同步多个goroutine结束。每个pipeline默认开启4个goroutine来处理msgc中的消息,必须先关闭这些goroutine,才能真正关闭该pipeline
stopc chan struct{}
}
tr 关联的rafthttp.Transport实例
msgc 该channel中存放待发送到对端的消息(快照消息)
raft 底层的raft实例,用于向底层的raft发送消息(如:快照发送成功或失败等)
二、start方法
func (p *pipeline) start() {
p.stopc = make(chan struct{})
p.msgc = make(chan raftpb.Message, pipelineBufSize) //初始化msgc通道,默认缓冲是64个
p.wg.Add(connPerPipeline)
for i := 0; i < connPerPipeline; i++ { //默认开启4个goroutine来处理msgc中待发送的消息
go p.handle()
}
if p.tr != nil && p.tr.Logger != nil {
p.tr.Logger.Info(
"started HTTP pipelining with remote peer",
&