October 17, 2012

[MySQL学习] 一个压缩Page从磁盘读入buffer pool的过程

以下是边看代码边记录的,从磁盘读取一个压缩Page到buffer pool的的全过程,以函数buf_page_get_gen作为入口 buf_page_get_gen 1.根据space和offset来计算请求的page是否已经读到了buffer pool中 fold = buf_page_address_fold(space, offset); block = (buf_block_t*) buf_page_hash_get_low(                           buf_pool, space, offset, fold); 判断:如果这个block所对应表正在被drop掉(使用lazy drop table),则调用buf_LRU_free_block((buf_page_t*)block, TRUE, TRUE)将其从LRU中删除 block->page.space_was_being_deleted在函数buf_LRU_mark_space_was_deleted内被设置 2.if (block && buf_pool_watch_is_sentinel(buf_pool, &block->page))    则将block设置为NULL。 buffer pool的watch[BUF_POOL_WATCH_SIZE];成员暂不清楚其用途,似乎用在insert buffer上,回头专门研究下 是在MySQL5.5.5引入 一个普通读的mode值为BUF_GET,因此以下也会忽略掉不必要的代码流程 3.当page不在bp时,则从磁盘读取该page。         if (buf_read_page(space, […]