共計 5031 個字符,預計需要花費 13 分鐘才能閱讀完成。
這篇文章主要介紹 Ceph OSD 處理客戶端寫操作處理流程的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、OSD 從 client 端收到請求的處理流程
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_op()
|__OSD::get_pg_or_queue_for_pg()
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::op_wq.queue() 將 client 的請求寫入到隊列
主 OSD 處理從 client 端請求的處理流程
OSD::ShardOpWQ::_process()
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedPG::do_op()
|__ReplicatedPG::execute_ctx()
|__ReplicatedPG::preapare_transcation()
|__ReplicatedPG::do_osd_ops()
|__ReplicatedPG::issue_repop()
|__ReplicateBackend::submit_transaction()
|__ReplicateBackend::issue_op() 主 OSD 將寫請求發送到從 OSDs
|__ReplicatedPG::queue_transcations() 寫主 OSD FileJournal
|__ObjectStore::queue_transactions()
|__FileStore::queue_transactions()
|__JournalingObjectStore::_op_journal_transactions()
|__FileJournal::submit_entry() 將日志寫入到 FileJournal 的 writeq 隊列
|__ReplicatedPG::eval_repop()
主 OSD 的 FileJournal 寫線程
FileJournal::write_thread_entry() 負責從 writeq 隊列中獲取待寫入的日志
|__FileJournal::prepare_multi_write() 構成日志
|__FileJournal::do_write() 實際寫日志
|__FIleJournal::queue_completions_thru()
|__completion_peek_front() 獲取 C_JournalAhead 類實例
|__finisher- queue()
|__finisher_cond.Signal() 啟動 FileJournal 的 finisher 線程處理 C_JournalAhead 類實例
主 OSD 的 C_JournalAhead 類處理
C_JournalAhead::finish()
|__FileStore::_journaled_ahead()
|__FileStore::queue_op()
|__FileStore::op_wq.queue() 將數據寫入到 FileStore 寫線程隊列中
|__ondisk_finisher.queue(ondisk) 調用 ReplicatedBackend- op_commit() 回調函數
主 OSD 的 FileStore 寫數據線程類處理
FileStore::op_wq
|__FileStore::op_wq._process()
|__FileStore::_do_op()
|__FileStore::_do_transactions()
|__FileStore::_do_transaction()
|__FileStore::_write() 落盤到 FileStore 中(寫入指定的文件中)
|__FileStore::op_wq._process_finish()
|__FileStore::_finish_op()
|__op_finisher.queue() 調用 ReplicatedPG::op_applied() 回調函數
2、從 OSD 處理主 OSD 端發送過來的請求
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_replica_op()
|__OSD::get_pg_or_queue_for_pg()
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::op_wq.queue() 將主 OSD 的請求寫入到從 OSD 處理隊列中
從 OSD 處理 workqueue
OSD::ShardOpWQ::_process()
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedBackend::handle_message()
|__ReplicatedBackend::sub_op_modify()
|__ReplicatedBackend::sub_op_modify_impl()
|__注冊 commit 回調函數類 C_OSD_RepModifyCommit()
|__注冊 Apply 回調函數類 C_OSD_RepModifyApply()
|__ReplicatedPG::queue_transcations() 從 OSD 寫 FileJournal
|__ObjectStore::queue_transactions()
|__FileStore::queue_transactions()
|__JournalingObjectStore::_op_journal_transactions()
|__FileJournal::submit_entry() 將日志寫入到 FileJournal 的 writeq 隊列
|__ReplicatedPG::eval_repop()
從 OSD 的 FileJournal 寫線程
FileJournal::write_thread_entry() 負責從 writeq 隊列中獲取待寫入的日志
|__FileJournal::prepare_multi_write() 構成日志
|__FileJournal::do_write() 實際寫日志
|__FIleJournal::queue_completions_thru()
|__completion_peek_front() 獲取 C_JournalAhead 類實例
|__finisher- queue()
|__finisher_cond.Signal() 啟動 FileJournal 的 finisher 線程處理 C_JournalAhead 類實例
從 OSD 的 C_JournalAhead 類處理
C_JournalAhead::finish()
|__FileStore::_journaled_ahead()
|__FileStore::queue_op()
|__FileStore::op_wq.queue() 將數據寫入到 FileStore 寫線程隊列中
|__ondisk_finisher.queue(ondisk) 調用 ReplicatedBackend- op_commit() 回調函數
從 OSD 的日志寫完成后的處理
C_OSD_RepModifyCommit()
|__finish()
|__ReplicatedBackend::sub_op_modify_commit()
|__生成 MOSDRepOpReply 消息 CEPH_OSD_FLAG_ONDISK
|__ReplicatedPG::send_message_osd_cluster() 將從 OSD 回復信息發給主 OSD
|__OSD::send_message_osd_cluster()
從 OSD 的 FileStore 寫數據線程類處理
FileStore::op_wq
|__FileStore::op_wq._process()
|__FileStore::_do_op()
|__FileStore::_do_transactions()
|__FileStore::_do_transaction()
|__FileStore::_write() 落盤到 FileStore 中(寫入指定的文件中)
|__FileStore::op_wq._process_finish()
|__FileStore::_finish_op()
|__op_finisher.queue() 調用 ReplicatedPG::op_applied() 回調函數
從 OSD 的落盤完成后的處理
C_OSD_RepModifyApply()
|__finish()
|__ReplicatedBackend::sub_op_modify_applied()
|__生成 MOSDRepOpReply 消息 CEPH_OSD_FLAG_ACK
|__ReplicatedPG::send_message_osd_cluster() 將從 OSD 回復信息發給主 OSD
|__OSD::send_message_osd_cluster()
3、主 OSD 處理從 OSD 發送 Reply 處理流程
從 OSD 處理主 OSD 端發送過來的請求
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_replica_op()
|__OSD::get_pg_or_queue_for_pg()
|__OSD::enqueue_op()
|__PG::queue_op()
|__OSD::op_wq.queue() 將從 OSD 的 reply 寫入到主 OSD 處理隊列中
主 OSD 處理從 OSD 端發送過來的 reply
OSD::ShardOpWQ::_process()
|__OSD::dequeue_op()
|__ReplicatedPG::do_request()
|__ReplicatedBackend::handle_message()
|__ReplicatedBackend::sub_op_modify_reply()
|__ip_op.waiting_for_commit.erase()
|__ip_op.waiting_for_applied.erase()
|__對于 ip_op.waiting_for_applied 為空,則調用 ip_op.on_applied- complete(0),即:調用 on_all_applied 回調函數處理。on_all_applied 回調函數在 ReplicatedPG.cc::execute_ctx() 函數中注冊,用來對所有副本都落盤完成后的處理。on_all_applied() 函數創建一個 MOSDOpReply 消息并且設置消息的 flags=CEPH_OSD_FLAG_ACK 且將該消息發送給客戶端;
|__對于 ip_op.waiting_for_commit 為空,則調用 ip_op.on_commit- complete(0),即:調用 on_all_commit 回調函數處理。on_all_commit 回調函數在 ReplicatedPG.cc::execute_ctx() 函數中注冊,用來對所有副本在寫 FileJournal 完成后的處理。on_all_commit() 函數創建一個 MOSDOpReply 消息并且設置消息的 flags=CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK 且將該消息發送給客戶端;
以上是“Ceph OSD 處理客戶端寫操作處理流程的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!