【fabric源码分析-orderer】 orderer模块共识排序服务(RAFT普通交易)
2021-07-21 08:43:54 0 举报
基于fabric2.1源码 关于fabric采用的raft共识实现 其中的普通交易的共识流程
作者其他创作
大纲/内容
batch := c.support.BlockCutter().Cut()配置消息,单条切割
false
true
根据设置规则切割1.单条消息大小大于MaxBytes2.累计消息大于MaxBytes3.等待时间大于设定时间,发信号给time.C
调用batch:=c.support.ProcessNormalMsg()处理普通消息
1.创建一个shutdownSignal chan2.收集现在正在使用的服务器证书3.为给定的通道设定所有的节点4.过滤重新配置后保留下来的证书,关闭被过滤掉的节点的连接
ordere.consensus.etcdraft.chain.go
go c.gc()响应c.gc channel的信号将过期的可配置个数前的消息和snapshot清空
go c.run() 启动节点监听
Start()
rd.SoftState当前是否存在状态变换
if campaign && rd.SoftState !=nil
fresh
判断节点加入已存在的channel或是不存在的通道isJoin := c.support.Height() > 1
开启一个循环监听1.raftTicker.C(),维持当前状态不变2.n.Ready() 准备好处理raftf发来的消息3.notifyLeaderChangeC通知进行leader切换4.n.chain.haltC 接受链停止消息
如果notifyLeaderChangeC != nil且rd.SoftState不为nil且lead不为空
配置消息
1.3 orderer模块共识排序服务(Submit交易)
s := <-submitC
开启周期检测c.periodicChecker.Run()
启动一个匿名函数,1循环监听campaignTicker.C(),接受到信号后调用n.Campaign(context.TODO()),将节点设为候选者,开始竞争leader2循环监听elected ,接受到信号,代表节点启动时已存在另一个leader。return出当前函数
c.run()
调用n.Node :=raft.RestartNode()重启节点
c.fresh在newChain的时候设置,不存在WALDir为true
orderer.consensus.etcdraft.node
isjoin
c.orderer()
如果发送成功的节点在unreachable列表里,在发送成功后将其从列表里删除.如果失败,将该节点加入unreachable列表,并记录失败日志和状态SnapshotFailure
根据设置规则得到messageBatches1.单条消息大小大于MaxBytes2.累计消息大于MaxBytes
rd := <-n.Ready()
n.rpc.SendConsensus发送共识消息给其他节点
如果提交消息大小不为nil或者有状态更新
出现以下情况退出当前for循环1.s=nil2.当前处于选举/预选举状态设置leader为none3.当前节点不是leader节点4.调用c.ordered(s.req)失败
符合规则后,调用r.cut,内容是检查和置零
n.send()
调用c.support.ProcessConfigMsg()处理配置消息
raftPeers=nil
isConfig
开始计时
run()
raftPeers := RaftPeers(n.metadata.ConsenterIds)
c.ordered()
case notifyLeaderChangeC <- l
if leader != 0 {campaign = false}
orderer.common.cluster.comm
如果msg.LastValidationSeq小于当前seq序号
调用n.Advance()全部处理完,通知Raft处理完毕,可以发下一个Ready了
设置周期检测配置
campaign
comm.Configure()
启动raft节点作为一个新channel的一部分
go n.run(campaign)
开启一个循环监听1.submitC submit的消息传递到这里处理2.c.applyC 接收由底层raft处理好抛出给应用层的各种消息3.timer.C()超时切块4.c.snapC 底层状态机准备好快照数据后,发送到此 channel5.c.doneC 接收节点停止信号
timer.C()
配置通信层configureComm
启动raft节点加入一个已存在的channel
普通消息
n.send(rd.Messages)发送给其他节点
0 条评论
下一页