buffer pool manager passed Memory River Test

This commit is contained in:
2024-04-26 08:50:11 +00:00
parent 8e1d8c7291
commit d47e32e986
7 changed files with 183 additions and 7 deletions

98
test/MemoryRiver.hpp Normal file
View File

@ -0,0 +1,98 @@
#include <cstddef>
#include <cstring>
#include "bpt/buffer_pool_manager.h"
#include "bpt/config.h"
#include "bpt/disk_manager.h"
#ifndef BPT_MEMORYRIVER_HPP
#define BPT_MEMORYRIVER_HPP
#include <fstream>
using std::fstream;
using std::ifstream;
using std::ofstream;
using std::string;
template <class T, int info_len = 2>
class MemoryRiver {
private:
union Page {
T data;
char filler[4096];
};
std::string file_name;
DiskManager *disk_manager;
BufferPoolManager *bpm;
char *raw_mem;
static_assert(info_len * sizeof(int) <= 4000, "info_len should be less than 4000");
static_assert(sizeof(T) <= 4096, "T should be less than 4096");
public:
MemoryRiver() : disk_manager(nullptr), bpm(nullptr), file_name("") {}
MemoryRiver(const string &file_name) : file_name(file_name) {
disk_manager = new DiskManager(file_name);
bpm = new BufferPoolManager(100, 5, disk_manager);
raw_mem = bpm->RawDataMemory();
}
void CloseFile() {
bpm->FlushAllPages();
file_name = "";
delete bpm;
bpm = nullptr;
delete disk_manager;
disk_manager = nullptr;
}
~MemoryRiver() {
if (file_name != "") CloseFile();
}
void initialise(string FN = "") {
if (file_name != "") {
std::string name_bak=file_name;
CloseFile();
file_name = name_bak;
}
if (FN != "") file_name = FN;
if (file_name == "") return;
disk_manager = new DiskManager(file_name);
bpm = new BufferPoolManager(100, 5, disk_manager);
raw_mem = bpm->RawDataMemory();
memset(raw_mem, 0, bpm->RawDatMemorySize());
}
void get_info(int &tmp, int n) {
if (n > info_len) return;
n--;
memcpy(&tmp, raw_mem + n * sizeof(int), sizeof(int));
}
void write_info(int tmp, int n) {
if (n > info_len) return;
n--;
memcpy(raw_mem + n * sizeof(int), &tmp, sizeof(int));
}
int write(T &t) {
frame_id_t frame_id;
BasicPageGuard guard = bpm->NewPageGuarded(&frame_id);
guard.AsMut<Page>()->data = t;
return frame_id;
}
void update(T &t, const int index) {
WritePageGuard guard = bpm->FetchPageWrite(index);
guard.AsMut<Page>()->data = t;
}
//读出位置索引index对应的T对象的值并赋值给t保证调用的index都是由write函数产生
void read(T &t, const int index) {
ReadPageGuard guard = bpm->FetchPageRead(index);
t = guard.As<Page>()->data;
}
//删除位置索引index对应的对象(不涉及空间回收时,可忽略此函数)保证调用的index都是由write函数产生
void Delete(int index) { bpm->DeletePage(index); }
};
#endif // BPT_MEMORYRIVER_HPP

View File

@ -5,7 +5,10 @@
#include <memory>
#include <random>
#include <string>
#include "bpt/bpt_page.hpp"
#include "bpt/config.h"
#include "bpt/disk_manager.h"
#include "MemoryRiver.hpp"
// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
// Expect two strings not to be equal.
@ -139,4 +142,63 @@ TEST(BufferPoolManagerTest, SampleTest) {
delete bpm;
delete disk_manager;
}
TEST(StoreTest, Test1) {
remove("/tmp/test.db");
DiskManager *disk_manager_ptr = new DiskManager("/tmp/test.db");
BufferPoolManager *buffer_pool_manager = new BufferPoolManager(10, 3, disk_manager_ptr);
char *mem = buffer_pool_manager->RawDataMemory();
uint32_t a = 0x1f2f3f4f;
memcpy(mem, &a, sizeof(uint32_t));
delete buffer_pool_manager;
delete disk_manager_ptr;
disk_manager_ptr = new DiskManager("/tmp/test.db");
buffer_pool_manager = new BufferPoolManager(10, 3, disk_manager_ptr);
mem = buffer_pool_manager->RawDataMemory();
uint32_t b;
memcpy(&b, mem, sizeof(uint32_t));
EXPECT_EQ(a, b);
delete buffer_pool_manager;
delete disk_manager_ptr;
disk_manager_ptr = new DiskManager("/tmp/test.db");
buffer_pool_manager = new BufferPoolManager(10, 3, disk_manager_ptr);
page_id_t page_id;
auto basic_guard = buffer_pool_manager->NewPageGuarded(&page_id);
typedef BPlusTreePage<unsigned long long> PageType;
PageType c;
c.data.p_n = 0x1f2f3f4f;
c.data.key_count = 0x1f2a;
c.data.is_leaf = 0x3e;
c.data.p_data[17].first = 0x8f7f6f5f4f3f2f1f;
c.filler[0] = 0x1f;
*basic_guard.AsMut<PageType>() = c;
basic_guard.Drop();
auto read_guard = buffer_pool_manager->FetchPageRead(page_id);
EXPECT_EQ(c.data.p_n, read_guard.As<PageType>()->data.p_n);
EXPECT_EQ(0, memcmp(&c, read_guard.As<PageType>(), sizeof(PageType)));
read_guard.Drop();
delete buffer_pool_manager;
delete disk_manager_ptr;
disk_manager_ptr = new DiskManager("/tmp/test.db");
buffer_pool_manager = new BufferPoolManager(10, 3, disk_manager_ptr);
read_guard = buffer_pool_manager->FetchPageRead(page_id);
EXPECT_EQ(c.data.p_n, read_guard.As<PageType>()->data.p_n);
EXPECT_EQ(0, memcmp(&c, read_guard.As<PageType>(), sizeof(PageType)));
read_guard.Drop();
delete buffer_pool_manager;
delete disk_manager_ptr;
}
TEST(MemoryRiver,T1) {
MemoryRiver<unsigned long long> river;
river.initialise("/tmp/test2.db");
int x=3;
river.write_info(x,1);
unsigned long long dat1=0x1f2f3f4f5f6f7f8f;
frame_id_t frame_id = river.write(dat1);
for(int i=0;i<100;i++) {
dat1++;
river.write(dat1);
}
}