librbd目录中目前有4个文件夹:
- exclusive_lock,这个目录里主要是将之前的exclusive lock 处理逻辑迁移到async state machines模式
- image,这个目录主要是将image refresh的处理逻辑迁移到 async state machines模式
- object_map,(consolidate object map invalidation to new state machine)
- operation, 这个目录里实现了关于image的主要操作,包括flatten、resize、trim、snapshot create、snapshot remove、snapshot protect、snapshot unprotect、snapshot rename、snapshot rollback
和一些零散的文件,目前先整理出和I/O相关的文件,后期再补充其他的文件说明:
- librbd.cc,这个文件里并没有具体实现所有的接口,而其实大部分接口的具体实现是在internal.cc,除了I/O相关的接口,read/write。
- ImageCtx.h和ImageCtx.cc,定义了image的上下文,包括image layout的初始化、卷/snap相关元数据的获取接口以及后来引入的rbd mirror的相关元数据结构(object map、journal 等)的创建。
- AioImageRequestWQ.h/AioImageRequestWQ.cc、AioImageRequest.h/AioImageRequest.cc,实现了aio相关的I/O接口,进入rbd的read请求会转变成一个AioImageRead的实例,而write请求会变成一个AioImageWrite的对象。而这些对象最终会分别调到AioImageRead.send_request()和AbstractAioImageWrite::send_request()这两个函数,来处理IO请求(其中主路径中关于journal的部分可以先略过去)。下图是这个类的继承关系。

- AioObjectRequest.h/AioObjectRequest.cc,I/O请求会通过Striper::file_to_extents()被影射成针对某个/某些对象的操作,这些操作都被定义/实现在这两个文件中
- AioCompletion.h/AioCompletion.cc,这两个文件实现了Aio的回调处理逻辑。上层应用可以通过rbd_aio_create_completion()创建一个AioCompletion的对象,并传入自己的回调函数。这样当具体操作结束之后,AioCompletion对象会调用上层应用的回调函数
- LibrbdWriteback.h/LibrbdWriteback.cc,这两个文件主要是通过现有的ObjectCacher机制,在librbd中支持Writeback这种I/O方式
- ImageWatcher.h/ImageWatcher.cc,这是后来引入的watch/notify机制,用于增加了管理image exlusive lock的支持
- Async*.cc/Async*.h,这类文件之后再分析
- Journal*,这些文件主要实现rbd mirror的功能,后续分析
- CopyupRequest.h/CopyupRequest.cc,这个主要用于处理clone卷的逻辑,后续分析
本文档详细解读librbd代码目录,重点关注exclusive_lock、image、object_map和operation四个主要目录,以及librbd.cc、ImageCtx.h/ccc、Aio*、AioCompletion.h/ccc等关键文件。内容涉及async state machines模式的应用,image操作如refresh、flatten、resize等,I/O接口实现,以及journal、mirror和watch/notify机制。
1万+

被折叠的 条评论
为什么被折叠?



