文档介绍:Ceph读写流程
1
提纲
基本概念
Ceph IO框架
Ceph IO栈语义变化
Ceph IO栈的流水线模型
Ceph 读操作流程
Ceph 写操作流程
附录
2
将ceph看成一个黑盒,具有若干对外接口
-控制接口
-数据接口
生产者/消费者模型,线程/线程池/队列
回调函数, finisher类
消息机制
3
读写框架
4
语义变化(块设备读为例)
rbd_aio_read():imageid, sector 偏移, 读取的sector个数,buf
rados_read():集群id,对象id,对象哪一部分(off/len)
librados::IoCtxImpl::operate_read():多个对象读封装成一个操作oprequest
Objecter::send_op(): oprequest封装成一个消息MOSDOp
Client_messenger收到消息MOSDOp,分发
SimpleMessenger::send_message
OSD::ms_dispatch 处理消息,变成oprequest
():coll_t cid, 对象id, offest/len
pread() 系统调用
5
读写pipeline
Pipe::reader
Pipe::read_message
in_q->enqueue
DispatchThread
()
osd->
DispatchQueue::mqueue
Osd->op_wq
OSD::op_tp WorkThread
osd->op_wq->_dequeue()
journal->submit_entry
In submit_entry,also create callback context
6
读写pipeline(续1)
()
write_aio_bl()->
check_aio_completion()
写到了journal层
Journal::finisher->queue
Journal::
Pickup context item
Journal::
Context callback C_JournaledAhead
7
读写pipeline(续2)
ThreadPool::worker
Context callback ()
::op_wq
通知客户端写成功
Context callback ()
通知集群数据可读
8
Rados客户端读对象流程
rados_read
()
librados::IoCtxImpl::read
()
librados::IoCtxImpl::operate_read
()
Objecter::op_submit
()
Objecter::_op_submit
()
Objecter::recalc_op_target
()
Objecter::send_op
()
SimpleMessenger::send_message
()
9
OSD端读消息分发流程
10