MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
Public 成员函数 | 静态 Public 成员函数 | Protected 成员函数 | Private 成员函数 | Private 属性 | 所有成员列表
BplusTreeLogger类 参考final

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 属性

LogHandlerlog_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::BplusTreeLogger ( LogHandler log_handler,
int32_t  buffer_pool_id 
)

构造函数

参数
log_handler日志处理器。实际上就会调用此对象进行日志记录
buffer_pool_id关联的缓冲池ID。一个B+树仅记录在一个文件中。

成员函数说明

◆ init_header_page()

RC BplusTreeLogger::init_header_page ( Frame frame,
const IndexFileHeader header 
)

初始化B+树文件头页

头页中包含了一些B+树的元信息

◆ node_insert_items()

RC BplusTreeLogger::node_insert_items ( IndexNodeHandler node_handler,
int  index,
span< const char >  items,
int  item_num 
)

在某个页面中插入一些元素

参数
node_handler页面处理器。同时也包含了页面编号、页帧
index插入的位置
items插入的元素
item_num元素个数

◆ node_remove_items()

RC BplusTreeLogger::node_remove_items ( IndexNodeHandler node_handler,
int  index,
span< const char >  items,
int  item_num 
)

在某个页面中删除一些元素

参数
node_handler页面处理器。同时也包含了页面编号、页帧
index插入的位置
items插入的元素
item_num元素个数

会在内存中记录一些数据帮助回滚操作

◆ update_root_page()

RC BplusTreeLogger::update_root_page ( Frame frame,
PageNum  root_page_num,
PageNum  old_page_num 
)

更新B+树文件头页,也就是指向根页的页面编号

参数
root_page_num更新后的根页编号
old_page_num更新前的根页编号。用于回滚

该类的文档由以下文件生成: