buffer pool manager passed Memory River Test
This commit is contained in:
@ -2,9 +2,8 @@
|
||||
#define BPT_PAGE_HPP
|
||||
#include <utility>
|
||||
#include "bpt/config.h"
|
||||
#pragma pack(push, 1)
|
||||
template <typename KeyType, size_t kPageSize = 4096>
|
||||
class BPlusTreePage {
|
||||
struct ActualDataType {
|
||||
typedef std::pair<KeyType, default_numeric_index_t> value_type;
|
||||
page_id_t p_n;
|
||||
page_id_t p_parent;
|
||||
@ -13,8 +12,15 @@ class BPlusTreePage {
|
||||
const static size_t kMaxKeyCount =
|
||||
(kPageSize - sizeof(page_id_t) * 2 - sizeof(uint8_t) - sizeof(uint16_t)) / sizeof(value_type);
|
||||
value_type p_data[kMaxKeyCount];
|
||||
char filler[kPageSize - sizeof(page_id_t) * 2 - sizeof(uint8_t) - sizeof(uint16_t) -
|
||||
sizeof(value_type) * kMaxKeyCount];
|
||||
};
|
||||
#pragma pack(pop)
|
||||
template <typename KeyType, size_t kPageSize = 4096>
|
||||
union BPlusTreePage {
|
||||
inline BPlusTreePage() {}
|
||||
inline BPlusTreePage &operator=(const BPlusTreePage &that) {
|
||||
memcpy(this, &that, sizeof(BPlusTreePage));
|
||||
return *this;
|
||||
}
|
||||
ActualDataType<KeyType, kPageSize> data;
|
||||
char filler[kPageSize];
|
||||
};
|
||||
#endif // BPT_PAGE_H
|
@ -362,6 +362,10 @@ class BufferPoolManager {
|
||||
|
||||
/**
|
||||
* @brief Flush all the pages in the buffer pool to disk.
|
||||
*
|
||||
* @warning The buffer pool manager will automatically call FlushAllPages before being destroyed, but if the disk
|
||||
* manager is closed, it will do nothing. And Page Guard should be destroyed before Buffer Pool Manager, Buffer Pool
|
||||
* Manager should be destroyed before Disk Manager.
|
||||
*/
|
||||
void FlushAllPages();
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define DISK_MANAGER_H
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include "config.h"
|
||||
#include "bpt/config.h"
|
||||
class DiskManager {
|
||||
/**
|
||||
* The Data Structure on Disk:
|
||||
|
@ -97,7 +97,10 @@ BufferPoolManager::BufferPoolManager(size_t pool_size, size_t replacer_k, DiskMa
|
||||
free_list_.emplace_back(static_cast<int>(i));
|
||||
}
|
||||
}
|
||||
BufferPoolManager::~BufferPoolManager() { delete[] pages_; }
|
||||
BufferPoolManager::~BufferPoolManager() {
|
||||
FlushAllPages();
|
||||
delete[] pages_;
|
||||
}
|
||||
|
||||
page_id_t BufferPoolManager::AllocatePage() {
|
||||
page_id_t page_id = disk_manager->AllocNewEmptyPageId();
|
||||
|
@ -46,6 +46,7 @@ char *DiskManager::RawDataMemory() { return raw_data_memory; }
|
||||
size_t DiskManager::RawDatMemorySize() { return kPageSize - meta_data_size; }
|
||||
|
||||
void DiskManager::FullyFlush() {
|
||||
if(fp==nullptr) return;
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
fwrite(&first_empty_page_id, sizeof(page_id_t), 1, fp);
|
||||
fwrite(¤t_total_page_count, sizeof(size_t), 1, fp);
|
||||
@ -63,11 +64,13 @@ void DiskManager::Close() {
|
||||
}
|
||||
|
||||
void DiskManager::ReadPage(page_id_t page_id, char *page_data_ptr) {
|
||||
if (fp == nullptr) return;
|
||||
fseek(fp, page_id * kPageSize, SEEK_SET);
|
||||
fread(page_data_ptr, kPageSize, 1, fp);
|
||||
}
|
||||
|
||||
void DiskManager::WritePage(page_id_t page_id, const char *page_data_ptr) {
|
||||
if (fp == nullptr) return;
|
||||
fseek(fp, page_id * kPageSize, SEEK_SET);
|
||||
fwrite(page_data_ptr, kPageSize, 1, fp);
|
||||
}
|
||||
|
Reference in New Issue
Block a user