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

相關文章
相關標籤/搜索