ceph的数据存储之路(6) -----pg的建立

PG 的建立过程

PG的建立是由monitor节点发起,造成请求message发送给osd,在osd上建立pgapp

 

1、monitor节点处理

1. monitor中由PGmonitor发现是否建立了poolpool中是否存在pg须要进行建立。首先来看函数PGMonitor::register_new_pgs()函数

1059:循环遍历当前这个pool中的全部pgspa

1061:根据当前这个poolpg的序号和poolid,造成pg_id。(pg_id 就是用来统计哪一个pool中的第几个pg而已,使用mseed做为pg序号,mpool做为pool序号)。队列

1062pg_map中统计了全部的pg,若是发现当前的pg再也不pg_map中,说明这个pg是须要被建立的。rem

1068:使用register_pg函数开始处理申请这个pgit

 

2.register_pg()函数开始对pg的申请进行处理,这时已经有了pg_id pool的信息。变量

1007:将刚刚建立的pg_id统计到pending_inc.pg_stat_updates结构中。打包

1008:设置这个pg的状态为PG_STATE_CREATINGdate

接下来会将这个pending_inc 进行打包,而后推行propose_pending,开始提议议题,等待完成最后推行。循环

 

3.决策推行函数update_from_paxos,在这里会根据仲裁决定,而后处理结果,上面说道已经推行了建立pg

 

0232:从新解码inc 的决议。

0242:将这个决议交给pg_map进行处理,调用PGMap::apply_incremental()

0295: map_pg_creates将须要建立的pg进行映射到 对应的pg上面。

0296send_pg_creates 开始将已经准备下发给osdmessage

 

4.先来看看这个PGMap::apply_incremental(),在函数内会重新解析pg_stat_updates中的成员,获取每个成员的pg_idpg_state。而后将这两个参数交给stat_pg_add()

0482:若是当前的pg_state 状态是PG_STATE_CREATING,表明他须要被建立。

0484:将这个pg_id添加creating_pgs的队列中,等待被处理。

 

5.当须要被建立的pg_id已经添加到creating_pgs中以后,就会继续交给map_pg_creates()处理了,下面看看这个函数。

 

1143:开始尝试遍历creating_pgs的队列。

1146:从新解析pg_id

1149:判断这个pg是否已经存在了。固然第一次建立pg这里是不会出现的。

1165:这里根据pg_id等信息能够找到osd的集合,而且知道那些是主osd

1191:在pg_map中一样存在一个队列creating_pgs_by_osd,这个队列中保存着每一个osd须要建立的pg

 

6.这样这个建立pg的请求就转化成了creating_pgs_by_osd队列的处理了,下面看下处理这个队列的函数send_pg_creates().在这里按着osd进行处理继续分发到send_pg_creates(osd,con)中进行处理。

1239:这时建立一个用于传递建立pg的消息 MOSDPGCreate

1240:开始整理这个osd上全部须要建立的pg_id.

1242:将这个须要建立的pg都封装到mmkpg中。

接下来就是经过monitormessager模块将消息发送给了osd。接下来看看osd的处理。消息封装解封的过程就不描述了。

 

2、osd的建立pg请求处理

osd这时会收到一个消息 根据消息命令字MSG_OSD_PG_CREATE,发现这是一个建立pg的消息,而后交给handle_pg_create进行处理。

7225handle_pg_create开始处理建立pg的请求。

7227:从消息请求op中恢复出MOSDPGCreate message

7269:在消息中恢复了全部的pg请求。

7280:解析出pg的编号pg_id到变量on上。

7320:根据pg_idon开始建立出spg_tpgidspg_t结构中主要记录两个信息,一个是pg_id的序号,另一个就是primaryosd序号。

 7362:将history信息根据pgid添加到creating_pgs结构中。

7363:将parent信息根据pgid添加到creating_pgs结构中。

7364:将acting信息根据pgid添加到creating_pgs结构中。

7365:开始获取当前pg的全部osd信息 根据pgid添加到creating_pgs结构中。

7400:开始准备建立一个pg了,调用函数_create_lock_pg().该函数中继续调用_open_lock_pg()_make_pg()来建立PG

2548:判断这个pool的类型是replicated 仍是erasure类型的。

2551:这里开始建立PG,这个PG的具体实现方式就是ReplicatedPG

 

而后在回到函数handle_pg_create中继续进行pg->handle_create(&rctx);

pg->handle_create 开始一个pg的状态处理。后面的章节会描述pg状态的变化过程。pg的状态变化过程叫作peering

相关文章
相关标签/搜索