久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Ceph OSD處理客戶端寫操作處理流程的示例分析

141次閱讀
沒有評論

共計 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 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計5031字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 通许县| 定安县| 马公市| 蒲城县| 莱西市| 安化县| 定安县| 杨浦区| 乐亭县| 太康县| 双鸭山市| 渭源县| 封开县| 隆林| 湖南省| 清河县| 枞阳县| 民乐县| 惠安县| 师宗县| 定州市| 拜泉县| 井冈山市| 防城港市| 都安| 固安县| 潼南县| 保山市| 鄂温| 延安市| 西畴县| 金沙县| 宾川县| 巴南区| 万源市| 胶州市| 平陆县| 福海县| 大方县| 运城市| 百色市|