整个rollback segment 初始化完成后将space id和page no 写回到 transaction system segment header中。

sys_header = trx_sysf_get(mtr); //获取 5号 block指针 跳过 FIL_PAGE_DATA 38U

trx_sysf_rseg_set_space(sys_header, rseg_slot_no, space, mtr); //设置space

trx_sysf_rseg_set_page_no(sys_header, rseg_slot_no, page_no, mtr); //设置 no
下面是 rollback segment header的结构

/* Transaction rollback segment header */
/*-------------------------------------------------------------*/
#define TRX_RSEG_MAX_SIZE 0 /* Maximum allowed size for rollback
segment in pages */
#define TRX_RSEG_HISTORY_SIZE 4 /* Number of file pages occupied
by the logs in the history list */ //history 链表大小
#define TRX_RSEG_HISTORY 8 /* The update undo logs for committed
transactions */ //链表头base node 他们通常调用include/fut0lst.ic中的函数进行更改
#define TRX_RSEG_FSEG_HEADER (8 + FLST_BASE_NODE_SIZE)
/* Header for the file segment where
this page is placed */
#define TRX_RSEG_UNDO_SLOTS (8 + FLST_BASE_NODE_SIZE + FSEG_HEADER_SIZE)
/* Undo log segment slots */ //
/*-------------------------------------------------------------*/
作为 base node的 TRX_RSEG_HISTORY,我们可以看到定义如下:

/* We define the field offsets of a base node for the list */
#define FLST_LEN 0 /* 32-bit list length field */
#define FLST_FIRST 4 /* 6-byte address of the first element
of the list; undefined if empty list */
#define FLST_LAST (4 + FIL_ADDR_SIZE) /* 6-byte address of the
last element of the list; undefined
if empty list */

#define FIL_ADDR_PAGE 0 /* first in address is the page offset */
#define FIL_ADDR_BYTE 4 /* then comes 2-byte byte offset within page*/
#endif /* !UNIV_INNOCHECKSUM */
#define FIL_ADDR_SIZE 6 /* address size is 6 bytes */
多了一个长度

到这里128 rollback segment已经初始化完成,并且,每个都包含1024个 undo segment slots。

posted @ 2019-08-06 19:32  李艳艳665  阅读(230)  评论(0编辑  收藏  举报