PG的建立是由monitor節點發起,造成請求message發送給osd,在osd上建立pg。app
1. 在monitor中由PGmonitor發現是否建立了pool,pool中是否存在pg須要進行建立。首先來看函數PGMonitor::register_new_pgs()函數
1059:循環遍歷當前這個pool中的全部pg。spa
1061:根據當前這個pool中pg的序號和pool的id,造成pg_id。(pg_id 就是用來統計哪一個pool中的第幾個pg而已,使用mseed做爲pg序號,mpool做爲pool序號)。隊列
1062:pg_map中統計了全部的pg,若是發現當前的pg再也不pg_map中,說明這個pg是須要被建立的。rem
1068:使用register_pg函數開始處理申請這個pg。it
2.register_pg()函數開始對pg的申請進行處理,這時已經有了pg_id 和pool的信息。變量
1007:將剛剛建立的pg_id統計到pending_inc.pg_stat_updates結構中。打包
1008:設置這個pg的狀態爲PG_STATE_CREATING。date
接下來會將這個pending_inc 進行打包,而後推行propose_pending,開始提議議題,等待完成最後推行。循環
3.決策推行函數update_from_paxos,在這裏會根據仲裁決定,而後處理結果,上面說道已經推行了建立pg。
0232:從新解碼inc 的決議。
0242:將這個決議交給pg_map進行處理,調用PGMap::apply_incremental()
0295: map_pg_creates將須要建立的pg進行映射到 對應的pg上面。
0296:send_pg_creates 開始將已經準備下發給osd的message。
4.先來看看這個PGMap::apply_incremental(),在函數內會重新解析pg_stat_updates中的成員,獲取每個成員的pg_id和pg_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都封裝到m的mkpg中。
接下來就是經過monitor的messager模塊將消息發送給了osd。接下來看看osd的處理。消息封裝解封的過程就不描述了。
osd這時會收到一個消息 根據消息命令字MSG_OSD_PG_CREATE,發現這是一個建立pg的消息,而後交給handle_pg_create進行處理。
7225:handle_pg_create開始處理建立pg的請求。
7227:從消息請求op中恢復出MOSDPGCreate 的message。
7269:在消息中恢復了全部的pg請求。
7280:解析出pg的編號pg_id到變量on上。
7320:根據pg_id的on開始建立出spg_t的pgid。spg_t結構中主要記錄兩個信息,一個是pg_id的序號,另一個就是primary的osd序號。
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。