MySQL解析檔案fsp中的free list

aoerqileng發表於2022-10-04

最近在改進之前解析檔案的程式,有一些內容之前沒有解析,比如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部落格 ” ,連結:http://blog.itpub.net/25719946/viewspace-2917046/,如需轉載,請註明出處,否則將追究法律責任。

相關文章