• Brandon Nesterenko's avatar
    MDEV-33921: Replication breaks when filtering two-phase XA transactions · ea986950
    Brandon Nesterenko authored
    There are two problems.
    
    First, replication fails when XA transactions are used where the
    slave has replicate_do_db set and the client has touched a different
    database when running DML such as inserts. This is because XA
    commands are not treated as keywords, and are thereby not exempt
    from the replication filter. The effect of this is that during an XA
    transaction, if its logged “use db” from the master is filtered out
    by the replication filter, then XA END will be ignored, yet its
    corresponding XA PREPARE will be executed in an invalid state,
    thereby breaking replication.
    
    Second, if the slave replicates an XA transaction which results in
    an empty transaction, the XA START through XA PREPARE first phase of
    the transaction won’t be binlogged, yet the XA COMMIT will be
    binlogged. This will break replication in chain configurations.
    
    The first problem is fixed by treating XA commands in
    Query_log_event as keywords, thus allowing them to bypass the
    replication filter. Note that Query_log_event::is_trans_keyword() is
    changed to accept a new parameter to define its mode, to either
    check for XA commands or regular transaction commands, but not both.
    In addition, mysqlbinlog is adapted to use this mode so its
    --database filter does not remove XA commands from its output.
    
    The second problem fixed by overwriting the XA state in the XID
    cache to be XA_ROLLBACK_ONLY, so at commit time, the server knows to
    rollback the transaction and skip its binlogging. If the xid cache
    is cleared before an XA transaction receives its completion command
    (e.g. on server shutdown), then before reporting ER_XAER_NOTA when
    the completion command is executed, the filter is first checked if
    the database is ignored, and if so, the error is ignored.
    
    Reviewed By:
    ============
    Kristian Nielsen <knielsen@knielsen-hq.org>
    Andrei Elkin <andrei.elkin@mariadb.com>
    ea986950
rpl_xa_empty_transaction.test 9.47 KB