TASK #1 - PAGE LAYOUTS
在lab 2中需要实现一个使用线性探测方案的hash table,这个lab中的hash table的存储空间只能使用BufferPoolManager来获取,不能另外使用new或者malloc来获取存储hash table需要的空间。要实现的hash table必须支持持久化,在内存中写入硬盘后,重启DMBS也能重建该hash table。为了实现hash table的读写,在这个lab中需要实现Hash Table Header Page和Hash Table Block Page这个两种Page。
HASH TABLE HEADER PAGE
- 关于HASH TABLE HEADER PAGE数据结构的定义:
Variable Name | Size | Description |
---|---|---|
page_id_ | 4 bytes | Self Page Id |
size_ | 4 bytes | Number of Key & Value pairs the hash table can hold |
next_ind_ | 4 bytes | The next index to add a new entry to block_page_ids_ |
lsn_ | 4 bytes | Log sequence number (Used in Project 4) |
block_page_ids_ | 4080 bytes | Array of block page_id_t |
这个project所要实现的就是在多个page中构建一个linear probe hash table,hash table header page相当于这个hash table的meta data page,负责将所有的block page串联起来。一个header page对应Page中的data_,所以一个header page的大小为4096bytes。在实现时header page的成员变量声明如下:
class HashTableHeaderPage {
private:
__attribute__((unused)) lsn_t lsn_;
__attribute__((unused)) size_t size_;
__attribute__((unused)) page_id_t page_id_;
__attribute__((unused)) size_t next_ind_ = 0;
__attribute__((unused)) page_id_t block_page_ids_[0];
}
这个类的声明用到了柔性数组,block_page_ids_声明时数组的大小为0,block_page_ids_可以根据给header的空间大小自适应改变,所以在这个project中block_page_ids_的实际大小为4096-4-4-4-4=4080 bytes。
block_page_ids_中存储的是所使用的hash table block page的page_id_t,next_ind_对应下一个b