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 =
75 (BP_PAGE_DATA_SIZE - sizeof(buffer_pool_id) - sizeof(page_count) - sizeof(allocated_pages)) * 8;
76
77 string to_string() const;
78};
79
89{
90public:
91 BPFrameManager(const char *tag);
92
93 RC init(int pool_num);
94 RC cleanup();
95
103 Frame *get(int buffer_pool_id, PageNum page_num);
104
111 list<Frame *> find_list(int buffer_pool_id);
112
120 Frame *alloc(int buffer_pool_id, PageNum page_num);
121
126 RC free(int buffer_pool_id, PageNum page_num, Frame *frame);
127
135 int purge_frames(int count, function<RC(Frame *frame)> purger);
136
137 size_t frame_num() const { return frames_.count(); }
138
142 size_t total_frame_num() const { return allocator_.get_size(); }
143
144private:
145 Frame *get_internal(const FrameId &frame_id);
146 RC free_internal(const FrameId &frame_id, Frame *frame);
147
148private:
150 {
151 public:
152 size_t operator()(const FrameId &frame_id) const { return frame_id.hash(); }
153 };
154
157
158 mutex lock_;
159 FrameLruCache frames_;
160 FrameAllocator allocator_;
161};
162
168{
169public:
172
173 RC init(DiskBufferPool &bp, PageNum start_page = 0);
174 bool has_next();
175 PageNum next();
176 RC reset();
177
178private:
179 common::Bitmap bitmap_;
180 PageNum current_page_num_ = -1;
181};
182
189class DiskBufferPool final
190{
191public:
192 DiskBufferPool(BufferPoolManager &bp_manager, BPFrameManager &frame_manager, DoubleWriteBuffer &dblwr_manager,
193 LogHandler &log_handler);
195
199 RC open_file(const char *file_name);
200
204 RC close_file();
205
209 RC get_this_page(PageNum page_num, Frame **frame);
210
216 RC allocate_page(Frame **frame);
217
223 RC dispose_page(PageNum page_num);
224
229 RC purge_page(PageNum page_num);
230 RC purge_all_pages();
231
239 RC unpin_page(Frame *frame);
240
246
247 int file_desc() const;
248
252 RC flush_page(Frame &frame);
253
257 RC flush_all_pages();
258
262 RC recover_page(PageNum page_num);
263
267 RC write_page(PageNum page_num, Page &page);
268
269 RC redo_allocate_page(LSN lsn, PageNum page_num);
270 RC redo_deallocate_page(LSN lsn, PageNum page_num);
271
272public:
273 int32_t id() const { return buffer_pool_id_; }
274
275 const char *filename() const { return file_name_.c_str(); }
276
277protected:
278 RC allocate_frame(PageNum page_num, Frame **buf);
279
283 RC purge_frame(PageNum page_num, Frame *used_frame);
284 RC check_page_num(PageNum page_num);
285
289 RC load_page(PageNum page_num, Frame *frame);
290
294 RC flush_page_internal(Frame &frame);
295
296private:
297 BufferPoolManager &bp_manager_;
301
302 int file_desc_ = -1;
304 int32_t buffer_pool_id_ = -1;
305 Frame *hdr_frame_ = nullptr;
307 set<PageNum> disposed_pages_;
308
309 string file_name_;
310
312 common::Mutex wr_lock_;
313
314private:
315 friend class BufferPoolIterator;
316};
317
323{
324public:
325 BufferPoolManager(int memory_size = 0);
327
328 RC init(unique_ptr<DoubleWriteBuffer> dblwr_buffer);
329
330 RC create_file(const char *file_name);
331 RC open_file(LogHandler &log_handler, const char *file_name, DiskBufferPool *&bp);
332 RC close_file(const char *file_name);
333
334 RC flush_page(Frame &frame);
335
336 BPFrameManager &get_frame_manager() { return frame_manager_; }
337 DoubleWriteBuffer *get_dblwr_buffer() { return dblwr_buffer_.get(); }
338
345 RC get_buffer_pool(int32_t id, DiskBufferPool *&bp);
346
347private:
348 BPFrameManager frame_manager_{"BufPool"};
349
350 unique_ptr<DoubleWriteBuffer> dblwr_buffer_;
351
352 common::Mutex lock_;
353 unordered_map<string, DiskBufferPool *> buffer_pools_;
354 unordered_map<int32_t, DiskBufferPool *> id_to_buffer_pools_;
355 atomic<int32_t> next_buffer_pool_id_{1}; // 系统启动时,会打开所有的表,这样就可以知道当前系统最大的ID是多少了
356};
Definition: disk_buffer_pool.h:150
管理页面Frame
Definition: disk_buffer_pool.h:89
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:142
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:168
BufferPool 的日志记录处理器
Definition: buffer_pool_log.h:80
BufferPool的管理类
Definition: disk_buffer_pool.h:323
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:190
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:298
RC write_page(PageNum page_num, Page &page)
Definition: disk_buffer_pool.cpp:599
DoubleWriteBuffer & dblwr_manager_
Frame 管理器
Definition: disk_buffer_pool.h:299
string file_name_
已经释放的页面
Definition: disk_buffer_pool.h:309
RC close_file()
Definition: disk_buffer_pool.cpp:279
BufferPoolLogHandler log_handler_
Double Write Buffer 管理器
Definition: disk_buffer_pool.h:300
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:306
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:307
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:304
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:311
int file_desc_
BufferPool 日志处理器
Definition: disk_buffer_pool.h:302
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