From 460245ff5e1bc8deebcad9883a0b5d4d861628a3 Mon Sep 17 00:00:00 2001 From: happyZYM Date: Fri, 26 Apr 2024 13:44:54 +0000 Subject: [PATCH] finish test for basic tools --- test/MemoryRiver.hpp | 77 ++++++------------------------- test/buffer_pool_manager_test.cpp | 8 ++-- 2 files changed, 19 insertions(+), 66 deletions(-) diff --git a/test/MemoryRiver.hpp b/test/MemoryRiver.hpp index 3d27957..85c1a8a 100644 --- a/test/MemoryRiver.hpp +++ b/test/MemoryRiver.hpp @@ -16,27 +16,16 @@ using std::string; template class MemoryRiver { private: - struct ElementPair { - T data; - size_t nxt_blank; - }; - const static size_t max_element_in_page = (4096 - sizeof(size_t)) / sizeof(ElementPair); - struct DataType { - size_t elements_count; - ElementPair elements[max_element_in_page]; - }; union Page { - DataType dat; + T data; char filler[4096]; }; - // data_id = frame_id * max_element_in_page + element_id std::string file_name; DiskManager *disk_manager; BufferPoolManager *bpm; - size_t first_blank_element_pair_id; char *raw_mem; static_assert(info_len * sizeof(int) <= 4000, "info_len should be less than 4000"); - static_assert(sizeof(T) <= 4088, "T should be less than 4088"); + static_assert(sizeof(T) <= 4096, "T should be less than 4096"); public: MemoryRiver() : disk_manager(nullptr), bpm(nullptr), file_name("") {} @@ -45,10 +34,8 @@ class MemoryRiver { disk_manager = new DiskManager(file_name); bpm = new BufferPoolManager(100, 5, disk_manager); raw_mem = bpm->RawDataMemory(); - memcpy(&first_blank_element_pair_id, raw_mem, sizeof(size_t)); } void CloseFile() { - memcpy(raw_mem, &first_blank_element_pair_id, sizeof(size_t)); bpm->FlushAllPages(); file_name = ""; delete bpm; @@ -62,84 +49,50 @@ class MemoryRiver { void initialise(string FN = "") { if (file_name != "") { - std::string name_bak = 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, true); + disk_manager = new DiskManager(file_name); bpm = new BufferPoolManager(100, 5, disk_manager); raw_mem = bpm->RawDataMemory(); memset(raw_mem, 0, bpm->RawDatMemorySize()); - first_blank_element_pair_id = 0; } void get_info(int &tmp, int n) { if (n > info_len) return; - n += 2; + n--; memcpy(&tmp, raw_mem + n * sizeof(int), sizeof(int)); } void write_info(int tmp, int n) { if (n > info_len) return; - n += 2; + n--; memcpy(raw_mem + n * sizeof(int), &tmp, sizeof(int)); } int write(T &t) { - size_t element_id = first_blank_element_pair_id; - size_t res_id = 0; - if (element_id != 0) { - res_id = element_id; - frame_id_t frame_id = element_id / max_element_in_page; - element_id %= max_element_in_page; - WritePageGuard guard = bpm->FetchPageWrite(frame_id); - first_blank_element_pair_id = guard.AsMut()->dat.elements[element_id].nxt_blank; - guard.AsMut()->dat.elements[element_id].data = t; - guard.AsMut()->dat.elements_count++; - } else { - frame_id_t frame_id; - BasicPageGuard guard = bpm->NewPageGuarded(&frame_id); - guard.AsMut()->dat.elements[0].data = t; - element_id = frame_id * max_element_in_page; - res_id = element_id; - if (max_element_in_page > 1) first_blank_element_pair_id = element_id + 1; - for (size_t i = 1; i < max_element_in_page - 1; i++) { - guard.AsMut()->dat.elements[i].nxt_blank = element_id + i + 1; - } - guard.AsMut()->dat.elements[max_element_in_page - 1].nxt_blank = 0; - guard.AsMut()->dat.elements_count = 1; - } - return res_id; + frame_id_t frame_id; + BasicPageGuard guard = bpm->NewPageGuarded(&frame_id); + guard.AsMut()->data = t; + return frame_id; } void update(T &t, const int index) { - size_t frame_id = index / max_element_in_page; - WritePageGuard guard = bpm->FetchPageWrite(frame_id); - guard.AsMut()->dat.elements[index % max_element_in_page].data = t; + WritePageGuard guard = bpm->FetchPageWrite(index); + guard.AsMut()->data = t; } //读出位置索引index对应的T对象的值并赋值给t,保证调用的index都是由write函数产生 void read(T &t, const int index) { - size_t frame_id = index / max_element_in_page; - ReadPageGuard guard = bpm->FetchPageRead(frame_id); - t = guard.As()->dat.elements[index % max_element_in_page].data; + ReadPageGuard guard = bpm->FetchPageRead(index); + t = guard.As()->data; } //删除位置索引index对应的对象(不涉及空间回收时,可忽略此函数),保证调用的index都是由write函数产生 - void Delete(int index) { - size_t frame_id = index / max_element_in_page; - WritePageGuard guard = bpm->FetchPageWrite(frame_id); - size_t element_id = index % max_element_in_page; - guard.AsMut()->dat.elements[element_id].nxt_blank = first_blank_element_pair_id; - first_blank_element_pair_id = index; - guard.AsMut()->dat.elements_count--; - // if (guard.AsMut()->dat.elements_count == 0) { - // guard.Drop(); - // bpm->DeletePage(frame_id); - // } - } + void Delete(int index) { bpm->DeletePage(index); } }; #endif // BPT_MEMORYRIVER_HPP \ No newline at end of file diff --git a/test/buffer_pool_manager_test.cpp b/test/buffer_pool_manager_test.cpp index 8d0d55a..874be40 100644 --- a/test/buffer_pool_manager_test.cpp +++ b/test/buffer_pool_manager_test.cpp @@ -254,14 +254,14 @@ class FixLengthString { bool operator==(const FixLengthString &other) const { return memcmp(data, other.data, length) == 0; } }; TEST(MemoryRiver, T2) { - spdlog::set_level(spdlog::level::debug); + spdlog::set_level(spdlog::level::err); auto logger_ptr = spdlog::stderr_color_mt("stderr_logger"); - const static size_t string_len = 5; + const static size_t string_len = 120; typedef FixLengthString DataType; std::deque index_collection; std::unordered_map> index_track; size_t interal_id_tot = 0; - const unsigned int RndSeed = 3794; // testing::GTEST_FLAG(random_seed); + const unsigned int RndSeed = testing::GTEST_FLAG(random_seed); std::mt19937 rnd(RndSeed); remove("/tmp/T2.std"); remove("/tmp/T2.dat"); @@ -269,7 +269,7 @@ TEST(MemoryRiver, T2) { { sol::MemoryRiver STD("/tmp/T2.std"); MemoryRiver mr("/tmp/T2.dat"); - int total_opts = 5; + int total_opts = 1000; while (total_opts-- > 0) { int opt = rnd() % 6; switch (opt) {