• Davi Arnaut's avatar
    Bug#44672: Assertion failed: thd->transaction.xid_state.xid.is_null() · 12f91b1d
    Davi Arnaut authored
    The problem is that when a optimization of read-only transactions
    (bypass 2-phase commit) was implemented, it removed the code that
    reseted the XID once a transaction wasn't active anymore:
    
    sql/sql_parse.cc:
    
    -  bzero(&thd->transaction.stmt, sizeof(thd->transaction.stmt));
    -  if (!thd->active_transaction())
    -    thd->transaction.xid_state.xid.null();
    +  thd->transaction.stmt.reset();
    
    This mostly worked fine as the transaction commit and rollback
    functions (in handler.cc) reset the XID once the transaction is
    ended. But those functions wouldn't reset the XID in case of
    a empty transaction, leading to a assertion when a new starting
    a new XA transaction.
    
    The solution is to ensure that the XID state is reset when empty
    transactions are ended (by either commit or rollback). This is
    achieved by reorganizing the code so that the transaction cleanup
    routine is invoked whenever a transaction is ended.
    
    mysql-test/r/xa.result:
      Add test case result for Bug#44672
    mysql-test/t/xa.test:
      Add test case for Bug#44672
    sql/handler.cc:
      Invoke transaction cleanup function whenever a transaction is
      ended. Move XID state reset logic to the transaction cleanup
      function.
    sql/sql_class.h:
      Add XID state reset logic.
    12f91b1d
sql_class.h 95.2 KB