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

BufferPool的实现 更多...

#include <disk_buffer_pool.h>

Public 成员函数

 DiskBufferPool (BufferPoolManager &bp_manager, BPFrameManager &frame_manager, DoubleWriteBuffer &dblwr_manager, LogHandler &log_handler)
 
RC open_file (const char *file_name)
 
RC close_file ()
 
RC get_this_page (PageNum page_num, Frame **frame)
 
RC allocate_page (Frame **frame)
 在指定文件中分配一个新的页面,并将其放入缓冲区,返回页面句柄指针。 更多...
 
RC dispose_page (PageNum page_num)
 释放某个页面,将此页面设置为未分配状态 更多...
 
RC purge_page (PageNum page_num)
 释放指定文件关联的页的内存 如果已经脏, 则刷到磁盘,除了pinned page
 
RC purge_all_pages ()
 
RC unpin_page (Frame *frame)
 用于解除pageHandle对应页面的驻留缓冲区限制 更多...
 
RC check_all_pages_unpinned ()
 
int file_desc () const
 
RC flush_page (Frame &frame)
 
RC flush_all_pages ()
 
RC recover_page (PageNum page_num)
 
RC write_page (PageNum page_num, Page &page)
 
RC redo_allocate_page (LSN lsn, PageNum page_num)
 
RC redo_deallocate_page (LSN lsn, PageNum page_num)
 
int32_t id () const
 
const char * filename () const
 

Protected 成员函数

RC allocate_frame (PageNum page_num, Frame **buf)
 
RC purge_frame (PageNum page_num, Frame *used_frame)
 
RC check_page_num (PageNum page_num)
 
RC load_page (PageNum page_num, Frame *frame)
 
RC flush_page_internal (Frame &frame)
 

Private 属性

BufferPoolManagerbp_manager_
 
BPFrameManagerframe_manager_
 BufferPool 管理器
 
DoubleWriteBufferdblwr_manager_
 Frame 管理器
 
BufferPoolLogHandler log_handler_
 Double Write Buffer 管理器
 
int file_desc_ = -1
 BufferPool 日志处理器
 
int32_t buffer_pool_id_ = -1
 文件描述符 由于在最开始打开文件时,没有正确的buffer pool id不能加载header frame,所以单独从文件中读取此标识
 
Framehdr_frame_ = nullptr
 
BPFileHeaderfile_header_ = nullptr
 文件头页面
 
set< PageNum > disposed_pages_
 文件头
 
string file_name_
 已经释放的页面
 
common::Mutex lock_
 文件名
 
common::Mutex wr_lock_
 

友元

class BufferPoolIterator
 

详细描述

BufferPool的实现

一个文件被划分成多个相同大小的页面,并在需要访问的时候,会从文件读取到内存中。 DiskBufferPool 就负责管理磁盘文件,以及负责管理页面在文件与内存中的交互,比如读取、写回。

成员函数说明

◆ allocate_page()

RC DiskBufferPool::allocate_page ( Frame **  frame)

在指定文件中分配一个新的页面,并将其放入缓冲区,返回页面句柄指针。

分配页面时,如果文件中有空闲页,就直接分配一个空闲页; 如果文件中没有空闲页,则扩展文件规模来增加新的空闲页。

◆ check_all_pages_unpinned()

RC DiskBufferPool::check_all_pages_unpinned ( )

检查是否所有页面都是pin count == 0状态(除了第1个页面) 调试使用

◆ close_file()

RC DiskBufferPool::close_file ( )

关闭分页文件

◆ dispose_page()

RC DiskBufferPool::dispose_page ( PageNum  page_num)

释放某个页面,将此页面设置为未分配状态

参数
page_num待释放的页面

◆ flush_all_pages()

RC DiskBufferPool::flush_all_pages ( )

刷新所有页面到double write buffer,即使pin count不是0

◆ flush_page()

RC DiskBufferPool::flush_page ( Frame frame)

如果页面是脏的,就将数据刷新到double write buffer

◆ flush_page_internal()

RC DiskBufferPool::flush_page_internal ( Frame frame)
protected

如果页面是脏的,就将数据刷新到磁盘

◆ get_this_page()

RC DiskBufferPool::get_this_page ( PageNum  page_num,
Frame **  frame 
)

根据文件ID和页号获取指定页面到缓冲区,返回页面句柄指针。

◆ load_page()

RC DiskBufferPool::load_page ( PageNum  page_num,
Frame frame 
)
protected

加载指定页面的数据到内存中

◆ open_file()

RC DiskBufferPool::open_file ( const char *  file_name)

根据文件名打开一个分页文件

◆ purge_frame()

RC DiskBufferPool::purge_frame ( PageNum  page_num,
Frame used_frame 
)
protected

刷新指定页面到磁盘(flush),并且释放关联的Frame

◆ recover_page()

RC DiskBufferPool::recover_page ( PageNum  page_num)

回放日志时处理page0中已被认定为不存在的page

◆ unpin_page()

RC DiskBufferPool::unpin_page ( Frame frame)

用于解除pageHandle对应页面的驻留缓冲区限制

在调用GetThisPage或AllocatePage函数将一个页面读入缓冲区后, 该页面被设置为驻留缓冲区状态,以防止其在处理过程中被置换出去, 因此在该页面使用完之后应调用此函数解除该限制,使得该页面此后可以正常地被淘汰出缓冲区

◆ write_page()

RC DiskBufferPool::write_page ( PageNum  page_num,
Page page 
)

刷新页面到磁盘


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