• Marko Mäkelä's avatar
    MDEV-33213 History list is not shrunk unless there is a pause in the workload · f8c88d90
    Marko Mäkelä authored
    The parameter innodb_undo_log_truncate=ON enables a multi-phased logic:
    1. Any "producers" (new starting transactions) are prohibited
    from using the rollback segments that reside in the undo tablespace.
    2. Any transactions that use any of the rollback segments must be
    committed or aborted.
    3. The purge of committed transaction history must process all the
    rollback segments.
    4. The undo tablespace is truncated and rebuilt.
    5. The rollback segments are re-enabled for new transactions.
    
    There was one flaw in this logic: The first step was not being invoked
    as often as it could be, and therefore innodb_undo_log_truncate=ON
    would have no chance to work during a heavy write workload.
    
    Independent of innodb_undo_log_truncate, even after
    commit 86767bcc
    we are missing some chances to free processed undo log pages.
    If we prohibited the creation of new transactions in one busy
    rollback segment at a time, we would be eventually guaranteed
    to be able to free such pages.
    
    purge_sys_t::skipped_rseg: The current candidate rollback segment
    for shrinking the history independent of innodb_undo_log_truncate.
    
    purge_sys_t::iterator::free_history_rseg(): Renamed from
    trx_purge_truncate_rseg_history(). Implement the logic
    around purge_sys.m_skipped_rseg.
    
    purge_sys_t::truncate_undo_space: Renamed from truncate.
    
    purge_sys.truncate_undo_space.last: Changed the type to integer
    to get rid of some pointer dereferencing and conditional branches.
    
    purge_sys_t::truncating_tablespace(), purge_sys_t::undo_truncate_try():
    Refactored from trx_purge_truncate_history().
    Set purge_sys.truncate_undo_space.current if applicable,
    or return an already set purge_sys.truncate_undo_space.current.
    
    purge_coordinator_state::do_purge(): Invoke
    purge_sys_t::truncating_tablespace() as part of the normal work loop,
    to implement innodb_undo_log_truncate=ON as often as possible.
    
    trx_purge_truncate_rseg_history(): Remove a redundant parameter.
    
    trx_undo_truncate_start(): Replace dead code with a debug assertion.
    
    Correctness tested by: Matthias Leich
    Performance tested by: Axel Schwenke
    Reviewed by: Debarun Banerjee
    f8c88d90
trx0rseg.h 11 KB