• Marko Mäkelä's avatar
    MDEV-30753 Possible corruption due to trx_purge_free_segment() · c14a3943
    Marko Mäkelä authored
    Starting with commit 0de3be8c (MDEV-30671),
    the field TRX_UNDO_NEEDS_PURGE lost its previous meaning.
    The following scenario is possible:
    
    (1) InnoDB is killed at a point of time corresponding to the durable
    execution of some fseg_free_step_not_header() but not
    trx_purge_remove_log_hdr().
    (2) After restart, the affected pages are allocated for something else.
    (3) Purge will attempt to access the newly reallocated pages when looking
    for some old undo log records.
    
    trx_purge_free_segment(): Invoke trx_purge_remove_log_hdr() as the first
    thing, to be safe. If the server is killed, some pages will never be
    freed. That is the lesser evil. Also, before each mtr.start(), invoke
    log_free_check() to prevent ib_logfile0 overrun.
    c14a3943
trx0purge.cc 35.9 KB