• Marko Mäkelä's avatar
    dict_check_sys_tables(): Do not rely on buf_page_optimistic_get() · c5883deb
    Marko Mäkelä authored
    We are supposed to commit and restart the mini-transaction
    between records. There is no point to store and restore the
    persistent cursor position otherwise.
    
    If buf_page_optimistic_get() is patched to always fail, the
    debug build would fail to start up due to trying to re-acquire
    an already S-latched block.
    
    This bug (which should not have visible impact to users, because
    the code is only executed during startup, while no other threads
    are accessing B-trees or causing pages to be evicted from the
    buffer pool) was caught as part of a debugging effort for
    something else.
    
    The debugging approach was: Make buf_page_optimistic_get()
    always return FALSE, and add ut_a(block->lock.lock_word == X_LOCK_DECR)
    to both buf_LRU_get_free_only() and buf_LRU_block_free_non_file_page().
    This would catch misuse of the buffer pool. If it were not for
    buf_page_optimistic_get(), no buf_block_t::lock of any BUF_BLOCK_NOT_USED
    block would ever be acquired.
    c5883deb
dict0load.cc 105 KB