OSD Message示例分析
1 | osd_op(client.4813.0:510 default.4161.780__shadow__99999.txt_0 [write 2097152~524288] 5.ba5249f6 ack+ondisk+write+known_if_redirected e130) v4 |
OSD Message处理流程
Message在Primary OSD的处理流程
1 | bool OSD::dispatch_op_fast(OpRequestRef& op, OSDMapRef& osdmap) |
异步journal写数据
1 | FileJournal.Writer.entry() -> FileJournal::write_thread_entry() -> FileJournal::do_write() -> FileJournal::write_bl() |
Message在Replica OSD的处理流程
1 | bool OSD::dispatch_op_fast(OpRequestRef& op, OSDMapRef& osdmap) |
回调函数
在把transaction加入队列前,会初始化transaction的几个operation回调函数:
1 | class ObjectStore: |
Primary OSD
1 | — 发往replica的operation,处理replica reply是否全部返回 |
Replica OSD
1 | — 发送到本OSD的operation,处理写本OSD的reply是否返回 |
Finisher类
Finisher类是在src/common中定义的一个专门查看操作是否结束的一个类。
在这个类里面拥有一个线程finisher_thread
和一个类型为Context指针的队列finisher_queue
。当一个操作线程完成自己的操作后,会将Context类型对象送入队列。此时finisher_thread
线程循环监视着自己的finisher_queue
队列,当发现了有新进入的Context时,会调用这个Context::complete
函数,这个函数则会调用到Context子类自己实现的finish函数,来处理操作完成后的后续工作。
1 | class Finisher { |
IO相关finisher
跟IO相关的finisher有三个,journal有一个,filestore有两个:
1 | class JournalingObjectStore : public ObjectStore { |
写数据到FileStore和IO回调
Primary OSD
1 | int FileStore::queue_transactions(Sequencer *posr, list<Transaction*> &tls, |
在journal commit后会通过JournalingObjectStore
类的 finisher 来通知调用到C_JournaledAhead.finish()
函数。
在_journal_ahead
函数里会把op添加到filestore的写队列里和FileStore类的ondisk_finisher
队列里。
1 | void FileStore::_journaled_ahead(OpSequencer *osr, Op *o, Context *ondisk) |
FileStore workqueue处理过程:
1 | FileStore.OpWQ._process {store->_do_op(osr, handle);} |
C_OSD_OnOpCommit.finish()
函数调用到:
1 | void ReplicatedBackend::op_commit(InProgressOp *op) |
Replica OSD
从OSD写请求返回后处理流程:
1 | void ReplicatedBackend::sub_op_modify_reply(OpRequestRef op) |
C_OSD_RepOpCommit.finish()函数调用到:
1 | void ReplicatedPG::repop_all_committed(RepGather *repop) |
sync数据到disk
filestore数据sync到disk(调底层fs的sync接口):
1 | class FileStore : public JournalingObjectStore, |
在FileStore::mount
方法中,会创建sync线程sync_thread.create()
, 该线程的入口函数为:
1 | void FileStore::sync_entry() |
主要通过sync函数,将FileStore打开的文件进行数据的flush磁盘操作。
1 | int GenericFileStoreBackend::syncfs() |
commit_finish会把commit_waiters加入finisher队列,由finisher函数通知commit完成:
1 | void JournalingObjectStore::ApplyManager::commit_finish() |
何时唤醒sync线程:
1 | — sync_cond.Signal(); |
FileJournal的do_sync_cond
也指向FileStore的sync_cond:
1 | int FileStore::open_journal() |