1、主OSD寫處理流程數組
OSD::ms_fast_dispatch()session
|__OSD::dispatch_session_waiting()app
|__OSD::dispatch_op_fast()函數
|__OSD::handle_op()spa
|__OSD::get_pg_or_queue_for_pg() 找到OpRequest中對應的PG和Pool信息日誌
|__OSD::enqueue_op()對象
|__PG::queue_op()隊列
|__OSD::ShardedThreadPool::ShardedWQ::queue() 將PG和Op一塊兒放入隊列中get
OSD::ShardedOpWQ::_process() 負責處理OSD::ShardedThreadPool::ShardedWQ隊列中的Op回調函數
|__PGQueueable::RunVis::operator()(const OpRequestRef &op)
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__檢查當前PG是否處於flush或peering狀態,如果則將op放入waiting_for_peered隊列中等待PG變成可用狀態
|__檢查當前PG是否處於Active狀態,若不是則將op放入waiting_for_active隊列中
|__檢查當前PG是否處於REPLAY狀態,如果則將op放入waiting_for_active隊列中
|__ReplicatedPG::do_op()
|__RepliatedPG::do_pg_op() 對於請求中包含對PG的操做CEPH_OSD_RMW_FLAG_PGOP
|__根據op請求建立hobject_t類對象(head)
|__檢查對象名字長度/對象locator key長度/對象locator名稱空間長度是否大於osd_max_object_name_len
|__經過FileStore檢查object的head是否有效
|__檢查op請求地址是否在OSDMap的blacklist中
|__對於寫請求,檢查寫請求的數據大小是否大於osd_max_write_size值
|__對於op請求的head目前不可讀,則將op放入waiting_for_unreadable_object隊列中且調用maybe_kick_recovery()函數嘗試啓動recovery
|__ReplicatedPG::is_degraded_or_backfilling_object() 檢查當前op請求的head是否處於recovery或backfill狀態
|__ReplicatedPG::wait_for_degraded_object() 將當前op請求的head放入waiting_for_degraded_object隊列中
|__檢查head是否在objects_blocked_on_degraded_snap隊列中,如果則將當前op請求的head放入waiting_for_degraded_object隊列中
|__檢查head是否在objects_blocked_on_snap_promotion隊列中,如果則將當前op請求的head放入waiting_for_blocked_object隊列中
|__檢查head是否在objects_blocked_on_cache_full隊列中,如果則將當前op請求的head放入waiting_for_cache_not_full隊列中
|__檢查head的snapdir是否不可讀,如果則將head的snapdir放入waiting_for_unreadable_object隊列中且調用maybe_kick_recovery()函數嘗試啓動recovery
|__檢查head的snapdir是否處於recovery或backfill狀態,如果則將head的snapdir放入waiting_for_degraded_object隊列中
|__對於op寫請求已經在PGLog中,則若已經完成了寫操做則直接給客戶端返回MOSDOpReply消息且設置CEPH_OSD_FLAG_ACK,不然將op放入到waiting_for_ack或waiting_for_ondisk隊列中
|__ReplicatedPG::find_object_context() 獲得object context信息
|__檢查object context是否處於io blocked狀態,如果則將op請求放入到waiting_for_blocked_object或waiting_for_degraded_object隊列中
|__ReplicatedPG::execute_ctx()
|__ReplicatedPG::prepare_transaction()
|__建立MOSDOpReply消息實例
|__ReplicatedPG::calc_trim_to() 計算trim PGLog
|__ReplicatedPG::register_on_applied() 註冊on_applied回調處理函數,對於op請求須要ack且此時沒有向客戶端發送過sent_ack或sent_disk,則建立MOSDOpReply消息且在消息上添加CEPH_OSD_FLAG_ACK標識後將MOSDOpReply消息發送給客戶端
|__ReplicatedPG::register_on_commit() 註冊on_committed回調處理函數, 對於op請求須要ack且此時沒有向客戶端發送過sent_disk,則建立MOSDOpReply消息且在消息上添加CEPH_OSD_FLAG_ACK和CEPH_OSD_FLAG_ONDISK標識後將MOSDOpReply消息發送給客戶端
|__ReplicatedPG::register_on_success() 註冊on_success回調處理函數
|__ReplicatedPG::register_on_finish() 註冊on_finish回調處理函數
|__ReplicatedPG::new_repop() 建立RepGather類對象
|__ReplicatedPG::issue_repop()
|__建立C_OSD_RepopCommit類對象,即:全部副本都完成commit後的回調函數類,在該函數中設置repop->all_committed=true,最後調用ReplicatedPG::eval_repop()
|__建立C_OSD_RepopApplied類對象,即:全部副本都完成applied後的回調函數類,在該函數中設置repop->all_applied=true,最後調用ReplicatedPG::eval_repop()
|__ReplicatedBackend::submit_transaction()
|__ReplicatedBackend::issue_op()
|__ReplicatedBackend::generate_subop() 建立MOSDRepOp消息類對象
|__ReplicatedPG::send_message_osd_cluster()
|__OSD::send_message_osd_cluster() 將MOSDRepOp消息發送給副本所在的OSDs節點
|__建立C_OSD_OnOpApplied類對象,用來處理本地applied完成後的回調函數類
|__建立C_OSD_OnOpCommit類對象,用來處理本地commit完成後的回調函數類
|__RepliatedPG::queue_transactions()
|__ObjectStore::queue_transactions()
|__FileStore::queue_transactions()
|__JournalingObjectStore::_op_journal_tranactions()
|__FileJournal::submit_entry() 將寫日誌請求提交到日誌任務隊列中,日誌寫完後回調C_JournaledAhead類對象
|__ReplicatedPG::eval_repop()
|__檢查repop->rep_done是否完成
|__檢查repop->all_commit,即:是否全部副本都完成日誌寫入,若完成則回調on_committed()回調函數
|__檢查repop->all_applied,即:是否全部副本都完成落盤,若完成則回調on_applied()回調函數
|__檢查repop->all_commit和repop->all_applied,即:是否全部副本都完成寫入操做,若完成則調用repop->on_success()回調函數
本地寫日誌完成後的處理流程
C_JournaledAhead::finish()
|__FileStore::_journaled_ahead()
|__FileStore::queue_op() 將寫請求放入到FileStore的op_wq隊列中
|__回調C_OSD_OnOpCommit類對象的處理函數
本地數據落盤處理流程
FileStore::_do_op()
|__從op_wq隊列中讀取寫請求
|__FileStore::_do_transactions() 執行實際的寫數據操做
本地數據落完完成後的處理流程
FileStore::_finish_op()
|__回調C_OSD_OnOpApplied類對象的處理函數
2、副本OSD處理主OSD發送過來的寫請求(消息是MOSDRepOp,消息類型是MSG_OSD_REPOP)
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_replica_op()
|__檢查發送方有效性
|__OSD::get_pg_or_queue_for_pg() 找到OpRequest中對應的PG和Pool信息
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::ShardedThreadPool::ShardedWQ::queue() 將PG和Op一塊兒放入隊列中
OSD::ShardedOpWQ::_process() 負責處理OSD::ShardedThreadPool::ShardedWQ隊列中的Op
|__PGQueueable::RunVis::operator()(const OpRequestRef &op)
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedBackend::handle_message()
|__ReplicatedBackend::sub_op_modify()
|__ReplicatedPG::log_operation()
|__PG::append_log() 寫PGLog
|__建立C_OSD_RepModifyCommit類實例,用於處理日誌commit完成後的回調處理
|__建立C_OSD_RepModifyApply類實例,用於處理數據落盤完成後的回調處理
|__ReplicatedPG::queue_transactions()
|__FileStore::queue_transactions()
|__JournalingObjectStore::_op_journal_tranactions()
|__FileJournal::submit_entry() 將寫日誌請求提交到日誌任務隊列中,日誌寫完後回調C_JournaledAhead類對象
本地寫日誌完成後的處理流程
C_JournaledAhead::finish()
|__FileStore::_journaled_ahead()
|__FileStore::queue_op() 將寫請求放入到FileStore的op_wq隊列中
|__回調C_OSD_RepModifyCommit類對象的處理函數
本地數據落盤處理流程
FileStore::_do_op()
|__從op_wq隊列中讀取寫請求
|__FileStore::_do_transactions() 執行實際的寫數據操做
本地數據落完完成後的處理流程
FileStore::_finish_op()
|__回調C_OSD_RepModifyApply類對象的處理函數
3、主OSD處理副本OSDs發送過來的MOSDRepOpReply消息處理流程(消息類型MSG_OSD_REPOPREPLY)
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_replica_op()
|__檢查發送方有效性
|__OSD::get_pg_or_queue_for_pg() 找到OpRequest中對應的PG和Pool信息
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::ShardedThreadPool::ShardedWQ::queue() 將PG和Op一塊兒放入隊列中
OSD::ShardedOpWQ::_process() 負責處理OSD::ShardedThreadPool::ShardedWQ隊列中的Op
|__PGQueueable::RunVis::operator()(const OpRequestRef &op)
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedBackend::handle_message()
|__ReplicatedBackend::sub_op_modify_reply()
|__對於設置了CEPH_OSD_FLAG_ONDISK標識的消息來講,刪除waiting_for_commit隊列中對應的OSD ID
|__刪除waiting_for_applied隊列中對應的OSD ID
|__對於waiting_for_commit隊列爲空,則調用C_OSD_RepopCommit類對象的回調函數
|__對於waiting_for_applied隊列爲空,則調用C_OSD_RepopApplied類對象的回調函數
4、回調函數類處理
C_OSD_RepModifyCommit類處理流程
C_OSD_RepModifyCommit::finish()
|__ReplicatedBackend::sub_op_modify_commit()
|__建立MOSDRepOpReply消息且設置CEPH_OSD_FLAG_ONDISK標識
|__ReplicatedPG::send_message_osd_cluster()
|__OSD::send_message_osd_cluster() 將MOSDRepOpReply消息發送回主OSD
C_OSD_RepModifyApply類處理流程
C_OSD_RepModifyApply::finish()
|__ReplicatedBackend::sub_op_modify_applied()
|__建立MOSDRepOpReply消息且設置CEPH_OSD_FLAG_ACK標識(針對沒有進行日誌處理的狀況)
|__ReplicatedPG::send_message_osd_cluster()
|__OSD::send_message_osd_cluster() 將MOSDRepOpReply消息發送回主OSD
C_OSD_OnOpCommit處理流程
C_OSD_OnOpCommit::finish()
|__ReplicatedBackend::op_commit()
|__刪除waiting_for_commit數組中對應OSD ID信息
|__檢查waiting_for_commit數組是否爲空,若爲空則調用C_OSD_RepopCommit類對象的回調函數
C_OSD_OnOpApplied處理流程
C_OSD_OnOpApplied::finish()
|__ReplicatedBackend::op_applied()
|__刪除waiting_for_applied數組中對應OSD ID信息
|__檢查waiting_for_applied數組是否爲空,若爲空則調用C_OSD_RepopApplied類對象的回調函數