BlueStore源码分析之事物状态机
前言 BlueStore可以理解为一个支持ACID的本地日志型文件系统。所有的读写都是以 Transaction 进行,又因为支持覆盖写,所以写流程设计的相对复杂一些,涉及到一系列的状态转换。我们着重分析一下状态机、延迟指标以及如何保证IO的顺序性和并发性。 目录 状态机 延迟分析 IO保序 线程队列 IO状态 最后YY 状态机 queue_transactions queue_transactions 是ObjectStore层的统一入口,KVStore、MemStore、FileStore、BlueStore都相应的实现了这个接口。 state_t state 变量记录了当前时刻事物处于哪个状态。在创建TransactionContext的时候会将 state 初始化为 STATE_PREPARE ,然后在 _txc_add_transaction 中会根据操作码类型(opcode)进行不同的处理。同时会获取PG对应的OpSequencer(每个PG有一个OpSequencer)用来保证PG上的IO串行执行,对于deferred-write会将其数据写入RocksDB(WAL)。 以下阶段就进入BlueStore状态机了,我们以写流程为导向分析状态机的每个状态。 STATE_PREPARE 从state_prepare开始已经进入事物的状态机了。这个阶段会调用 _txc_add