bluestore
直接管理裸设备,实现在用户态下使用linux aio直接对裸设备进行I/O操作
写IO流程:
一个I/O在bluestore里经历了多个线程和队列才最终完成,对于非WAL的写,比如对齐写、写到新的blob里等,I/O先写到块设备上,然后元数据提交到rocksdb并sync了,才返回客户端写完成(在STATE_KV_QUEUED状态的处理);对于WAL(即覆盖写),没有先把数据写块设备,而是将数据和元数据作为wal一起提交到rocksdb并sync后,这样就可以返回客户端写成功了,然后在后面的动作就是将wal里的数据再写到块设备的过程,对这个object的读请求要等到把数据写到块设备完成整个wal写I/O的流程后才行,代码里对应的是_do_read里先o->flush()的操作,所以bluestore里的wal就类似filestore里的journal的作用
bluestore 元数据
Bluestore的 所有的元数据都以KV对的形式写入RocksDB中,主要有以下的元数据:
// 保存BlueStore的超级块信息,在KV中, 以PREFIX_SUPER为Key的前缀
const string PREFIX_SUPER = “S”; // field -> value
// 保存Collection的元数据信息bluestore_cnode_t
const string PREFIX_COLL = “C”; // collection na