MySQL解析文件fsp中的free list

来源:这里教程网 时间:2026-03-01 16:49:51 作者:

最近在改进之前解析文件的程序,有一些内容之前没有解析,比如fsp上的free list,很多描述的文章中只是说这个是个节点的链表,但是具体怎么解析对应的字节,没有描述,所以看了下源码,通过看源码就比较清晰的知道怎么解析了。比如解析free list的

Initializes a list base node. */
UNIV_INLINE
void
flst_init(
/*======*/
flst_base_node_t*   base,   /*!< in: pointer to base node */
mtr_t*          mtr)    /*!< in: mini-transaction handle */
{
ut_ad(mtr_memo_contains_page_flagged(mtr, base,
MTR_MEMO_PAGE_X_FIX
| MTR_MEMO_PAGE_SX_FIX));
mlog_write_ulint(base + FLST_LEN, 0, MLOG_4BYTES, mtr);
flst_write_addr(base + FLST_FIRST, fil_addr_null, mtr);
flst_write_addr(base + FLST_LAST, fil_addr_null, mtr);
}
通过上面的初始化的过程,我们可以看到有4字节是代表长度,后面2个地址,一个是开始,一个是结束
通过flst_get_first这个读取开始节点的函数,可以看到是调用了flst_read_addr
flst_get_first(
/*===========*/
const flst_base_node_t* base,   /*!< in: pointer to base node */
mtr_t*          mtr)    /*!< in: mini-transaction handle */
{
return(flst_read_addr(base + FLST_FIRST, mtr));
}
flst_read_addr(
/*===========*/
const fil_faddr_t*  faddr,  /*!< in: pointer to file faddress */
mtr_t*          mtr)    /*!< in: mini-transaction handle */
{
fil_addr_t  addr;
ut_ad(faddr && mtr);
addr.page = mtr_read_ulint(faddr + FIL_ADDR_PAGE, MLOG_4BYTES, mtr);
addr.boffset = mtr_read_ulint(faddr + FIL_ADDR_BYTE, MLOG_2BYTES,
mtr);
ut_a(addr.page == FIL_NULL || addr.boffset >= FIL_PAGE_DATA);
ut_a(ut_align_offset(faddr, UNIV_PAGE_SIZE) >= FIL_PAGE_DATA);
return(addr);
}
这样我们就知道free list是怎么解析的了

有兴趣学习源码的加群一起学习啊 QQ:                                                                700072075

相关推荐