【fabric源码分析-orderer】orderer模块共识排序服务(RAFT配置交易)
2021-07-21 08:52:35 0 举报
基于fabric2.1源码 raft共识 配置交易部分
作者其他创作
大纲/内容
循环请求区块,直到到达index
4.c.applyC 接收由底层raft处理好抛出给应用层的各种消息
c.run()
判断当前对应节点状态,进行对应操作
EntryConfChange
否
是
如果消息类型为RemoveNode且被移除的节点就是leader
区块头类型HeaderType_CONFIGHeaderType_ORDERER_TRANSACTION
调用c.catchUp从其他节点请求 快照block 数据
旧
EntryNormal
判断当前节点是新leader或是旧leader
如果justElected为true 表示节点刚被选举
开启一个循环监听1.submitC submit的消息传递到这里处理3.timer.C()超时切块5.c.doneC 接收节点停止信号
调用becomeFollower()
如果消息类型为RemoveNode且被移除的就是当前节点
2.c.snapC 底层状态机准备好快照数据后,发送到此 channel
目前待处理的数据已经低于消息最大待处理的限制,恢复接收 submit 请求 submitC = c.submitC
还有配置消息没有完成,暂停接收sumit 请求 submitC = nil
普通消息区块
更新本地index和状态
判断消息类型是AddNode或RemoveNode,并在日志中打印记录
从区块中获取配置信息
调用对应orderer的deliver服务拉取block
启动一个 goroutine 循环等待接收新创建的 block 数据,收到的 block 数据会发送给底层状态机,以获得共识c.propose 函数中新生成的 block 正是传递到这里处理的
新
app := <-c.apply
调用becomeLeader()
根据修改后的MSP调用c.configureComm、更新通信配置
app := <-c.applyC
调用c.Node.abdicateLeader(lead)如果在leader上调用这个函数,它会选择一个最近处于活动状态的节点,并尝试将leader转移给它。如果在follower上调用这个,它只是等待leader更改直到超时(ElectionTimeout)。
调用WriteBlock直接写入
调用WriteConfigBlock写入
app.soft != nil
c.Halt()停止并释放资源将节点从复制集中删除
调用c.apply(app.entries)对raft的Entry消息进行应用处理
获得这批消息对应的leader信息newLeader
将newLeader存储为最新leader
sn := <-c.snapC://底层状态机准备好快照数据后,发送到此 channel
都不是
新leader暂时不能处理请求,continue
根据修改后的配置信息更新MSP信息
将soft传入通道c.observeC 通知外部观察者(当前没有这个角色)
开启一个go协程,处理配置消息
循环遍历出每一个消息进行处理
判断当前是否有之前的普通消息或者配置消息正在同步
configInflight
c.blockInflight < c.opts.MaxInflightBlocks
累计接受的普通消息数据达到了限制,则发送 gc 信号,让状态机开始准备快照
//正在同步的区块设为0 c.blockInflight = 0 //清除缓存,这部分会被丢弃,只能由客户端重新发起 _ = c.support.BlockCutter().Cut() stopTimer() //准备接受submit请求 submitC = c.submitC bc = nil c.Metrics.IsLeader.Set(0)
判断当前是否有正在处理的状态更新消息
开一个go协程单独处理同时设configInflight = true
如果调用失败,抛出Panicf,停止代码执行
配置区块
更新index
break
传递过来的快照index小于当前index
配置节点的submitC为链的submitC。开始接受submit请求submitC = c.submitC c.justElected = false
构建一个raft.SoftState结构体soft。包括最新leader和raft当前状态
0 条评论
下一页