ceph的刀和剑Ceph学习之路

BlueStore的状态机

2018-08-07  本文已影响0人  老老老老老徐

通过queue_transaction将IO送入BlueStore,之后bluestore通过状态机的方式控制整个IO流程。
关键代码在BlueStore::_txc_state_proc()函数中。

STATE_PREPARE

thread: AioCompletionThread::_aio_thread()
queue:  aio_queue

确认该txc是否还有io需要提交到aio_thread,如果有,就调用_txc_aio_submit()提交到aio_queue中。
无论是否有需要提交的io,状态都会进入到STATE_AIO_WAIT。
回调函数aio_finish()在状态io完成后,会调用主流程函数,使流程继续执行。

STATE_AIO_WAIT

确认该io是否有前项依赖的io。如果有,返回,如果没有,进入下一个流程。
该操作可确保io的顺序性,不使io产生乱序。

STATE_IO_DONE

thread: KVSyncThread::_kv_sync_thread(), KVFinalizeThread::_kv_finalize_thread()
queue:  kv_queue, kv_queue_unsubmitted, kv_committing_to_finalize

bluestore_sync_submit_transaction控制kv信息是否同步提交到kvdb中。
非同步提交,则状态变更为STATE_KV_QUEUED,同步提交,则变更会STATE_KV_SUBMITTED。

最终kv_sync_thread线程都会将txc放入到kv_committing_to_finalize中。

kv_finalize_thread从kv_committing_to_finalize获取txc,并使流程向下进行。
在这一过程中,wal也会被一起提交到kvdb中。

STATE_KV_SUBMITTED

thread: Finisher::FinisherThread::finisher_thread_entry()
queue:  Finisher::finisher_queue

finisher的线程数,依据参数bluestore_shard_finishers, osd_op_num_shards, osd_op_num_shards_hdd,
osd_op_num_shards_ssd来控制。默认情况下,线程数为1。

将oncommits放入队列后,状态即变更为STATE_KV_DONE,流程不做停留,直接向下。

STATE_KV_DONE

thread: KVSyncThread::_kv_sync_thread(), KVFinalizeThread::_kv_finalize_thread()
queue:  deferred_queue, deferred_done_queue, deferred_stable_queue, deferred_stable_to_finalize

在构造txc时,会判断是否有deferred_txn,如果有,则说明需要写日志,没有,则直接到下一个状态。
deferred_txn存放着预写日志相关的数据。日志写入完成后,到此,所有的数据写入都完成。
txc存放到deferred_queue以作记录,同时存放到txc->osr->deferred_pending(DeferredBatch)
deferred_pending最后将通过aio或者同步方式写入到设备中。
aio回应后,调用DeferredBatch回调函数_deferred_aio_finish(),将deferred_pending中的deferred_txn
转存到deferred_done_queue中,经过kv_sync_thread,kv_finalize_thread数据从deferred_queue
-> deferred_done_queue -> deferred_stable_to_finalize。
最终txc变更为STATE_DEFERRED_CLEANUP,通过两个线程进入到下一个状态。

STATE_DEFERRED_CLEANUP

一个短暂的状态,没有额外的操作,只是用于确认日志写入花费的时间。
到达该状态,流程即转到下一个状态。

STATE_FINISHING

最后阶段。流程确认写入到设备中的操作完成,将修改在SharedBlob,释放不需要的内存数据。

上一篇下一篇

猜你喜欢

热点阅读