• Thirunarayanan Balathandayuthapani's avatar
    MDEV-15772 Potential list overrun during XA recovery · d5da8ae0
    Thirunarayanan Balathandayuthapani authored
    InnoDB could return the same list again and again if the buffer
    passed to trx_recover_for_mysql() is smaller than the number of
    transactions that InnoDB recovered in XA PREPARE state.
    
    We introduce the transaction state TRX_PREPARED_RECOVERED, which
    is like TRX_PREPARED, but will be set during trx_recover_for_mysql()
    so that each transaction will only be returned once.
    
    Because init_server_components() is invoking ha_recover() twice,
    we must reset the state of the transactions back to TRX_PREPARED
    after returning the complete list, so that repeated traversals
    will see the complete list again, instead of seeing an empty list.
    Without this tweak, the test main.tc_heuristic_recover would hang
    in MariaDB 10.1.
    d5da8ae0
trx0trx.h 31.8 KB