共計 2612 個字符,預計需要花費 7 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 Ceph Jewel 版本三副本讀操作的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一、主 OSD 讀處理流程
OSD::ms_fast_dispatch()
|__OSD::dispatch_session_waiting()
|__OSD::dispatch_op_fast()
|__OSD::handle_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()
|__檢查當前 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 消息實例
|__調用 ReplicatePG::complete_read_ctx() 將讀操作的結果返回給 client 端
以上是“Ceph Jewel 版本三副本讀操作的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!