OSD原理分析-FileStore模块
OSD模块在tp_osd_tp线程上下文的最后阶段,通过queue_transactions调用FileStore模块功能将操作请求以日志的方式提交到日志队列中,至此tp_osd_tp线程中的工作就完成了。后续由一个独立的日志写入线程journal_write从日志队列中取出操作日志并调用文件系统写入接口将日志操作写入实际的日志文件中(注,这里我们以journal ahead模式为例进行说明);日志写入完成后,通过queue_completions_thru接口将日志完成回调任务放入fn_jrn_objstorep线程的完成队列中。fn_jrn_objstore线程从完成队列中取出回调任务并立即调用回调,回调任务中会执行两个并发的子任务:一方面是通过op_queue将操作递交给OpWQ进行实际的数据落盘动作;另一方面是把OSD模块传入的回调任务放入fn_odsk_fstore线程池中进行处理。OpWQ队列对应tp_fstore_op线程,它会从队列中取出操作请求,并执行实际的数据落盘动作,落盘完成后再把落盘回调任务放入到fn_appl_fstore队列中进行回调处理。fn_odsk_fstore在处理OSD模块的回调任务时,会把OSD复本操作减一(因为写入日志后就认为本地写入操作完成了),如果远端OSD复本也完成了,那就会对客户端返回操作结果。此外,还有一个fileStore_sync线程负责日志空间的回收,便于重复使用日志文件。
FileStore模块中类的概览
下面我们来看看FileStore模块中涉及的主要类及其关系:
![](https://rootw.github.io/images/posts/ceph/rbd_osd_fs_class.jpg)
- JournalingObjectStore是FileStore的父类,继承自抽象父类ObjectStore。JournalingObjectStore包含一个Journal对象和一个Finisher对象,分别代表日志操作对象和日志操作完成后的回调对象。
- FileJournal继承了Journal类,以文件的方式实现了日志的主要操作功能。内部有一个专门的journal_write线程负责日志的落盘操作。
- FileStore是核心类,继承自JournalingObjectStore。OpWQ队列用来存放数据落盘请求,op_tp线程池会从该队列中取出请求执行落盘动作。sync_thread线程负责数据同步与日志空间回收。ondisk_finishers用来处理日志落盘后的回调;apply_finishers用来处理数据落盘后的回调。