• Marko Mäkelä's avatar
    MDEV-29336: Potential deadlock in btr_page_alloc_low() with the AHI · 01f9c812
    Marko Mäkelä authored
    The index root page contains the fields BTR_SEG_TOP and BTR_SEG_LEAF
    which keep track of allocated pages in the index tree. These fields
    are normally protected by an Update latch, so that concurrent read
    access to other parts of the page will be possible.
    
    When the index root page is already exclusively latched in the
    mini-transaction, we must not try to acquire a lower-grade Update latch.
    In fact, when the root page is already X or U latched in the
    mini-transaction, there is no point to acquire another latch.
    Moreover, after a U latch was acquired on top of an X-latch,
    mtr_t::defer_drop_ahi() would trigger an assertion failure or
    lock corruption in block->page.lock.u_x_upgrade() because X locks
    already exist on the block.
    
    This problem may have been introduced in
    commit 03ca6495 (MDEV-24142).
    
    btr_page_alloc_low(), btr_page_free(): Initially buffer-fix the root page.
    If it is already U or X latched, release the buffer-fix. Else, upgrade
    the buffer-fix to a U latch.
    
    mtr_t::u_lock_register(): Upgrade a buffer-fix to U latch.
    
    mtr_t::have_u_or_x_latch(): Check if U or X latches are already
    registered in the mini-transaction.
    01f9c812
btr0btr.cc 159 KB