CMU15445-2020fall 笔记:Project 2 - B+TREE 2

CMU15445-2020 fall 笔记:Project 2 - B+ TREE 2

CheckPoint2

checkpoint2 需要修改如下文件

img

Deletion

delete 算法如下图所示:

img

delete 操作的重点是当删除一个 entry 后,导致节点不能维持 B+ 树定义中的最小元素个数,需要进行合并和重新分配。代码如下图所示:

img

对于实现 CoalesceOrRedistribute 方法:

  1. 如果当前节点中的元素个数,与兄弟节点的元素个数和 < 节点中的最大元素数,就可以进行合并,同时递归修改其父节点,删除合并后剩余的节点。
  2. 如果当前节点中的元素个数,与兄弟节点的元素个数和 > 节点中的最大元素数,需要将当前节点和兄弟节点中的元素进行重新分配。

Index Iterator

修改 index_iterator.h / index_iteroator.cpp 文件

为了高效的遍历所有的叶节点,仿照 C++ 中的迭代器实现如下接口:

成员变量 leaf 叶节点指针
成员变量 index 叶节点中元素的下标

  1. isEnd() 判断 leaf 是否为空 和 index 是否是最后一个元素
  2. operator*() 通过 leaf->GetItem(index) 获得叶节点的对应元素
  3. operator++() 需要注意,如果 index 已经大于等于当前叶节点中元素个数,需要获取下一个叶节点的 page_id 并读入到内存中,同时要 unpin 当前 leaf 所在的 page, 如果下一个叶节点的 page_id 为 invalid,就将 leaf 指针和 index 值设为无效值
  4. operator==() / operator!=() 判断 leaf 和 index 的值是否同时相同

Concurrent Index

使用 crabbing protocol 算法来保证对 B+ Tree 的并发访问

  1. 获得父节点的 latch
  2. 获得孩子的 latch
  3. 判断是否安全(是否会造成 split 或者 merge 操作),来决定是否释放父节点的 latch

Find

  1. 获得孩子节点上 R latch
  2. 释放父节点的 latch

Insert / Delete

  1. 获得需要的 W latch
  2. 当 child 被 latch,检查对它操作是否是安全的
  3. 如果 child 是安全的,就释放这个 child 节点 ancestors 上的所有 latch

posted on 2024-03-25 14:33  LambdaQ  阅读(11)  评论(0编辑  收藏  举报