前言
BlueStore直接管理裸设备,需要自行管理空间的分配和释放。Stupid和Bitmap分配器的结果是保存在内存中的,分配结果的持久化是通过FreelistManager来做的。
一个block的状态可以为占用和空闲两种状态,持久化时只需要记录一种状态即可,便可以推导出另一种状态,BlueStore记录的是空闲block。主要有两个原因:一是回收空间的时候,方便空闲空间的合并;二是已分配的空间在Object中已有记录。
FreelistManager最开始有extent和bitmap两种实现,现在默认为bitmap实现,extent的实现已经废弃。空闲空间持久化到磁盘也是通过RocksDB的Batch写入的。FreelistManager将block按一定数量组成段,每个段对应一个k/v键值对,key为第一个block在磁盘物理地址空间的offset,value为段内每个block的状态,即由0/1组成的位图,1为空闲,0为使用,这样可以通过与1进行异或运算,将分配和回收空间两种操作统一起来。
目录
通用接口
FreelistManager最主要的接口就是allocator和release。
virtual void allocate(
uint64_t offset, uint64_t length,
KeyValueDB::Transaction txn) = 0;
virtual void release(
uint64_t offset, uint64_t length,
KeyValueDB::Transaction txn) = 0;

本文深入分析了BlueStore的FreelistManager,它管理裸设备的空间分配和释放,采用位图数据结构记录空闲block。讨论了初始化、Merge、Allocate和Release等关键操作,以及如何通过RocksDB的Batch实现操作的原子性。
最低0.47元/天 解锁文章
444

被折叠的 条评论
为什么被折叠?



