/*************************************************************************** Gets the previous record in an undo log from the previous page. */ static trx_undo_rec_t* trx_undo_get_prev_rec_from_prev_page( /*=================================*/ /* out: undo log record, the page s-latched, NULL if none */ trx_undo_rec_t* rec, /* in: undo record */ ulint page_no,/* in: undo log header page number */ ulint offset, /* in: undo log header offset on page */ mtr_t* mtr) /* in: mtr */ { ulint prev_page_no; page_t* prev_page; page_t* undo_page; undo_page = buf_frame_align(rec); prev_page_no = flst_get_prev_addr(undo_page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, mtr) .page; if (prev_page_no == FIL_NULL) { return(NULL); } prev_page = trx_undo_page_get_s_latched( buf_frame_get_space_id(undo_page), prev_page_no, mtr); return(trx_undo_page_get_last_rec(prev_page, page_no, offset)); }
void btr_pcur_move_to_next_page( /*=======================*/ btr_pcur_t* cursor, /* in: persistent cursor; must be on the last record of the current page */ mtr_t* mtr) /* in: mtr */ { ulint next_page_no; ulint space; page_t* page; page_t* next_page; ut_a(cursor->pos_state == BTR_PCUR_IS_POSITIONED); ut_ad(cursor->latch_mode != BTR_NO_LATCHES); ut_ad(btr_pcur_is_after_last_on_page(cursor, mtr)); cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; page = btr_pcur_get_page(cursor); next_page_no = btr_page_get_next(page, mtr); space = buf_frame_get_space_id(page); ut_ad(next_page_no != FIL_NULL); next_page = btr_page_get(space, next_page_no, cursor->latch_mode, mtr); ut_a(page_is_comp(next_page) == page_is_comp(page)); buf_block_align(next_page)->check_index_page_at_flush = TRUE; btr_leaf_page_release(page, cursor->latch_mode, mtr); page_cur_set_before_first(next_page, btr_pcur_get_page_cur(cursor)); page_check_dir(next_page); }
/*************************************************************************** Gets the next record in an undo log from the next page. */ static trx_undo_rec_t* trx_undo_get_next_rec_from_next_page( /*=================================*/ /* out: undo log record, the page latched, NULL if none */ page_t* undo_page, /* in: undo log page */ ulint page_no,/* in: undo log header page number */ ulint offset, /* in: undo log header offset on page */ ulint mode, /* in: latch mode: RW_S_LATCH or RW_X_LATCH */ mtr_t* mtr) /* in: mtr */ { trx_ulogf_t* log_hdr; ulint next_page_no; page_t* next_page; ulint space; ulint next; if (page_no == buf_frame_get_page_no(undo_page)) { log_hdr = undo_page + offset; next = mach_read_from_2(log_hdr + TRX_UNDO_NEXT_LOG); if (next != 0) { return(NULL); } } space = buf_frame_get_space_id(undo_page); next_page_no = flst_get_next_addr(undo_page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, mtr) .page; if (next_page_no == FIL_NULL) { return(NULL); } if (mode == RW_S_LATCH) { next_page = trx_undo_page_get_s_latched(space, next_page_no, mtr); } else { ut_ad(mode == RW_X_LATCH); next_page = trx_undo_page_get(space, next_page_no, mtr); } return(trx_undo_page_get_first_rec(next_page, page_no, offset)); }
void flst_print( /*=======*/ flst_base_node_t* base, /* in: pointer to base node of list */ mtr_t* mtr) /* in: mtr */ { buf_frame_t* frame; ulint len; ut_ad(base && mtr); ut_ad(mtr_memo_contains(mtr, buf_block_align(base), MTR_MEMO_PAGE_X_FIX)); frame = buf_frame_align(base); len = flst_get_len(base, mtr); printf("FILE-BASED LIST:\n"); printf("Base node in space %lu page %lu byte offset %lu; len %lu\n", buf_frame_get_space_id(frame), buf_frame_get_page_no(frame), (ulint) (base - frame), len); }
void btr_pcur_move_backward_from_page( /*=============================*/ btr_pcur_t* cursor, /* in: persistent cursor, must be on the first record of the current page */ mtr_t* mtr) /* in: mtr */ { ulint prev_page_no; ulint space; page_t* page; page_t* prev_page; ulint latch_mode; ulint latch_mode2; ut_a(cursor->pos_state == BTR_PCUR_IS_POSITIONED); ut_ad(cursor->latch_mode != BTR_NO_LATCHES); ut_ad(btr_pcur_is_before_first_on_page(cursor, mtr)); ut_ad(!btr_pcur_is_before_first_in_tree(cursor, mtr)); latch_mode = cursor->latch_mode; if (latch_mode == BTR_SEARCH_LEAF) { latch_mode2 = BTR_SEARCH_PREV; } else if (latch_mode == BTR_MODIFY_LEAF) { latch_mode2 = BTR_MODIFY_PREV; } else { latch_mode2 = 0; /* To eliminate compiler warning */ ut_error; } btr_pcur_store_position(cursor, mtr); mtr_commit(mtr); mtr_start(mtr); btr_pcur_restore_position(latch_mode2, cursor, mtr); page = btr_pcur_get_page(cursor); prev_page_no = btr_page_get_prev(page, mtr); space = buf_frame_get_space_id(page); if (btr_pcur_is_before_first_on_page(cursor, mtr) && (prev_page_no != FIL_NULL)) { prev_page = btr_pcur_get_btr_cur(cursor)->left_page; btr_leaf_page_release(page, latch_mode, mtr); page_cur_set_after_last(prev_page, btr_pcur_get_page_cur(cursor)); } else if (prev_page_no != FIL_NULL) { /* The repositioned cursor did not end on an infimum record on a page. Cursor repositioning acquired a latch also on the previous page, but we do not need the latch: release it. */ prev_page = btr_pcur_get_btr_cur(cursor)->left_page; btr_leaf_page_release(prev_page, latch_mode, mtr); } cursor->latch_mode = latch_mode; cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; }