文档章节

Ceph OSD处理客户端写操作处理流程

linuxhunter
 linuxhunter
发布于 2016/03/25 15:09
字数 905
阅读 1115
收藏 2

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且将该消息发送给客户端;

                    



© 著作权归作者所有

linuxhunter
粉丝 71
博文 144
码字总数 93264
作品 0
沈阳
高级程序员
私信 提问
加载中

评论(6)

linuxhunter
linuxhunter 博主

引用来自“zhiyuan”的评论

感谢博主分享
还有几个看不懂的地方请博主帮忙解释
1.on_all_commit()和on_all_applied()对应OSD的状态区别是什么? 我的理解on_all_commit()对应是所有的PG对应的OSD都完成了journal的写入,但是不太明白on_all_applied()对应的OSD的状态是什么
2.on_all_commit()和on_all_applied()条件达到的时候都会回调返回Client信息,但是按照一般理解,每次写入只会返回一次,具体在哪个回调中返回时通过client的API的参数决定的吗?

引用来自“linuxhunter”的评论

关于问题1:所有副本的待写入的数据都已经完成落盘,此时on_all_applied()通知client端数据已经写入磁盘且此时的数据是可读的。on_all_committed()通知client端数据已经写入日志但数据不可读; 关于问题2:on_all_commit()和on_all_applied()是主OSD向2个副本OSDs发送写请求时注册的回调函数,该回调函数时在2个副本OSDs分别写日志和落盘均成功后才会调用,在回调函数中会向client发送MOSDOpReply消息。on_all_commit()和on_all_applied()回调在ReplicatedPG.cc::issue_repop()函数中创建,在该函数中调用ReplicatedBackend::submit_transcation()时以参数的形式传递出去的。

引用来自“zhiyuan”的评论

感谢博主的回答 另外关于 on_all_applied()函数创建一个MOSDOpReply消息并且设置消息的flags=CEPH_OSD_FLAG_ACK且将该消息发送给客户端 on_all_commit()函数创建一个MOSDOpReply消息并且设置消息的flags=CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK且将该消息发送给客户端 --- 如果on_all_commit 对应日志写入,on_all_applied对应数据写入,为什么on_all_commit 会或上CEPH_OSD_FLAG_ONDISK这个bit? 另外是否可以说Client每次object写入都会收到Primary OSD的两个消息(分别在on_all_commit和on_all_applied回调的时候) 谢谢
Client只会收到一次相应消息,就是在on_all_applied回调函数中设置all_applied=true,之后在eval_repop()函数中向client发送带有CEPH_OSD_FLAG_ACK标识的MOSDReply消息。之前我写的最后一段有错误。
z
zhiyuan

引用来自“zhiyuan”的评论

感谢博主分享
还有几个看不懂的地方请博主帮忙解释
1.on_all_commit()和on_all_applied()对应OSD的状态区别是什么? 我的理解on_all_commit()对应是所有的PG对应的OSD都完成了journal的写入,但是不太明白on_all_applied()对应的OSD的状态是什么
2.on_all_commit()和on_all_applied()条件达到的时候都会回调返回Client信息,但是按照一般理解,每次写入只会返回一次,具体在哪个回调中返回时通过client的API的参数决定的吗?

引用来自“linuxhunter”的评论

关于问题1:所有副本的待写入的数据都已经完成落盘,此时on_all_applied()通知client端数据已经写入磁盘且此时的数据是可读的。on_all_committed()通知client端数据已经写入日志但数据不可读; 关于问题2:on_all_commit()和on_all_applied()是主OSD向2个副本OSDs发送写请求时注册的回调函数,该回调函数时在2个副本OSDs分别写日志和落盘均成功后才会调用,在回调函数中会向client发送MOSDOpReply消息。on_all_commit()和on_all_applied()回调在ReplicatedPG.cc::issue_repop()函数中创建,在该函数中调用ReplicatedBackend::submit_transcation()时以参数的形式传递出去的。
感谢博主的回答 另外关于 on_all_applied()函数创建一个MOSDOpReply消息并且设置消息的flags=CEPH_OSD_FLAG_ACK且将该消息发送给客户端 on_all_commit()函数创建一个MOSDOpReply消息并且设置消息的flags=CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK且将该消息发送给客户端 --- 如果on_all_commit 对应日志写入,on_all_applied对应数据写入,为什么on_all_commit 会或上CEPH_OSD_FLAG_ONDISK这个bit? 另外是否可以说Client每次object写入都会收到Primary OSD的两个消息(分别在on_all_commit和on_all_applied回调的时候) 谢谢
linuxhunter
linuxhunter 博主

引用来自“zhiyuan”的评论

