Ceph Jewel版本三副本读操作的示例分析

63次阅读
没有评论

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计2612字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)