• Marko Mäkelä's avatar
    MDEV-34791: Redundant page lookups hurt performance · 9878238f
    Marko Mäkelä authored
    btr_cur_t::search_leaf(): When the index root page is also a leaf page,
    we may need to upgrade our existing shared root page latch into an
    exclusive latch. Even if we end up waiting, the root page won't be able
    to go away while we hold an index()->lock. The index page may be split;
    that is all.
    
    btr_latch_prev(): Acquire the page latch while holding a buffer-fix
    and an index tree latch. Merge the change buffer if needed. Use
    buf_pool_t::page_fix() for this special case instead of complicating
    buf_page_get_low() and buf_page_get_gen().
    
    row_merge_read_clustered_index(): Remove some code that does not seem
    to be useful. No difference was observed with regard to removing this
    code when a CREATE INDEX or OPTIMIZE TABLE statement was run concurrently
    with sysbench oltp_update_index --tables=1 --table_size=1000 --threads=16.
    
    buf_pool_t::unzip(): Decompress a ROW_FORMAT=COMPRESSED page.
    
    buf_pool_t::page_fix(): Handle also ROW_FORMAT=COMPRESSED pages
    as well as change buffer merge. Optionally return an error.
    Add a flag for suppressing a page latch wait and a special return
    value -1 to indicate that the call would block.
    This is the preferred way of buffer-fixing blocks.
    The functions buf_page_get_gen() and buf_page_get_low() are only being
    invoked with rw_latch=RW_NO_LATCH in operations on SPATIAL INDEX.
    
    buf_page_t: Define some static functions for interpreting state().
    
    buf_page_get_zip(), buf_read_page(),
    buf_read_ahead_random(), buf_read_ahead_linear():
    Remove the redundant parameter zip_size. We must look up the
    tablespace and can invoke fil_space_t::zip_size() on it.
    
    buf_page_get_low(): Require mtr!=nullptr.
    
    buf_page_get_gen(): Implement some lock downgrading during recovery.
    
    ibuf_page_low(): Use buf_pool_t::page_fix() in a debug check.
    We do wait for a page read here, because otherwise a debug assertion in
    buf_page_get_low() in the test innodb.ibuf_delete could occasionally fail.
    
    PageConverter::operator(): Invoke buf_pool_t::page_fix() in order
    to possibly evict a block. This allows us to remove some
    special case code from buf_page_get_low().
    9878238f
buf0rea.cc 24.6 KB