28#include "common/lang/bitmap.h"
29#include "common/lang/lru_cache.h"
30#include "common/lang/mutex.h"
31#include "common/lang/memory.h"
32#include "common/lang/unordered_map.h"
33#include "common/mm/mem_pool.h"
34#include "common/sys/rc.h"
35#include "common/types.h"
36#include "storage/buffer/frame.h"
37#include "storage/buffer/page.h"
38#include "storage/buffer/buffer_pool_log.h"
51#define BP_FILE_SUB_HDR_SIZE (sizeof(BPFileSubHeader))
66 int32_t buffer_pool_id;
76 string to_string()
const;
92 RC init(
int pool_num);
102 Frame *
get(
int buffer_pool_id, PageNum page_num);
110 list<Frame *>
find_list(
int buffer_pool_id);
119 Frame *
alloc(
int buffer_pool_id, PageNum page_num);
125 RC
free(
int buffer_pool_id, PageNum page_num,
Frame *frame);
136 size_t frame_num()
const {
return frames_.count(); }
145 RC free_internal(
const FrameId &frame_id,
Frame *frame);
151 size_t operator()(
const FrameId &frame_id)
const {
return frame_id.hash(); }
179 PageNum current_page_num_ = -1;
229 RC purge_all_pages();
246 int file_desc()
const;
268 RC redo_allocate_page(LSN lsn, PageNum page_num);
269 RC redo_deallocate_page(LSN lsn, PageNum page_num);
274 const char *filename()
const {
return file_name_.c_str(); }
277 RC allocate_frame(PageNum page_num,
Frame **buf);
283 RC check_page_num(PageNum page_num);
304 Frame *hdr_frame_ =
nullptr;
327 RC init(unique_ptr<DoubleWriteBuffer> dblwr_buffer);
331 RC close_file(
const char *file_name);
333 RC flush_page(
Frame &frame);
349 unique_ptr<DoubleWriteBuffer> dblwr_buffer_;
352 unordered_map<string, DiskBufferPool *> buffer_pools_;
353 unordered_map<int32_t, DiskBufferPool *> id_to_buffer_pools_;
354 atomic<int32_t> next_buffer_pool_id_{1};
Definition: disk_buffer_pool.h:149
管理页面Frame
Definition: disk_buffer_pool.h:88
Frame * get(int buffer_pool_id, PageNum page_num)
获取指定的页面
Definition: disk_buffer_pool.cpp:104
size_t total_frame_num() const
Definition: disk_buffer_pool.h:141
RC free(int buffer_pool_id, PageNum page_num, Frame *frame)
Definition: disk_buffer_pool.cpp:147
Frame * alloc(int buffer_pool_id, PageNum page_num)
分配一个新的页面
Definition: disk_buffer_pool.cpp:123
list< Frame * > find_list(int buffer_pool_id)
列出所有指定文件的页面
Definition: disk_buffer_pool.cpp:170
int purge_frames(int count, function< RC(Frame *frame)> purger)
Definition: disk_buffer_pool.cpp:62
用于遍历BufferPool中的所有页面
Definition: disk_buffer_pool.h:167
BufferPool 的日志记录处理器
Definition: buffer_pool_log.h:80
BufferPool的管理类
Definition: disk_buffer_pool.h:322
RC get_buffer_pool(int32_t id, DiskBufferPool *&bp)
根据ID获取对应的BufferPool对象
Definition: disk_buffer_pool.cpp:908
RC create_file(const char *file_name)
Definition: disk_buffer_pool.cpp:795
BufferPool的实现
Definition: disk_buffer_pool.h:189
RC purge_frame(PageNum page_num, Frame *used_frame)
Definition: disk_buffer_pool.cpp:474
RC load_page(PageNum page_num, Frame *frame)
Definition: disk_buffer_pool.cpp:735
RC check_all_pages_unpinned()
Definition: disk_buffer_pool.cpp:520
BPFrameManager & frame_manager_
BufferPool 管理器
Definition: disk_buffer_pool.h:297
RC write_page(PageNum page_num, Page &page)
Definition: disk_buffer_pool.cpp:599
DoubleWriteBuffer & dblwr_manager_
Frame 管理器
Definition: disk_buffer_pool.h:298
string file_name_
已经释放的页面
Definition: disk_buffer_pool.h:308
RC close_file()
Definition: disk_buffer_pool.cpp:279
BufferPoolLogHandler log_handler_
Double Write Buffer 管理器
Definition: disk_buffer_pool.h:299
RC flush_page_internal(Frame &frame)
Definition: disk_buffer_pool.cpp:545
RC get_this_page(PageNum page_num, Frame **frame)
Definition: disk_buffer_pool.cpp:314
BPFileHeader * file_header_
文件头页面
Definition: disk_buffer_pool.h:305
RC open_file(const char *file_name)
Definition: disk_buffer_pool.cpp:229
RC purge_page(PageNum page_num)
释放指定文件关联的页的内存 如果已经脏, 则刷到磁盘,除了pinned page
Definition: disk_buffer_pool.cpp:495
RC unpin_page(Frame *frame)
用于解除pageHandle对应页面的驻留缓冲区限制
Definition: disk_buffer_pool.cpp:468
RC flush_page(Frame &frame)
Definition: disk_buffer_pool.cpp:539
RC flush_all_pages()
Definition: disk_buffer_pool.cpp:569
set< PageNum > disposed_pages_
文件头
Definition: disk_buffer_pool.h:306
RC allocate_page(Frame **frame)
在指定文件中分配一个新的页面,并将其放入缓冲区,返回页面句柄指针。
Definition: disk_buffer_pool.cpp:351
int32_t buffer_pool_id_
文件描述符 由于在最开始打开文件时,没有正确的buffer pool id不能加载header frame,所以单独从文件中读取此标识
Definition: disk_buffer_pool.h:303
RC recover_page(PageNum page_num)
Definition: disk_buffer_pool.cpp:583
RC dispose_page(PageNum page_num)
释放某个页面,将此页面设置为未分配状态
Definition: disk_buffer_pool.cpp:437
common::Mutex lock_
文件名
Definition: disk_buffer_pool.h:310
int file_desc_
BufferPool 日志处理器
Definition: disk_buffer_pool.h:301
Definition: double_write_buffer.h:28
页帧标识符
Definition: frame.h:33
对外提供服务的CLog模块
Definition: log_handler.h:40
表示一个页面,可能放在内存或磁盘上
Definition: page.h:34