• Marko Mäkelä's avatar
    MDEV-26055: Improve adaptive flushing · 9593cccf
    Marko Mäkelä authored
    Adaptive flushing is enabled by setting innodb_max_dirty_pages_pct_lwm>0
    (not default) and innodb_adaptive_flushing=ON (default).
    There is also the parameter innodb_adaptive_flushing_lwm
    (default: 10 per cent of the log capacity). It should enable some
    adaptive flushing even when innodb_max_dirty_pages_pct_lwm=0.
    That is not being changed here.
    
    This idea was first presented by Inaam Rana several years ago,
    and I discussed it with Jean-François Gagné at FOSDEM 2023.
    
    buf_flush_page_cleaner(): When we are not near the log capacity limit
    (neither buf_flush_async_lsn nor buf_flush_sync_lsn are set),
    also try to move clean blocks from the buf_pool.LRU list to buf_pool.free
    or initiate writes (but not the eviction) of dirty blocks, until
    the remaining I/O capacity has been consumed.
    
    buf_flush_LRU_list_batch(): Add the parameter bool evict, to specify
    whether dirty least recently used pages (from buf_pool.LRU) should
    be evicted immediately after they have been written out. Callers outside
    buf_flush_page_cleaner() will pass evict=true, to retain the existing
    behaviour.
    
    buf_do_LRU_batch(): Add the parameter bool evict.
    Return counts of evicted and flushed pages.
    
    buf_flush_LRU(): Add the parameter bool evict.
    Assume that the caller holds buf_pool.mutex and
    will invoke buf_dblwr.flush_buffered_writes() afterwards.
    
    buf_flush_list_holding_mutex(): A low-level variant of buf_flush_list()
    whose caller must hold buf_pool.mutex and invoke
    buf_dblwr.flush_buffered_writes() afterwards.
    
    buf_flush_wait_batch_end_acquiring_mutex(): Remove. It is enough to have
    buf_flush_wait_batch_end().
    
    page_cleaner_flush_pages_recommendation(): Avoid some floating-point
    arithmetics.
    
    buf_flush_page(), buf_flush_check_neighbor(), buf_flush_check_neighbors(),
    buf_flush_try_neighbors(): Rename the parameter "bool lru" to "bool evict".
    
    buf_free_from_unzip_LRU_list_batch(): Remove the parameter.
    Only actual page writes will contribute towards the limit.
    
    buf_LRU_free_page(): Evict freed pages of temporary tables.
    
    buf_pool.done_free: Broadcast whenever a block is freed
    (and buf_pool.try_LRU_scan is set).
    
    buf_pool_t::io_buf_t::reserve(): Retry indefinitely.
    During the test encryption.innochecksum we easily run out of
    these buffers for PAGE_COMPRESSED or ENCRYPTED pages.
    
    Tested by Matthias Leich and Axel Schwenke
    9593cccf
buf0buf.cc 118 KB