THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
上层执行节点删除后,其父节点中指向该节点的指针被清除,意味着该子树的存储空间不会再被访问,成为文件内碎片。
3.5. 文件地址预分配
文件地址管理包括地址预分配
...
设计一个文件整理线程,定期地将MTreeFile整理为查询友好的格式。
文件整理线程的任务:
- 清空文件内部碎片,提高磁盘利用率
- 对MNode顺序进行重新排列,支持后续的功能开发,例如:
- 一个MNode的子节点按name字典序排列,支持按name过滤的范围查询,如查找device编号在device1-device20之间的device节点
- 后期引入统计信息,识别热点序列/MNode,将经常查询的一条路径上的MNode尽量存储在同一个磁盘块或相近的磁盘块
文件整理线程的触发时机:
- 如果仅为了处理文件碎片,可以根据delete的操作次数或delete的子树节点数量/size进行统计和触发
- 后期为了优化查询,可以设计定时整理
3.
...
5. 两阶段提交
MTree文件为随机读写文件,为了保证文件的可用性和完整性,避免宕机时脏数据破坏文件,参照Mysql设计两阶段写功能。
创建tmp文件,作为磁盘buffer,记录目标地址和写入数据。
3.
...
5.1. 磁盘buffer的格式设计
逻辑上一个磁盘buffer应具备如下三个状态:
- 未被使用:此时的重启恢复无需处理磁盘buffer,也证明文件处于完整可用的状态
- 正在准备数据:此时重启恢复需要清空磁盘buffer,新数据仍未写入文件,抛弃该次写入操作
- 完成数据准备,正在执行数据迁移:此时重启恢复需要重做数据迁移,直接覆盖目标地址空间
...
- 标记位,是否已正在被使用
- 标记位,是否已完成buffer数据的准备
- 目标地址
- 待刷盘数据,以链表为粒度一次性准备好
3.
...
5.2. 写入流程
- 将目标地址刷入磁盘buffer,并将其设置为正在使用且未完成数据准备状态
- 将所有已修改的MNode的数据写入磁盘buffer
- 将磁盘buffer更新为正在使用且数据准备完成状态
- 将磁盘buffer的数据写入MNode在MTreeFile的指定位置(覆盖原有数据)
- 将磁盘buffer更新为未使用状态
3.
...
5.3. 重启恢复
单个MTreeFile重启时检查磁盘buffer状态
...