ceph源码分析之读写操作流程(2).doc

ceph源码分析之读写操作流程(2).doc

ID:51082571

大小:29.50 KB

页数:7页

时间:2020-03-18

ceph源码分析之读写操作流程(2).doc_第1页
ceph源码分析之读写操作流程(2).doc_第2页
ceph源码分析之读写操作流程(2).doc_第3页
ceph源码分析之读写操作流程(2).doc_第4页
ceph源码分析之读写操作流程(2).doc_第5页
资源描述:

《ceph源码分析之读写操作流程(2).doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、ceph源码分析之读写操作流程(2)上一篇介绍了ceph存储在上两层的消息逻辑,这一篇主要介绍一下读写操作在底两层的流程。下图是上一篇消息流程的一个总结。上在ceph中,读写操作由于分布式存储的原因,故走了不同流程。对于读操作而言:1.客户端直接计算出存储数据所属于的主osd,直接给主osd上发送消息。2.主osd收到消息后,可以调用Filestore直接读取处在底层文件系统中的主pg里面的内容然后返回给客户端。具体调用函数在ReplicatedPG::do_osd_ops中实现。读操作代码流程如图:如我们之前说的,当确定读操作为主osd的消息时(CEPH_MSG

2、_OSD_OP类型),会调用到ReplicatePG::do_osd_op函数,该函数对类型做进一步判断,当发现为读类型(CEPH_OSD_OP_READ)时,会调用FileStore中的函数对磁盘上数据进行读。[cpp]viewplaincopyintReplicatedPG::do_osd_ops(OpContext*ctx,vector<OSDOp>&ops){……switch(op.op){……caseCEPH_OSD_OP_READ:++ctx->num_read;{//readintoabufferbufferlistbl;i

3、ntr=osd->store->read(coll,soid,op.extent.offset,op.extent.length,bl);//调用FileStore::read从底层文件系统读取……}caseCEPH_OSD_OP_WRITE:++ctx->num_write;{……//写操作只是做准备工作,并不实际的写}……}}FileStore::read函数是底层具体的实现,会通过调用系统函数如::open,::pread,::close等函数来完成具体的操作。[cpp]viewplaincopyintFileStore::read(col

4、l_tcid,constghobject_t&oid,uint64_toffset,size_tlen,bufferlist&bl,boolallow_eio){……intr=lfn_open(cid,oid,false,&fd);……got=safe_pread(**fd,bptr.c_str(),len,offset);//FileStore::safe_pread中调用了::pread……lfn_close(fd);……}而对于写操作而言,由于要保证数据写入的同步性就会复杂很多:1.首先客户端会将数据发送给主osd,2.主osd同样要

5、先进行写操作预处理,完成后它要发送写消息给其他的从osd,让他们对副本pg进行更改,3.从osd通过FileJournal完成写操作到Journal中后发送消息告诉主osd说完成,进入54.当主osd收到所有的从osd完成写操作的消息后,会通过FileJournal完成自身的写操作到Journal中。完成后会通知客户端,已经完成了写操作。5.主osd,从osd的线程开始工作调用Filestore将Journal中的数据写入到底层文件系统中。在介绍写操作的流程前,需要先介绍一下ceph中的callback函数。Context类定义在src/include文件中,该类

6、是一个回调函数类的抽象类,继承它的类只要在子类实现它的finish函数,在finish函数调用自己需要回调的函数,就可以完成回调。[cpp]viewplaincopyclassContext{Context(constContext&other);constContext&operator=(constContext&other);protected:virtualvoidfinish(intr)=0;public:Context(){}virtual~Context(){}//wewantavirtualdestructor!!!virt

7、ualvoidcomplete(intr){finish(r);deletethis;}};Finisher类是在src/common中定义的一个专门查看操作是否结束的一个类。在这个类里面拥有一个线程finisher_thread和一个类型为Context指针的队列finisher_queue。当一个操作线程完成自己的操作后,会将Context类型对象送入队列。此时finisher_thread线程循环监视着自己的finisher_queue队列,当发现了有新进入的Context时,会调用这个Context::complete函数,这个函数则会调用到Context

8、子类自己实

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。