MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
B+树日志记录辅助类,同时可以利用此类做回滚操作 更多...
#include <bplus_tree_log.h>
Public 成员函数 | |
BplusTreeLogger (LogHandler &log_handler, int32_t buffer_pool_id) | |
构造函数 更多... | |
RC | init_header_page (Frame *frame, const IndexFileHeader &header) |
初始化B+树文件头页 更多... | |
RC | update_root_page (Frame *frame, PageNum root_page_num, PageNum old_page_num) |
更新B+树文件头页,也就是指向根页的页面编号 更多... | |
RC | node_insert_items (IndexNodeHandler &node_handler, int index, span< const char > items, int item_num) |
在某个页面中插入一些元素 更多... | |
RC | node_remove_items (IndexNodeHandler &node_handler, int index, span< const char > items, int item_num) |
在某个页面中删除一些元素 更多... | |
RC | leaf_init_empty (IndexNodeHandler &node_handler) |
初始化一个空的叶子节点 | |
RC | leaf_set_next_page (IndexNodeHandler &node_handler, PageNum page_num, PageNum old_page_num) |
修改叶子节点的下一个兄弟节点编号 | |
RC | internal_init_empty (IndexNodeHandler &node_handler) |
初始化一个空的内部节点 | |
RC | internal_create_new_root (IndexNodeHandler &node_handler, PageNum first_page_num, span< const char > key, PageNum page_num) |
创建一个新的根节点 | |
RC | internal_update_key (IndexNodeHandler &node_handler, int index, span< const char > key, span< const char > old_key) |
更新某个内部页面上,更新指定位置的键值 | |
RC | set_parent_page (IndexNodeHandler &node_handler, PageNum page_num, PageNum old_page_num) |
修改某个页面的父节点编号 | |
RC | commit () |
提交。表示整个操作成功 | |
RC | rollback (BplusTreeMiniTransaction &mtr, BplusTreeHandler &tree_handler) |
回滚。操作执行一半失败了,把所有操作都回滚回来 | |
静态 Public 成员函数 | |
static RC | redo (BufferPoolManager &bpm, const LogEntry &entry) |
重做日志。通常在系统启动时,会把所有日志重做一遍 | |
static string | log_entry_to_string (const LogEntry &entry) |
日志记录转字符串 | |
Protected 成员函数 | |
RC | append_log_entry (unique_ptr< bplus_tree::LogEntryHandler > entry) |
Private 成员函数 | |
RC | __redo (LSN lsn, BplusTreeMiniTransaction &mtr, BplusTreeHandler &tree_handler, common::Deserializer &redo_buffer) |
Private 属性 | |
LogHandler & | log_handler_ |
int32_t | buffer_pool_id_ = -1 |
vector< unique_ptr< bplus_tree::LogEntryHandler > > | entries_ |
关联的缓冲池ID | |
bool | need_log_ = true |
当前记录了的日志 | |
B+树日志记录辅助类,同时可以利用此类做回滚操作
封装B+树持久化需要的各种日志,并负责落地。 如果一个操作中途失败,可以使用rollback进行回滚。
一个B+树的操作,比如插入或删除一个节点,可能由于页面满了而需要分裂,或者由于页面太空了而需要合并,进而 产生很多个日志记录。我们把这些日志记录都放在一个事务中,并生成一个系统中的“大”日志,使这一系列操作要么 都成功,或者一起回滚。 同时,B+树在实际执行中,边执行一些动作修改内存中的数据,边记录日志也记录在内存中。当所有操作执行完成后, 将日志一次性的写入到日志文件中。同时能够保证,修改过的脏页在刷新到磁盘之前,日志已经写入到日志文件中。
在日志回滚或者重做的过程中,其实不需要再记录新的日志,但是调用的B+树本身的接口都是同一个,并没有编写特殊的 类似redo_xxx函数,因此需要这个类本身做判断,是否需要记录日志。
BplusTreeLogger::BplusTreeLogger | ( | LogHandler & | log_handler, |
int32_t | buffer_pool_id | ||
) |
构造函数
log_handler | 日志处理器。实际上就会调用此对象进行日志记录 |
buffer_pool_id | 关联的缓冲池ID。一个B+树仅记录在一个文件中。 |
RC BplusTreeLogger::init_header_page | ( | Frame * | frame, |
const IndexFileHeader & | header | ||
) |
初始化B+树文件头页
头页中包含了一些B+树的元信息
RC BplusTreeLogger::node_insert_items | ( | IndexNodeHandler & | node_handler, |
int | index, | ||
span< const char > | items, | ||
int | item_num | ||
) |
在某个页面中插入一些元素
node_handler | 页面处理器。同时也包含了页面编号、页帧 |
index | 插入的位置 |
items | 插入的元素 |
item_num | 元素个数 |
RC BplusTreeLogger::node_remove_items | ( | IndexNodeHandler & | node_handler, |
int | index, | ||
span< const char > | items, | ||
int | item_num | ||
) |
在某个页面中删除一些元素
node_handler | 页面处理器。同时也包含了页面编号、页帧 |
index | 插入的位置 |
items | 插入的元素 |
item_num | 元素个数 |
会在内存中记录一些数据帮助回滚操作
RC BplusTreeLogger::update_root_page | ( | Frame * | frame, |
PageNum | root_page_num, | ||
PageNum | old_page_num | ||
) |
更新B+树文件头页,也就是指向根页的页面编号
root_page_num | 更新后的根页编号 |
old_page_num | 更新前的根页编号。用于回滚 |