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