感谢博主分享
还有几个看不懂的地方请博主帮忙解释
1.on_all_commit()和on_all_applied()对应OSD的状态区别是什么? 我的理解on_all_commit()对应是所有的PG对应的OSD都完成了journal的写入,但是不太明白on_all_applied()对应的OSD的状态是什么
2.on_all_commit()和on_all_applied()条件达到的时候都会回调返回Client信息,但是按照一般理解,每次写入只会返回一次,具体在哪个回调中返回时通过client的API的参数决定的吗?
关于问题1:所有副本的待写入的数据都已经完成落盘,此时on_all_applied()通知client端数据已经写入磁盘且此时的数据是可读的。on_all_committed()通知client端数据已经写入日志但数据不可读; 关于问题2:on_all_commit()和on_all_applied()是主OSD向2个副本OSDs发送写请求时注册的回调函数,该回调函数时在2个副本OSDs分别写日志和落盘均成功后才会调用,在回调函数中会向client发送MOSDOpReply消息。on_all_commit()和on_all_applied()回调在ReplicatedPG.cc::issue_repop()函数中创建,在该函数中调用ReplicatedBackend::submit_transcation()时以参数的形式传递出去的。
z
zhiyuan
感谢博主分享
还有几个看不懂的地方请博主帮忙解释
1.on_all_commit()和on_all_applied()对应OSD的状态区别是什么? 我的理解on_all_commit()对应是所有的PG对应的OSD都完成了journal的写入,但是不太明白on_all_applied()对应的OSD的状态是什么
2.on_all_commit()和on_all_applied()条件达到的时候都会回调返回Client信息,但是按照一般理解,每次写入只会返回一次,具体在哪个回调中返回时通过client的API的参数决定的吗?
linuxhunter
linuxhunter 博主

引用来自“十一刻”的评论

博主 厉害。4

一起学习一起进步
十一刻
十一刻
博主 厉害。4
Ceph Jewel版本三副本写操作流程

一、主OSD写处理流程 OSD::msfastdispatch() __OSD::dispatch_session_waiting() __OSD::dispatch_op_fast() __OSD::handle_op() __OSD::get_pg_or_queue_for_pg() 找到OpRequest中对应的PG和......

linuxhunter
2016/05/20
643
0
ceph的数据存储之路(12)----- cache tier 曾经有过的YY

对于cache的东西啊,我曾经在公司的项目中,有写过cache的经历,所以我以为我很了解,在我看ceph手册对于cache tier描述的时候,感觉没啥新鲜的东西,但是当我对应到ceph源码级别的时候,发现...

一只小江
2016/11/15
2.8K
0
ceph的数据存储之路(5) -----osd数据处理

osd的数据处理 当osd接管了来自rbd client发送的请求,在osd上进行解析,经过一系列的处理,最后保存到了osd的磁盘上。 上一节中讲述了rbdclient端是如何处理请求数据的,下面开始从osd接受数...

一只小江
2015/11/23
7.8K
24
Redhat Ceph存储之“深入理解Ceph架构”

本文由Ceph中国社区穆艳学翻译、耿航校稿,英文原文出处: RedHatCephStorage-2-ArchitectureGuide (扫文尾二维码读原文) 目录 第1章 概览 第2章 存储集群架构 2.1 存储池 2.2 身份认证 2.3 ...

架构师技术联盟
2018/09/06
0
0
Ceph Jewel版本三副本读操作流程

一、主OSD读处理流程 OSD::msfastdispatch() __OSD::dispatch_session_waiting() __OSD::dispatch_op_fast() __OSD::handle_op() __OSD::get_pg_or_queue_for_pg() 找到OpRequest中对应的PG和......

linuxhunter
2016/05/20
704
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 linuxdeployqt qt5.13.1 打包程序

原文链接:https://www.cnblogs.com/linuxAndMcu/p/11016322.html 一、简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的...

shzwork
20分钟前
4
0
IDEA 配置Springboot项目热部署

实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Settings-C...

小强的进阶之路
31分钟前
5
0
免费数据分析工具:secsoso

前段时间思考了理想数据分析平台,之后我们根据这个思路开发了spl语言并提供了一个数据分析平台,这个平台主要用在搜索ES,数据库索引中的数据。但后来发现对文件的事后处理也是个非常重要的...

赛克蓝德
33分钟前
5
0
暗黑2不能正常启动?带你轻松使用WIN10运行游戏

暗黑破坏神2这款游戏由于年代比较久远,所以设置启动这方面与现在的大部分游戏有很大差距,由于当初完美运行暗黑2是当年使用最多的XP系统,在使用现在大多数玩家使用的WIN7到WIN10系统常会出...

太空堡垒185
37分钟前
6
0
maven项目对象模型(二)

1.4.4.传递性依赖 一个传递性依赖就是一个依赖的依赖。如果project-a依赖于project-b,而后者接着依赖于project-c,那么project-c就是被认为是project-a的传递性依赖。如果project-c依赖于p...

万建宁
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部