MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
disk_buffer_pool.h
1/* Copyright (c) 2021 Xie Meiyi(xiemeiyi@hust.edu.cn) and OceanBase and/or its affiliates. All rights reserved.
2miniob is licensed under Mulan PSL v2.
3You can use this software according to the terms and conditions of the Mulan PSL v2.
4You may obtain a copy of Mulan PSL v2 at:
5 http://license.coscl.org.cn/MulanPSL2
6THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
7EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
8MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
9See the Mulan PSL v2 for more details. */
10
11//
12// Created by Meiyi & Longda on 2021/4/13.
13//
14#pragma once
15
16#include <fcntl.h>
17#include <functional>
18#include <mutex>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22#include <string>
23#include <sys/stat.h>
24#include <sys/types.h>
25#include <time.h>
26#include <optional>
27
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"
39
41class DiskBufferPool;
43class LogHandler;
45
51#define BP_FILE_SUB_HDR_SIZE (sizeof(BPFileSubHeader))
52
65{
66 int32_t buffer_pool_id;
67 int32_t page_count;
69 char bitmap[0];
70
74 static const int MAX_PAGE_NUM = (BP_PAGE_DATA_SIZE - sizeof(page_count) - sizeof(allocated_pages)) * 8;
75
76 string to_string() const;
77};
78
88{
89public:
90 BPFrameManager(const char *tag);
91
92 RC init(int pool_num);
93 RC cleanup();
94
102 Frame *get(int buffer_pool_id, PageNum page_num);
103
110 list<Frame *> find_list(int buffer_pool_id);
111
119 Frame *alloc(int buffer_pool_id, PageNum page_num);
120
125 RC free(int buffer_pool_id, PageNum page_num, Frame *frame);
126
134 int purge_frames(int count, function<RC(Frame *frame)> purger);
135
136 size_t frame_num() const { return frames_.count(); }
137
141 size_t total_frame_num() const { return allocator_.get_size(); }
142
143private:
144 Frame *get_internal(const FrameId &frame_id);
145 RC free_internal(const FrameId &frame_id, Frame *frame);
146
147private:
149 {
150 public:
151 size_t operator()(const FrameId &frame_id) const { return frame_id.hash(); }
152 };
153
156
157 mutex lock_;
158 FrameLruCache frames_;
159 FrameAllocator allocator_;
160};
161
167{
168public:
171
172 RC init(DiskBufferPool &bp, PageNum start_page = 0);
173 bool has_next();
174 PageNum next();
175 RC reset();
176
177private:
178 common::Bitmap bitmap_;
179 PageNum current_page_num_ = -1;
180};
181
188class DiskBufferPool final
189{
190public:
191 DiskBufferPool(BufferPoolManager &bp_manager, BPFrameManager &frame_manager, DoubleWriteBuffer &dblwr_manager,
192 LogHandler &log_handler);
194
198 RC open_file(const char *file_name);
199
203 RC close_file();
204
208 RC get_this_page(PageNum page_num, Frame **frame);
209
215 RC allocate_page(Frame **frame);
216
222 RC dispose_page(PageNum page_num);
223
228 RC purge_page(PageNum page_num);
229 RC purge_all_pages();
230
238 RC unpin_page(Frame *frame);
239
245
246 int file_desc() const;
247
251 RC flush_page(Frame &frame);
252
256 RC flush_all_pages();
257
261 RC recover_page(PageNum page_num);
262
266 RC write_page(PageNum page_num, Page &page);
267
268 RC redo_allocate_page(LSN lsn, PageNum page_num);
269 RC redo_deallocate_page(LSN lsn, PageNum page_num);
270
271public:
272 int32_t id() const { return buffer_pool_id_; }
273
274 const char *filename() const { return file_name_.c_str(); }
275
276protected:
277 RC allocate_frame(PageNum page_num, Frame **buf);
278
282 RC purge_frame(PageNum page_num, Frame *used_frame);
283 RC check_page_num(PageNum page_num);
284
288 RC load_page(PageNum page_num, Frame *frame);
289
293 RC flush_page_internal(Frame &frame);
294
295private:
296 BufferPoolManager &bp_manager_;
300
301 int file_desc_ = -1;
303 int32_t buffer_pool_id_ = -1;
304 Frame *hdr_frame_ = nullptr;
306 set<PageNum> disposed_pages_;
307
308 string file_name_;
309
311 common::Mutex wr_lock_;
312
313private:
314 friend class BufferPoolIterator;
315};
316
322{
323public:
324 BufferPoolManager(int memory_size = 0);
326
327 RC init(unique_ptr<DoubleWriteBuffer> dblwr_buffer);
328
329 RC create_file(const char *file_name);
330 RC open_file(LogHandler &log_handler, const char *file_name, DiskBufferPool *&bp);
331 RC close_file(const char *file_name);
332
333 RC flush_page(Frame &frame);
334
335 BPFrameManager &get_frame_manager() { return frame_manager_; }
336 DoubleWriteBuffer *get_dblwr_buffer() { return dblwr_buffer_.get(); }
337
344 RC get_buffer_pool(int32_t id, DiskBufferPool *&bp);
345
346private:
347 BPFrameManager frame_manager_{"BufPool"};
348
349 unique_ptr<DoubleWriteBuffer> dblwr_buffer_;
350
351 common::Mutex lock_;
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}; // 系统启动时,会打开所有的表,这样就可以知道当前系统最大的ID是多少了
355};
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
页帧
Definition: frame.h:66
对外提供服务的CLog模块
Definition: log_handler.h:40
Definition: bitmap.h:20
Definition: mutex.h:268
BufferPool的文件第一个页面,存放一些元数据信息,包括了后面每页的分配信息。
Definition: disk_buffer_pool.h:65
int32_t page_count
buffer pool id
Definition: disk_buffer_pool.h:67
static const int MAX_PAGE_NUM
页面分配位图, 第0个页面(就是当前页面),总是1
Definition: disk_buffer_pool.h:74
int32_t allocated_pages
当前文件一共有多少个页面
Definition: disk_buffer_pool.h:68
char bitmap[0]
已经分配了多少个页面
Definition: disk_buffer_pool.h:69
表示一个页面,可能放在内存或磁盘上
Definition: page.h:34