CMU 15-445/645 PROJECT #1 - BUFFER POOL(BufferManage實現思路入手)
阿新 • • 發佈:2021-02-01
技術標籤:演算法
從標頭檔案
buffer_pool_manager.h
的資料成員入手,理出思路:
/** Number of pages in the buffer pool. */ size_t pool_size_; /** Array of buffer pool pages. */ Page *pages_; /** Pointer to the disk manager. */ DiskManager *disk_manager_ __attribute__((__unused__)); /** Pointer to the log manager. */ LogManager *log_manager_ __attribute__((__unused__)); /** Page table for keeping track of buffer pool pages. */ std::unordered_map<page_id_t, frame_id_t> page_table_; /** Replacer to find unpinned pages for replacement. */ Replacer *replacer_; /** List of free pages. */ std::list<frame_id_t> free_list_; /** This latch protects shared data structures. We recommend updating this comment to describe what it protects. */ std::mutex latch_;
建立頁表的過程,至少能看懂
TEST(BufferPoolManagerTest, DISABLED_BinaryDataTest) { const std::string db_name = "test.db"; const size_t buffer_pool_size = 10; std::random_device r; std::default_random_engine rng(r()); std::uniform_int_distribution<char> uniform_dist(0); auto *disk_manager = new DiskManager(db_name); auto *bpm = new BufferPoolManager(buffer_pool_size, disk_manager); page_id_t page_id_temp; auto *page0 = bpm->NewPage(&page_id_temp); // Scenario: The buffer pool is empty. We should be able to create a new page. ASSERT_NE(nullptr, page0); EXPECT_EQ(0, page_id_temp); char random_binary_data[PAGE_SIZE]; // Generate random binary data for (char &i : random_binary_data) { i = uniform_dist(rng); } // Insert terminal characters both in the middle and at end random_binary_data[PAGE_SIZE / 2] = '\0'; random_binary_data[PAGE_SIZE - 1] = '\0'; // Scenario: Once we have a page, we should be able to read and write content. std::memcpy(page0->GetData(), random_binary_data, PAGE_SIZE); EXPECT_EQ(0, std::memcmp(page0->GetData(), random_binary_data, PAGE_SIZE)); // Scenario: We should be able to create new pages until we fill up the buffer pool. for (size_t i = 1; i < buffer_pool_size; ++i) { EXPECT_NE(nullptr, bpm->NewPage(&page_id_temp)); } // Scenario: Once the buffer pool is full, we should not be able to create any new pages. for (size_t i = buffer_pool_size; i < buffer_pool_size * 2; ++i) { EXPECT_EQ(nullptr, bpm->NewPage(&page_id_temp)); }
大概理解幾個關鍵資料後,找到思路。未完待續