Skip to content

复制流控

复制流控相关结构主要位于:

  • include/raftpp/core/progress.h
  • include/raftpp/core/inflights.h
  • include/raftpp/core/progress_tracker.h

每个 follower 的复制进度处于以下三种状态之一:

  • Probe
  • Replicate
  • Snapshot

用于探测 follower 可以接受的日志位置。

用于正常复制路径,leader 可以按窗口持续发送追加消息。

用于 follower 需要通过快照追赶的场景。

Progress 记录单个 follower 的复制状态,核心字段包括:

  • matched
  • next_idx
  • pending_snapshot
  • pending_request_snapshot
  • recent_active
  • inflights
  • committed_index

当前已确认复制到 follower 的最高索引。

下一次复制尝试的起始索引。

当前正在发送或等待确认的快照索引。

Progress 提供以下状态转换方法:

  • BecomeProbe()
  • BecomeReplicate()
  • BecomeSnapshot(snapshot_idx)
  • SnapshotFailure()

Inflights 是一个发送窗口,用于限制每个 follower 同时在路上的追加消息数量。

核心接口:

  • Add(inflight)
  • Full()
  • FreeTo(to)
  • FreeFirstOne()
  • Reset()

当窗口已满时,leader 应暂停继续向该 follower 发送新的追加消息。

ProgressTracker 负责管理所有 peer 的 Progress,并处理:

  • 投票统计
  • 法定人数判断
  • 配置变更应用
  • 最大可提交索引计算

核心接口:

  • CountVotes()
  • HasQuorum()
  • MaxCommittedIndex()
  • ApplyConf()

成员变更会改变 ProgressTracker 内部的配置和 ProgressMapConfChanger 返回的 MapChange 最终会通过 ProgressTracker::ApplyConf() 应用。

  • Inflights 控制的是“在路上的复制请求数量”,不是日志条目数。
  • ProbeReplicateSnapshot 表示复制阶段,而不是节点角色。
  • ProgressTracker 同时承担复制进度和法定人数计算职责。