【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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 