在上文我们讲到当接收到新的OSDMap,会向该OSD上的所有PG所有PG投递CephPeeringEvt事件。本章我们从该事件讲起,详细地讲述Peering地整个过程。
1. PG::queue_peering_event()
我们知道OSD::peering_wq是OSD调度PG进行peering的关键。基本上有如下两种方式会向OSD::perring_wq投递事件:
下面我们分别搜索这两个函数调用的地方,来看看在什么情况下会向OSD::peering_wq投递peering事件:
1)接收到新的OSDMap,在OSD::consume_map()中投递NullEvt事件
2) OSD::handle_pg_peering_evt()中当需要重生parent pg时,投递NullEvt
3) PG分裂时投递NullEvt
4) PG创建时投递NullEvt
5) 当PG primary收到非primary发送过来的PGNotify消息时,投递MNotifyRec事件
6) 当收到pg_log时,投递MLogRec事件
7) 当收到pg_info时,投递MInfoRec事件
关于MNotifyRec与MInfoRec的区别:
-
MNotifyRec通常是由非PG primary发送给PG primary的pg_info而产生的(一般是PG Primary主动发起查询,然后非PG primary被动回复);
-
MInfoRec通常是在peering完成后,由PG replica主动告知给PG Primary的pg_info信息;或者PG Replica对比权威pg_info当发现自己有丢失的对象时告知给PG primary的(总结为:MInfoRec一般是已经拥有权威pg_info后,replica将自己的pg_info_t告知给PG primary所产生的?)
8) PG在进行Backfill预约时
9)PG在进行Recovery预约时
10) PG primary在搜到所有副本被激活时产生AllReplicasActivated事件
11) PG在scrub过程中发现错误时产生DoRecovery事件
12) PG执行Flush时产生FlushEvt事件
13) PG Replica或PG Stray收到PG Primary的MOSDPGQuery查询时产生MQuery事件
14) 扫描到PG太满时产生BackfillTooFull事件
15) 收到Backfill完成消息时产生RecoveryDone事件
16) PG Primary在activate完成时,根据条件产生不同事件
16) Recovery过程中根据情况产生相应事件
2. OSD::process_peering_events()
process_peering_events()是OSD处理peering事件的总入口,是一个非常关键的函数,下面我们来看实现步骤:
如下图所示:
下面我们逐一讲述这一过程:
2.1 创建PG::RecoveryCtx
代码比较简单,这里不做介绍。
2.2 追赶osdmap
上面我们看到会遍历具有CephPeeringEvt事件的PG列表,然后调用advance_pg()函数来判断当前PG是否已经追赶上了OSDService::osdmap:
这里我们先看OSD::advance_pg()的实现:
1) 如果当前PG::osdmap已经追上OSDService::osdmap,不需要处理直接返回true
2) 设置单次最大能追赶的距离
3) 追赶osdmap
这里我们看到首先会调用pg_to_up_acting_osds()来计算在新的OSDMap下当前PG的up set、up_primary、acting set、acting primary。接着会调用PG::handle_advance_map()来处理当前版本OSDMap的追赶,之后还会根据前后两个OSDMap的差异来判断PG是否产生了分裂(如果产生了分裂,则调用split_pgs()进行处理,关于PG的分裂这里不展开说)。
下面我们来看PG::handle_advance_map()的实现:
我们来看具体的实现步骤:
4) 激活当前OSDMap
这里我们看到会生成一个ActMap事件,并交由PG的recovery_state状态机来进行处理(关于ActMap事件的处理,我们后面详细讲解)
2.3 处理up_thru相关
关于up_thru的作用及原理,请参看其他章节,这里我们不做介绍。
2.4 保存PG::RecoveryCtx中所产生的transaction
这里实现较为简单,不做介绍
2.5 分发PG::RecoveryCtx上下文信息,以及处理pg_temp
这里我们主要来看一下dispatch_context的实现:
这里我们看到,主要是分发上面Peering所产生的notifies、queries、以及infos信息
[参看]
-
ceph博客
-
ceph官网
-
PEERING