当PG完成了Peering过程后,处于Active状态的PG就已经可以对外提供服务了。如果该PG的各个副本上有不一致的对象,就需要进行修复。Ceph的修复过程有两种:Recovery和Backfill,
这里我们讨论Recovery的过程。Peering的过程在代码实现上是通过Boost状态机在各种状态下触发各种事件来执行相应的行为。PG完成Peering过程后,就处于activate状态,
如果需要Recovery,就产生DoRecovery事件,触发修复操作。
2.相关变量及函数
整个recovery过程比较复杂,我将代码中比较常见的一些变量和函数进行补充说明,以后逐渐完善
- peer_missing:每个osd需要恢复的object集合 ,保存在peer_missing结构中。
- needs_recovery_map:本次recovery过程所有需要恢复的object,保存在needs_recovery_map中。
- missing_loc:这些需要恢复的object可以从哪些osd上拉取数据,保存在 missing_loc结构中。
- clone_overlap:保存本次clone对象和上次clone对象(或者head对象)的overlap的部分,也就是重叠的部分。
-
head对象:也就是对象的原始对象,该对象可以进行写操作。
-
snap对象:对某个对象做快照后,通过cow机制copy出来的快照对象只能读,不能写。
- snap_seq或者seq:快照序号,每次做snapshot操作系统都分配一个相应快照序号,该快照序号在后面的写操作中发挥重要作用。
- snapdir对象:当head对象被删除后,仍然有snap和clone对象,系统自动创建一个snapdir对象,来保存SnapSet信息
- ObjectContext可以说是对象在内存中的一个管理类,保存了一个对象的上下文信息
-
RecoveryHandle: 同一组消息中恢复多个对象的一个结构体。
- clone_overlap:写操作导致的和最新的克隆对象重叠的部分
- interval_set:区间集合,一般由多对(start,len)区间集合构成。
- insert,intersection_of,union_of,用于对interval_set类型