MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
double_write_buffer.h
1/* Copyright (c) 2021 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 Wenbin1002 on 2024/04/16
13//
14
15#pragma once
16
17#include "common/lang/mutex.h"
18#include "common/lang/unordered_map.h"
19#include "common/types.h"
20#include "common/sys/rc.h"
21#include "storage/buffer/page.h"
22
23class DiskBufferPool;
24struct DoubleWritePage;
26
28{
29public:
30 DoubleWriteBuffer() = default;
31 virtual ~DoubleWriteBuffer() = default;
32
36 virtual RC add_page(DiskBufferPool *bp, PageNum page_num, Page &page) = 0;
37
38 virtual RC read_page(DiskBufferPool *bp, PageNum page_num, Page &page) = 0;
39
43 virtual RC clear_pages(DiskBufferPool *bp) = 0;
44};
45
47{
48 int32_t page_cnt = 0;
49
50 static const int32_t SIZE;
51};
52
53// TODO change to FrameId
55{
56 int32_t buffer_pool_id;
57 PageNum page_num;
58
59 bool operator==(const DoubleWritePageKey &other) const
60 {
61 return buffer_pool_id == other.buffer_pool_id && page_num == other.page_num;
62 }
63};
64
66{
67 size_t operator()(const DoubleWritePageKey &key) const
68 {
69 return hash<int32_t>()(key.buffer_pool_id) ^ hash<PageNum>()(key.page_num);
70 }
71};
72
86{
87public:
94 DiskDoubleWriteBuffer(BufferPoolManager &bp_manager, int max_pages = 16);
95 virtual ~DiskDoubleWriteBuffer();
96
100 RC open_file(const char *filename);
101
106 RC flush_page();
107
111 RC add_page(DiskBufferPool *bp, PageNum page_num, Page &page) override;
112
113 RC read_page(DiskBufferPool *bp, PageNum page_num, Page &page) override;
114
118 RC clear_pages(DiskBufferPool *bp) override;
119
123 RC recover();
124
125private:
129 RC write_page(DoubleWritePage *page);
130
137
141 RC load_pages();
142
143private:
144 int file_desc_ = -1;
145 int max_pages_ = 0;
146 common::Mutex lock_;
147 BufferPoolManager &bp_manager_;
149
150 unordered_map<DoubleWritePageKey, DoubleWritePage *, DoubleWritePageKeyHash> dblwr_pages_;
151};
152
154{
155public:
156 virtual ~VacuousDoubleWriteBuffer() = default;
157
161 RC add_page(DiskBufferPool *bp, PageNum page_num, Page &page) override;
162
163 RC read_page(DiskBufferPool *bp, PageNum page_num, Page &page) override { return RC::BUFFERPOOL_INVALID_PAGE_NUM; }
164
168 RC clear_pages(DiskBufferPool *bp) override { return RC::SUCCESS; }
169};
BufferPool的管理类
Definition: disk_buffer_pool.h:322
BufferPool的实现
Definition: disk_buffer_pool.h:189
页面二次缓冲区,为了解决页面原子写入的问题
Definition: double_write_buffer.h:86
RC recover()
Definition: double_write_buffer.cpp:291
RC flush_page()
Definition: double_write_buffer.cpp:75
RC open_file(const char *filename)
Definition: double_write_buffer.cpp:58
RC clear_pages(DiskBufferPool *bp) override
清空所有与指定buffer pool关联的页面
Definition: double_write_buffer.cpp:193
RC write_page(DoubleWritePage *page)
Definition: double_write_buffer.cpp:161
RC load_pages()
将磁盘文件中的内容加载到内存中。在启动时调用
Definition: double_write_buffer.cpp:235
RC add_page(DiskBufferPool *bp, PageNum page_num, Page &page) override
Definition: double_write_buffer.cpp:95
RC write_page_internal(DoubleWritePage *page)
Definition: double_write_buffer.cpp:144
Definition: double_write_buffer.h:28
virtual RC clear_pages(DiskBufferPool *bp)=0
清空所有与指定buffer pool关联的页面
virtual RC add_page(DiskBufferPool *bp, PageNum page_num, Page &page)=0
Definition: double_write_buffer.h:154
RC clear_pages(DiskBufferPool *bp) override
清空所有与指定buffer pool关联的页面
Definition: double_write_buffer.h:168
RC add_page(DiskBufferPool *bp, PageNum page_num, Page &page) override
Definition: double_write_buffer.cpp:297
Definition: mutex.h:268
Definition: double_write_buffer.h:47
Definition: double_write_buffer.h:66
Definition: double_write_buffer.h:55
Definition: double_write_buffer.cpp:25
表示一个页面,可能放在内存或磁盘上
Definition: page.h:34