Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

上层执行节点删除后,其父节点中指向该节点的指针被清除,意味着该子树的存储空间不会再被访问,成为文件内碎片。

3.5. 文件地址预分配

文件地址管理包括地址预分配

...

设计一个文件整理线程,定期地将MTreeFile整理为查询友好的格式。

文件整理线程的任务:

  1. 清空文件内部碎片,提高磁盘利用率
  2. 对MNode顺序进行重新排列,支持后续的功能开发,例如:
    1. 一个MNode的子节点按name字典序排列,支持按name过滤的范围查询,如查找device编号在device1-device20之间的device节点
    2. 后期引入统计信息,识别热点序列/MNode,将经常查询的一条路径上的MNode尽量存储在同一个磁盘块或相近的磁盘块

文件整理线程的触发时机:

  1. 如果仅为了处理文件碎片,可以根据delete的操作次数或delete的子树节点数量/size进行统计和触发
  2. 后期为了优化查询,可以设计定时整理


3.

...

5. 两阶段提交

MTree文件为随机读写文件,为了保证文件的可用性和完整性,避免宕机时脏数据破坏文件,参照Mysql设计两阶段写功能。

创建tmp文件,作为磁盘buffer,记录目标地址和写入数据。


3.

...

5.1. 磁盘buffer的格式设计

逻辑上一个磁盘buffer应具备如下三个状态:

  1. 未被使用:此时的重启恢复无需处理磁盘buffer,也证明文件处于完整可用的状态
  2. 正在准备数据:此时重启恢复需要清空磁盘buffer,新数据仍未写入文件,抛弃该次写入操作
  3. 完成数据准备,正在执行数据迁移:此时重启恢复需要重做数据迁移,直接覆盖目标地址空间

...

  1. 标记位,是否已正在被使用
  2. 标记位,是否已完成buffer数据的准备
  3. 目标地址
  4. 待刷盘数据,以链表为粒度一次性准备好


3.

...

5.2. 写入流程

  1. 将目标地址刷入磁盘buffer,并将其设置为正在使用且未完成数据准备状态
  2. 将所有已修改的MNode的数据写入磁盘buffer
  3. 将磁盘buffer更新为正在使用且数据准备完成状态
  4. 将磁盘buffer的数据写入MNode在MTreeFile的指定位置(覆盖原有数据)
  5. 将磁盘buffer更新为未使用状态


3.

...

5.3. 重启恢复

单个MTreeFile重启时检查磁盘buffer状态

...