ITPub博客

首页 > 数据库 > MySQL > MySQL解析文件fsp中的free list

MySQL解析文件fsp中的free list

原创 MySQL 作者:aoerqileng 时间:2022-10-04 10:51:58 0 删除 编辑

最近在改进之前解析文件的程序,有一些内容之前没有解析,比如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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25719946/viewspace-2917046/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
二手知识受害者

注册时间:2011-11-02

  • 博文量
    68
  • 访问量
    47738