共计 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 行业资讯频道!