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

页面二次缓冲区,为了解决页面原子写入的问题 更多...

#include <double_write_buffer.h>

类 DiskDoubleWriteBuffer 继承关系图:
DoubleWriteBuffer

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_
 
BufferPoolManagerbp_manager_
 
DoubleWriteBufferHeader header_
 
unordered_map< DoubleWritePageKey, DoubleWritePage *, DoubleWritePageKeyHashdblwr_pages_
 

详细描述

页面二次缓冲区,为了解决页面原子写入的问题

一个页面通常比较大,不能保证要么都写入磁盘成功,要么不写入磁盘。如果存在写入一部分的情况, 我们应该有手段检测出来,否则会遇到灾难性的数据不一致问题。 这里的解决方案是在我们写入真实页面数据之前,先将数据放入一个公共的缓冲区,也就是DoubleWriteBuffer, DoubleWriteBuffer会先在一个共享磁盘文件中写入页面数据,在确定写入成功后,再写入真实的页面。 当我们从磁盘中读取页面时,会校验页面的checksum,如果校验失败,则说明页面写入不完整,这时候可以从 DoubleWriteBuffer中读取数据。

注解
每次都要保证,不管在内存中还是在文件中,这里的数据都是最新的,都比Buffer pool中的数据要新

构造及析构函数说明

◆ DiskDoubleWriteBuffer()

DiskDoubleWriteBuffer::DiskDoubleWriteBuffer ( BufferPoolManager bp_manager,
int  max_pages = 16 
)

构造函数

参数
bp_manager关联的buffer pool manager
max_pages内存中保存的最大页面数

成员函数说明

◆ add_page()

RC DiskDoubleWriteBuffer::add_page ( DiskBufferPool bp,
PageNum  page_num,
Page page 
)
overridevirtual

将页面加入buffer,并且写入磁盘中的共享表空间

实现了 DoubleWriteBuffer.

◆ clear_pages()

RC DiskDoubleWriteBuffer::clear_pages ( DiskBufferPool bp)
overridevirtual

清空所有与指定buffer pool关联的页面

实现了 DoubleWriteBuffer.

◆ flush_page()

RC DiskDoubleWriteBuffer::flush_page ( )

将buffer中的页全部写入磁盘,并且清空buffer TODO 目前的解决方案是等buffer装满后再刷盘,可能会导致程序卡住一段时间

◆ open_file()

RC DiskDoubleWriteBuffer::open_file ( const char *  filename)

打开磁盘中的共享表空间文件

◆ read_page()

RC DiskDoubleWriteBuffer::read_page ( DiskBufferPool bp,
PageNum  page_num,
Page page 
)
overridevirtual

实现了 DoubleWriteBuffer.

◆ recover()

RC DiskDoubleWriteBuffer::recover ( )

将共享表空间的页读入buffer

◆ write_page()

RC DiskDoubleWriteBuffer::write_page ( DoubleWritePage page)
private

将buffer中的页面写入对应的磁盘

◆ write_page_internal()

RC DiskDoubleWriteBuffer::write_page_internal ( DoubleWritePage page)
private

将页面写到当前double write buffer文件中

每次页面更新都应该写入到磁盘中。保证double write buffer 内存和文件中的数据都是最新的。


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