• Marko Mäkelä's avatar
    Bug#12612184 Race condition after btr_cur_pessimistic_update() · 8a94d55e
    Marko Mäkelä authored
    btr_cur_compress_if_useful(), btr_compress(): Add the parameter ibool
    adjust. If adjust=TRUE, adjust the cursor position after compressing
    the page.
    
    btr_lift_page_up(): Return a pointer to the father page.
    
    BTR_KEEP_POS_FLAG: A new flag for btr_cur_pessimistic_update().
    
    btr_cur_pessimistic_update(): If *big_rec != NULL and flags &
    BTR_KEEP_POS_FLAG, keep the cursor positioned on the updated record.
    Also, do not release the index tree x-lock if *big_rec != NULL.
    
    btr_cur_mtr_commit_and_start(): Commits and restarts a
    mini-transaction so that it will retain an x-lock on index->lock and
    the page of the cursor. This is invoked when
    btr_cur_pessimistic_update() returns *big_rec != NULL.
    
    In all callers of btr_cur_pessimistic_update() that do not pass
    BTR_KEEP_POS_FLAG, assert that *big_rec == NULL.
    
    btr_cur_compress(): Unused function [in the built-in MySQL 5.1], remove.
    
    page_rec_get_nth(): Return the nth record on the page (an inverse
    function of page_rec_get_n_recs_before()). Refactored from
    page_get_middle_rec().
    
    page_get_middle_rec(): Invoke page_rec_get_nth().
    
    page_cur_insert_rec_zip_reorg(): Make use of the page directory
    shortcuts in page_rec_get_nth() instead of scanning the whole list of
    records.
    
    row_ins_clust_index_entry_by_modify(): Pass BTR_KEEP_POS_FLAG to
    btr_cur_pessimistic_update().
    
    row_ins_index_entry_low(): If row_ins_clust_index_entry_by_modify()
    returns a big_rec, invoke btr_cur_mtr_commit_and_start() in order to
    commit and start the mini-transaction without releasing the x-locks on
    index->lock and the cursor page, and write the big_rec. Releasing the
    page latch in mtr_commit() caused a race condition.
    
    row_upd_clust_rec(): Pass BTR_KEEP_POS_FLAG to
    btr_cur_pessimistic_update(). If it returns a big_rec, invoke
    btr_cur_mtr_commit_and_start() in order to commit and start the
    mini-transaction without releasing the x-locks on index->lock and the
    cursor page, and write the big_rec. Releasing the page latch in
    mtr_commit() caused a race condition.
    
    sync_thread_add_level(): Add the parameter ibool relock. When TRUE,
    bypass the latching order rules.
    
    rw_lock_add_debug_info(): For nested X-lock requests, pass relock=TRUE
    to sync_thread_add_level().
    
    rb:678 approved by Jimmy Yang
    8a94d55e
btr0cur.c 106 KB