Ceph OSD处理客户端写操作处理流程是怎么样的

38次阅读
没有评论

共计 5856 个字符,预计需要花费 15 分钟才能阅读完成。

这篇文章主要为大家展示了“Ceph OSD 处理客户端写操作处理流程是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“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_commit 为空,则调用 ip_op.on_commit- complete(0),即:调用 on_all_commit 回调函数处理。on_all_commit 回调函数在 ReplicatedPG.cc::execute_ctx() 函数中注册,用来对所有副本在写 FileJournal 完成后的处理。on_all_commit() 函数设置 all_committed=true,之后调用 eval_repop() 函数;

               |__对于 ip_op.waiting_for_applied 为空,则调用 ip_op.on_applied- complete(0),即:调用 on_all_applied 回调函数处理。on_all_applied 回调函数在 ReplicatedPG.cc::execute_ctx() 函数中注册,用来对所有副本都落盘完成后的处理。on_all_applied() 函数设置 all_applied=true,之后调用 eval_repop() 函数。在 eval_repop() 函数中若 all_applied=true,则创建一个 MOSDOpReply 消息并且设置消息的 flags=CEPH_OSD_FLAG_ACK 且将该消息发送给客户端;

以上是“Ceph OSD 处理客户端写操作处理流程是怎么样的”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

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