THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
- 序列化:按照MNode在文件中的字段存储顺序,将所有属性信息序列化为一个ByteBuffer。
- 二进制数据分割与写入:将1中得到的ByteBuffer,根据文件Node的data body长度进行分割,分割过程中给每一个Extension Node分配空闲空间,数据分割与地址分配完成后,进行数据写入
两阶段提交
MTree文件为随机读写文件,为了保证文件的可用性和完整性,避免宕机时脏数据破坏文件,参照Mysql设计两阶段写功能。
创建tmp文件,作为磁盘buffer,记录目标地址和写入数据。
具体写入流程如下:
- 将目标地址刷入磁盘buffer,并将其设置为正在使用且未完成数据准备状态
- 将所有已修改的MNode的数据写入磁盘buffer
- 将磁盘buffer更新为正在使用且数据准备完成状态
- 将磁盘buffer的数据写入MNode在MTreeFile的指定位置(覆盖原有数据)
- 将磁盘buffer更新为未使用状态
磁盘buffer的格式设计
- 标记位,是否已正在被使用
- 标记位,是否已完成buffer数据的准备
- 目标地址
- 待刷盘数据,以链表为粒度一次性准备好
3.3. Node跨页读写
针对链表型的二进制数据,设计合理的数据结构,数据从磁盘读进内存时直接读入该数据结构并自动实现切割。
...
每一个MNode在MTree上创建时,地址预分配保证了后期刷盘的父节点地址与子节点地址信息完整性。
3.6. 两阶段提交
MTree文件为随机读写文件,为了保证文件的可用性和完整性,避免宕机时脏数据破坏文件,参照Mysql设计两阶段写功能。
创建tmp文件,作为磁盘buffer,记录目标地址和写入数据。
3.6.1. 磁盘buffer的格式设计
- 标记位,是否已正在被使用
- 标记位,是否已完成buffer数据的准备
- 目标地址
- 待刷盘数据,以链表为粒度一次性准备好
3.6.2. 写入流程
- 将目标地址刷入磁盘buffer,并将其设置为正在使用且未完成数据准备状态
- 将所有已修改的MNode的数据写入磁盘buffer
- 将磁盘buffer更新为正在使用且数据准备完成状态
- 将磁盘buffer的数据写入MNode在MTreeFile的指定位置(覆盖原有数据)
- 将磁盘buffer更新为未使用状态