• Marko Mäkelä's avatar
    MDEV-22850 Reduce buf_pool.page_hash latch contention · 757e756d
    Marko Mäkelä authored
    For reads, the buf_pool.page_hash is protected by buf_pool.mutex or
    by the hash_lock. There is no need to compute or acquire hash_lock
    if we are not modifying the buf_pool.page_hash.
    
    However, the buf_pool.page_hash latch must be held exclusively
    when changing buf_page_t::in_file(), or if we desire to prevent
    buf_page_t::can_relocate() or buf_page_t::buf_fix_count()
    from changing.
    
    rw_lock_lock_word_decr(): Add a comment that explains the polling logic.
    
    buf_page_t::set_state(): When in_file() is to be changed, assert that
    an exclusive buf_pool.page_hash latch is being held. Unfortunately
    we cannot assert this for set_state(BUF_BLOCK_REMOVE_HASH) because
    set_corrupt_id() may already have been called.
    
    buf_LRU_free_page(): Check buf_page_t::can_relocate() before
    aqcuiring the hash_lock.
    
    buf_block_t::initialise(): Initialize also page.buf_fix_count().
    
    buf_page_create(): Initialize buf_fix_count while not holding
    any mutex or hash_lock. Acquire the hash_lock only for the
    duration of inserting the block to the buf_pool.page_hash.
    
    buf_LRU_old_init(), buf_LRU_add_block(),
    buf_page_t::belongs_to_unzip_LRU(): Do not assert buf_page_t::in_file(),
    because buf_page_create() will invoke buf_LRU_add_block()
    before acquiring hash_lock and buf_page_t::set_state().
    
    buf_pool_t::validate(): Rely on the buf_pool.mutex and do not
    unnecessarily acquire any buf_pool.page_hash latches.
    
    buf_page_init_for_read(): Clarify that we must acquire the hash_lock
    upfront in order to prevent a race with buf_pool_t::watch_remove().
    757e756d
sync0rw.ic 26.4 KB