• Marko Mäkelä's avatar
    Bug #11766513 - 59641: Prepared XA transaction in system after hard crash · 1a0dde92
    Marko Mäkelä authored
    causes future shutdown hang
    
    InnoDB would hang on shutdown if any XA transactions exist in the
    system in the PREPARED state. This has been masked by the fact that
    MySQL would roll back any PREPARED transaction on shutdown, in the
    spirit of Bug #12161 Xa recovery and client disconnection.
    
    [mysql-test-run] do_shutdown_server: Interpret --shutdown_server 0 as
    a request to kill the server immediately without initiating a
    shutdown procedure.
    
    xid_cache_insert(): Initialize XID_STATE::rm_error in order to avoid a
    bogus error message on XA ROLLBACK of a recovered PREPARED transaction.
    
    innobase_commit_by_xid(), innobase_rollback_by_xid(): Free the InnoDB
    transaction object after rolling back a PREPARED transaction.
    
    trx_get_trx_by_xid(): Only consider transactions whose
    trx->is_prepared flag is set. The MySQL layer seems to prevent
    attempts to roll back connected transactions that are in the PREPARED
    state from another connection, but it is better to play it safe. The
    is_prepared flag was introduced in the InnoDB Plugin.
    
    trx_n_prepared: A new counter, counting the number of InnoDB
    transactions in the PREPARED state.
    
    logs_empty_and_mark_files_at_shutdown(): On shutdown, allow
    trx_n_prepared transactions to exist in the system.
    
    trx_undo_free_prepared(), trx_free_prepared(): New functions, to free
    the memory objects of PREPARED transactions on shutdown. This is not
    needed in the built-in InnoDB, because it would collect all allocated
    memory on shutdown. The InnoDB Plugin needs this because of
    innodb_use_sys_malloc.
    
    trx_sys_close(): Invoke trx_free_prepared() on all remaining
    transactions.
    1a0dde92
trx0trx.c 51.3 KB