• Marko Mäkelä's avatar
    MDEV-24188 fixup: Simplify the wait loop · 83a55670
    Marko Mäkelä authored
    Starting with commit 7cffb5f6 (MDEV-23399)
    the function buf_flush_page() will first acquire block->lock and only
    after that invoke set_io_fix(). Before that, it was possible to reach
    a livelock between buf_page_create() and buf_flush_page().
    
    buf_page_create(): Directly try acquiring the exclusive page latch
    without checking whether the page is io-fixed or buffer-fixed.
    (As a matter of fact, the have_x_latch() check is not strictly necessary,
    because we still support recursive X-latches.)
    In case of a latch conflict, wait while allowing buf_page_write_complete()
    to acquire buf_pool.mutex and release the block->lock.
    
    An attempt to wait for exclusive block->lock while holding buf_pool.mutex
    would lead to a hang in the tests parts.part_supported_sql_func_innodb
    and stress.ddl_innodb, due to a deadlock between buf_page_write_complete()
    and buf_page_create().
    
    Similarly, in case of an I/O fixed compressed-only
    ROW_FORMAT=COMPRESSED page, we will sleep before retrying.
    
    In both cases, we will sleep for 1ms or until a flush batch is completed.
    83a55670
buf0buf.cc 138 KB