CMU15445-2020fall 笔记:Project 2 - B+TREE 2
CMU15445-2020 fall 笔记:Project 2 - B+ TREE 2
CheckPoint2
checkpoint2 需要修改如下文件
Deletion
delete 算法如下图所示:
delete 操作的重点是当删除一个 entry 后,导致节点不能维持 B+ 树定义中的最小元素个数,需要进行合并和重新分配。代码如下图所示:
对于实现 CoalesceOrRedistribute 方法:
- 如果当前节点中的元素个数,与兄弟节点的元素个数和 < 节点中的最大元素数,就可以进行合并,同时递归修改其父节点,删除合并后剩余的节点。
- 如果当前节点中的元素个数,与兄弟节点的元素个数和 > 节点中的最大元素数,需要将当前节点和兄弟节点中的元素进行重新分配。
Index Iterator
修改 index_iterator.h / index_iteroator.cpp 文件
为了高效的遍历所有的叶节点,仿照 C++ 中的迭代器实现如下接口:
成员变量 leaf 叶节点指针
成员变量 index 叶节点中元素的下标
- isEnd() 判断 leaf 是否为空 和 index 是否是最后一个元素
- operator*() 通过 leaf->GetItem(index) 获得叶节点的对应元素
- operator++() 需要注意,如果 index 已经大于等于当前叶节点中元素个数,需要获取下一个叶节点的 page_id 并读入到内存中,同时要 unpin 当前 leaf 所在的 page, 如果下一个叶节点的 page_id 为 invalid,就将 leaf 指针和 index 值设为无效值
- operator==() / operator!=() 判断 leaf 和 index 的值是否同时相同
Concurrent Index
使用 crabbing protocol 算法来保证对 B+ Tree 的并发访问
- 获得父节点的 latch
- 获得孩子的 latch
- 判断是否安全(是否会造成 split 或者 merge 操作),来决定是否释放父节点的 latch
Find
- 获得孩子节点上 R latch
- 释放父节点的 latch
Insert / Delete
- 获得需要的 W latch
- 当 child 被 latch,检查对它操作是否是安全的
- 如果 child 是安全的,就释放这个 child 节点 ancestors 上的所有 latch