【ETCD】【源码阅读】深入解析 EtcdServer.applyAll方法

让我们从源码层面分析这段代码,逐行解释 applyAll 方法的作用。applyAll 方法主要用于应用 Raft 日志条目、处理快照、以及触发和发送快照信息。

1. 方法定义

func (s *EtcdServer) applyAll(ep *etcdProgress, apply *apply) {
  • 这是 EtcdServer 类型的 applyAll 方法,接受两个参数:
    • ep *etcdProgress:表示一个 etcdProgress 对象,通常包含关于应用日志条目和快照的状态信息。
    • apply *apply:表示应用操作,包含条目和快照,apply.notifyc 是用于通知应用完成的信号通道。

2. 应用快照和条目

s.applySnapshot(ep, apply)
s.applyEntries(ep, apply)
  • s.applySnapshot(ep, apply):该方法负责应用 Raft 快照。通常,Raft 快照保存了日志条目的压缩版本,确保节点在恢复或快照恢复后能够正常启动。
  • s.applyEntries(ep, apply):该方法应用所有的 Raft 日志条目。通过 apply.entries 将日志条目应用到状态机中,ep 记录已应用的条目索引。

3. 更新已应用的条目索引

proposalsApplied.Set(float64(ep.appliedi))
  • 这里通过 proposalsApplied.Set(float64(ep.appliedi)) 更新已应用条目的统计指标。ep.appliedi 是已经应用到状态机的日志条目索引。proposalsApplied 可能是用于监控和报告已应用日志条目数的指标。

4. 触发 applyWait

s.applyWait.Trigger(ep.appliedi)
  • applyWait.Trigger(ep.appliedi):这个方法触发一个等待信号,标记 ep.appliedi 为已应用。当 Raft 组件完成了应用操作后,它将允许其他依赖于此操作的部分继续执行。

5. 等待 Raft 磁盘写入完成

// wait for the raft routine to finish the disk writes before triggering a
// snapshot. or applied index might be greater than the last index in raft
// storage, since the raft routine might be slower than apply routine.
<-apply.notifyc
  • 这里通过 <-apply.notifyc 等待 Raft 例程完成磁盘写入操作。apply.notifyc 是一个信号通道,在 Raft 日志条目被应用到磁盘后触发。该操作确保在快照和已应用的索引更新之前,Raft 例程已经完成对磁盘的写入。

6. 触发快照

s.triggerSnapshot(ep)
  • s.triggerSnapshot(ep):这个方法触发快照操作。快照通常用于压缩状态机的日志条目,在状态机长时间运行后,以减少存储空间的占用。

7. 处理来自外部请求的快照

select {
    // snapshot requested via send()
    case m := <-s.r.msgSnapC:
        merged := s.createMergedSnapshotMessage(m, ep.appliedt, ep.appliedi, ep.confState)
        s.sendMergedSnap(merged)
    default:
}
  • 这里是一个 select 语句,监听从 s.r.msgSnapC 通道收到的快照请求。s.r.msgSnapC 是一个接收快照请求的信道。如果有请求到来,createMergedSnapshotMessage 方法会将快照消息合并,并发送合并后的快照数据(通过 sendMergedSnap)。合并的快照信息通常包括当前状态机的日志索引、应用的条目和配置状态等。
  • 如果没有收到快照请求,default 分支会被触发,不做任何事情。

总结

applyAll 方法的作用是将 Raft 日志条目和快照应用到状态机,并确保日志条目已被持久化到磁盘。其步骤包括:

  1. 应用快照和日志条目到状态机。
  2. 更新已应用条目的指标,并触发等待信号。
  3. 等待 Raft 例程完成磁盘写入。
  4. 触发快照操作。
  5. 处理外部发来的快照请求。

此方法通过处理 Raft 日志和快照,保证了数据一致性并触发必要的存储操作,确保节点在恢复时能够应用完整的日志和配置。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值