MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
页面二次缓冲区,为了解决页面原子写入的问题 更多...
#include <double_write_buffer.h>
Public 成员函数 | |
DiskDoubleWriteBuffer (BufferPoolManager &bp_manager, int max_pages=16) | |
构造函数 更多... | |
RC | open_file (const char *filename) |
RC | flush_page () |
RC | add_page (DiskBufferPool *bp, PageNum page_num, Page &page) override |
RC | read_page (DiskBufferPool *bp, PageNum page_num, Page &page) override |
RC | clear_pages (DiskBufferPool *bp) override |
清空所有与指定buffer pool关联的页面 更多... | |
RC | recover () |
virtual RC | add_page (DiskBufferPool *bp, PageNum page_num, Page &page)=0 |
virtual RC | read_page (DiskBufferPool *bp, PageNum page_num, Page &page)=0 |
virtual RC | clear_pages (DiskBufferPool *bp)=0 |
清空所有与指定buffer pool关联的页面 更多... | |
Private 成员函数 | |
RC | write_page (DoubleWritePage *page) |
RC | write_page_internal (DoubleWritePage *page) |
RC | load_pages () |
将磁盘文件中的内容加载到内存中。在启动时调用 | |
Private 属性 | |
int | file_desc_ = -1 |
int | max_pages_ = 0 |
common::Mutex | lock_ |
BufferPoolManager & | bp_manager_ |
DoubleWriteBufferHeader | header_ |
unordered_map< DoubleWritePageKey, DoubleWritePage *, DoubleWritePageKeyHash > | dblwr_pages_ |
页面二次缓冲区,为了解决页面原子写入的问题
一个页面通常比较大,不能保证要么都写入磁盘成功,要么不写入磁盘。如果存在写入一部分的情况, 我们应该有手段检测出来,否则会遇到灾难性的数据不一致问题。 这里的解决方案是在我们写入真实页面数据之前,先将数据放入一个公共的缓冲区,也就是DoubleWriteBuffer, DoubleWriteBuffer会先在一个共享磁盘文件中写入页面数据,在确定写入成功后,再写入真实的页面。 当我们从磁盘中读取页面时,会校验页面的checksum,如果校验失败,则说明页面写入不完整,这时候可以从 DoubleWriteBuffer中读取数据。
DiskDoubleWriteBuffer::DiskDoubleWriteBuffer | ( | BufferPoolManager & | bp_manager, |
int | max_pages = 16 |
||
) |
构造函数
bp_manager | 关联的buffer pool manager |
max_pages | 内存中保存的最大页面数 |
|
overridevirtual |
将页面加入buffer,并且写入磁盘中的共享表空间
实现了 DoubleWriteBuffer.
|
overridevirtual |
清空所有与指定buffer pool关联的页面
实现了 DoubleWriteBuffer.
RC DiskDoubleWriteBuffer::flush_page | ( | ) |
将buffer中的页全部写入磁盘,并且清空buffer TODO 目前的解决方案是等buffer装满后再刷盘,可能会导致程序卡住一段时间
RC DiskDoubleWriteBuffer::open_file | ( | const char * | filename | ) |
打开磁盘中的共享表空间文件
|
overridevirtual |
实现了 DoubleWriteBuffer.
RC DiskDoubleWriteBuffer::recover | ( | ) |
将共享表空间的页读入buffer
|
private |
将buffer中的页面写入对应的磁盘
|
private |
将页面写到当前double write buffer文件中
每次页面更新都应该写入到磁盘中。保证double write buffer 内存和文件中的数据都是最新的。