• Marko Mäkelä's avatar
    MDEV-15443 Properly read wsrep XID and binlog position from rollback segment headers · 67f6d40b
    Marko Mäkelä authored
    The problem is a regression caused by MDEV-15158.
    If some transactions were committed with wsrep_on=0, a
    rollback segment header having the highest trx_id assigned might
    store undefined wsrep XID. When reading the wsrep checkpoint
    from InnodB, the undefined wsrep XID might be returned instead
    of the highest valid one.
    
    Similarly, if the binary log is intermittently disabled or enabled
    while InnoDB transactions are being committed, the latest updated
    rollback segment header page might not contain the latest binlog metadata.
    
    Therefore, the MDEV-15158 logic to rely on TRX_RSEG_MAX_TRX_ID for
    determining the most recent WSREP XID or binlog position is invalid.
    We must choose the maximum entries among the rollback segment header
    pages.
    
    This fix is based on code submitted by Teemu Ollakka from Codership
    and by Thirunarayanan Balathandayuthapani from MariaDB Corporation.
    
    trx_purge_add_undo_to_history(): Only write TRX_RSEG_MAX_TRX_ID
    when it was used to be written before MDEV-15158.
    
    wsrep_seqno: Renamed from trx_sys_cur_xid_seqno.
    
    wsrep_uuid: Renamed from trx_sys_cur_xid_uuid, and enable in non-debug
    builds.
    
    read_wsrep_xid_uuid(): Make non-debug, and remove the memcpy().
    
    trx_rseg_update_wsrep_checkpoint(): Correctly compare and copy
    the entire UUID in the debug check. In case of UUID mismatch,
    write the WSREP XID to all 128 rollback segment headers in
    a single mini-transaction.
    
    trx_rseg_read_wsrep_checkpoint(rseg_header, xid): Make static.
    In case the information is absent, do not overwrite xid.
    
    trx_rseg_read_wsrep_checkpoint(xid): Determine the maximum
    WSREP XID.
    
    trx_rseg_mem_restore(): Remove the parameter max_rseg_trx_id.
    Determine the latest binlog file and position by comparing
    file names and offsets. Declare trx_sys.recovered_binlog_offset
    as an unsigned type.
    67f6d40b
trx0sys.h 35.2 KB