Commit 0a67b15a authored by Marko Mäkelä's avatar Marko Mäkelä

Cleanup: Remove pointer indirection for trx_t::xid

The trx_t::xid is always allocated, so we might as well allocate it
directly in the trx_t object to improve the locality of reference.
parent 83234719
...@@ -4357,7 +4357,7 @@ innobase_commit_ordered_2( ...@@ -4357,7 +4357,7 @@ innobase_commit_ordered_2(
/* If the transaction is not run in 2pc, we must assign wsrep /* If the transaction is not run in 2pc, we must assign wsrep
XID here in order to get it written in rollback segment. */ XID here in order to get it written in rollback segment. */
if (trx->is_wsrep()) { if (trx->is_wsrep()) {
thd_get_xid(thd, (MYSQL_XID*)trx->xid); thd_get_xid(thd, &reinterpret_cast<MYSQL_XID&>(trx->xid));
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
...@@ -4552,8 +4552,9 @@ innobase_rollback( ...@@ -4552,8 +4552,9 @@ innobase_rollback(
trx is being rolled back due to BF abort, clear XID in order trx is being rolled back due to BF abort, clear XID in order
to avoid writing it to rollback segment out of order. The XID to avoid writing it to rollback segment out of order. The XID
will be reassigned when the transaction is replayed. */ will be reassigned when the transaction is replayed. */
if (trx->state != TRX_STATE_NOT_STARTED && wsrep_is_wsrep_xid(trx->xid)) { if (trx->state != TRX_STATE_NOT_STARTED
trx->xid->null(); && wsrep_is_wsrep_xid(&trx->xid)) {
trx->xid.null();
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
if (rollback_trx if (rollback_trx
...@@ -16683,7 +16684,7 @@ innobase_xa_prepare( ...@@ -16683,7 +16684,7 @@ innobase_xa_prepare(
DBUG_ASSERT(hton == innodb_hton_ptr); DBUG_ASSERT(hton == innodb_hton_ptr);
thd_get_xid(thd, (MYSQL_XID*) trx->xid); thd_get_xid(thd, &reinterpret_cast<MYSQL_XID&>(trx->xid));
if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) { if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) {
...@@ -16815,8 +16816,8 @@ int innobase_rollback_by_xid(handlerton* hton, XID* xid) ...@@ -16815,8 +16816,8 @@ int innobase_rollback_by_xid(handlerton* hton, XID* xid)
/* If a wsrep transaction is being rolled back during /* If a wsrep transaction is being rolled back during
the recovery, we must clear the xid in order to avoid the recovery, we must clear the xid in order to avoid
writing serialisation history for rolled back transaction. */ writing serialisation history for rolled back transaction. */
if (wsrep_is_wsrep_xid(trx->xid)) { if (wsrep_is_wsrep_xid(&trx->xid)) {
trx->xid->null(); trx->xid.null();
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
int ret = innobase_rollback_trx(trx); int ret = innobase_rollback_trx(trx);
...@@ -18312,7 +18313,7 @@ void lock_wait_wsrep_kill(trx_t *bf_trx, ulong thd_id, trx_id_t trx_id) ...@@ -18312,7 +18313,7 @@ void lock_wait_wsrep_kill(trx_t *bf_trx, ulong thd_id, trx_id_t trx_id)
default: default:
break; break;
case TRX_STATE_PREPARED: case TRX_STATE_PREPARED:
if (!wsrep_is_wsrep_xid(vtrx->xid)) if (!wsrep_is_wsrep_xid(&vtrx->xid))
break; break;
/* fall through */ /* fall through */
case TRX_STATE_ACTIVE: case TRX_STATE_ACTIVE:
......
...@@ -859,7 +859,7 @@ struct trx_t : ilist_node<> ...@@ -859,7 +859,7 @@ struct trx_t : ilist_node<>
const char* start_file; /*!< Filename where it was started */ const char* start_file; /*!< Filename where it was started */
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
XID* xid; /*!< X/Open XA transaction XID xid; /*!< X/Open XA transaction
identification to identify a identification to identify a
transaction branch */ transaction branch */
trx_mod_tables_t mod_tables; /*!< List of tables that were modified trx_mod_tables_t mod_tables; /*!< List of tables that were modified
......
...@@ -284,8 +284,8 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr) ...@@ -284,8 +284,8 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr)
&& srv_fast_shutdown)); && srv_fast_shutdown));
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (wsrep_is_wsrep_xid(trx->xid)) { if (wsrep_is_wsrep_xid(&trx->xid)) {
trx_rseg_update_wsrep_checkpoint(rseg_header, trx->xid, mtr); trx_rseg_update_wsrep_checkpoint(rseg_header, &trx->xid, mtr);
} }
#endif #endif
......
...@@ -178,8 +178,6 @@ struct TrxFactory { ...@@ -178,8 +178,6 @@ struct TrxFactory {
trx->dict_operation_lock_mode = 0; trx->dict_operation_lock_mode = 0;
trx->xid = UT_NEW_NOKEY(xid_t());
trx->detailed_error = reinterpret_cast<char*>( trx->detailed_error = reinterpret_cast<char*>(
ut_zalloc_nokey(MAX_DETAILED_ERROR_LEN)); ut_zalloc_nokey(MAX_DETAILED_ERROR_LEN));
...@@ -231,7 +229,6 @@ struct TrxFactory { ...@@ -231,7 +229,6 @@ struct TrxFactory {
ut_a(UT_LIST_GET_LEN(trx->lock.trx_locks) == 0); ut_a(UT_LIST_GET_LEN(trx->lock.trx_locks) == 0);
ut_ad(UT_LIST_GET_LEN(trx->lock.evicted_tables) == 0); ut_ad(UT_LIST_GET_LEN(trx->lock.evicted_tables) == 0);
UT_DELETE(trx->xid);
ut_free(trx->detailed_error); ut_free(trx->detailed_error);
trx->mutex_destroy(); trx->mutex_destroy();
...@@ -675,7 +672,7 @@ static void trx_resurrect(trx_undo_t *undo, trx_rseg_t *rseg, ...@@ -675,7 +672,7 @@ static void trx_resurrect(trx_undo_t *undo, trx_rseg_t *rseg,
this trx_ref_count w/o mutex protection. this trx_ref_count w/o mutex protection.
*/ */
trx->rsegs.m_redo.rseg->acquire(); trx->rsegs.m_redo.rseg->acquire();
*trx->xid= undo->xid; trx->xid= undo->xid;
trx->id= undo->trx_id; trx->id= undo->trx_id;
trx->is_recovered= true; trx->is_recovered= true;
trx->start_time= start_time; trx->start_time= start_time;
...@@ -913,7 +910,7 @@ trx_start_low( ...@@ -913,7 +910,7 @@ trx_start_low(
} }
#ifdef WITH_WSREP #ifdef WITH_WSREP
trx->xid->null(); trx->xid.null();
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
ut_a(ib_vector_is_empty(trx->autoinc_locks)); ut_a(ib_vector_is_empty(trx->autoinc_locks));
...@@ -1347,7 +1344,7 @@ inline void trx_t::commit_in_memory(const mtr_t *mtr) ...@@ -1347,7 +1344,7 @@ inline void trx_t::commit_in_memory(const mtr_t *mtr)
serialize all commits and prevent a group of transactions from serialize all commits and prevent a group of transactions from
gathering. */ gathering. */
commit_lsn= undo_no || !xid->is_null() ? mtr->commit_lsn() : 0; commit_lsn= undo_no || !xid.is_null() ? mtr->commit_lsn() : 0;
if (!commit_lsn) if (!commit_lsn)
/* Nothing to be done. */; /* Nothing to be done. */;
else if (flush_log_later) else if (flush_log_later)
...@@ -1922,7 +1919,7 @@ static my_bool trx_recover_for_mysql_callback(rw_trx_hash_element_t *element, ...@@ -1922,7 +1919,7 @@ static my_bool trx_recover_for_mysql_callback(rw_trx_hash_element_t *element,
<< " in prepared state after recovery"; << " in prepared state after recovery";
ib::info() << "Transaction contains changes to " << trx->undo_no ib::info() << "Transaction contains changes to " << trx->undo_no
<< " rows"; << " rows";
xid= *trx->xid; xid= trx->xid;
} }
} }
} }
...@@ -1997,16 +1994,16 @@ static my_bool trx_get_trx_by_xid_callback(rw_trx_hash_element_t *element, ...@@ -1997,16 +1994,16 @@ static my_bool trx_get_trx_by_xid_callback(rw_trx_hash_element_t *element,
if (trx->is_recovered && if (trx->is_recovered &&
(trx_state_eq(trx, TRX_STATE_PREPARED) || (trx_state_eq(trx, TRX_STATE_PREPARED) ||
trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)) && trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)) &&
arg->xid->eq(reinterpret_cast<XID*>(trx->xid))) arg->xid->eq(&trx->xid))
{ {
#ifdef WITH_WSREP #ifdef WITH_WSREP
/* The commit of a prepared recovered Galera /* The commit of a prepared recovered Galera
transaction needs a valid trx->xid for transaction needs a valid trx->xid for
invoking trx_sys_update_wsrep_checkpoint(). */ invoking trx_sys_update_wsrep_checkpoint(). */
if (!wsrep_is_wsrep_xid(trx->xid)) if (!wsrep_is_wsrep_xid(&trx->xid))
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
/* Invalidate the XID, so that subsequent calls will not find it. */ /* Invalidate the XID, so that subsequent calls will not find it. */
trx->xid->null(); trx->xid.null();
arg->trx= trx; arg->trx= trx;
found= 1; found= 1;
} }
......
...@@ -1051,7 +1051,7 @@ trx_undo_create(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo, ...@@ -1051,7 +1051,7 @@ trx_undo_create(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo,
uint16_t offset = trx_undo_header_create(block, trx->id, mtr); uint16_t offset = trx_undo_header_create(block, trx->id, mtr);
*undo = trx_undo_mem_create(rseg, id, trx->id, trx->xid, *undo = trx_undo_mem_create(rseg, id, trx->id, &trx->xid,
block->page.id().page_no(), offset); block->page.id().page_no(), offset);
if (*undo == NULL) { if (*undo == NULL) {
*err = DB_OUT_OF_MEMORY; *err = DB_OUT_OF_MEMORY;
...@@ -1109,7 +1109,7 @@ trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo, ...@@ -1109,7 +1109,7 @@ trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo,
uint16_t offset = trx_undo_header_create(block, trx->id, mtr); uint16_t offset = trx_undo_header_create(block, trx->id, mtr);
trx_undo_mem_init_for_reuse(undo, trx->id, trx->xid, offset); trx_undo_mem_init_for_reuse(undo, trx->id, &trx->xid, offset);
if (rseg != trx->rsegs.m_redo.rseg) { if (rseg != trx->rsegs.m_redo.rseg) {
return block; return block;
...@@ -1277,7 +1277,7 @@ void trx_undo_set_state_at_prepare(trx_t *trx, trx_undo_t *undo, bool rollback, ...@@ -1277,7 +1277,7 @@ void trx_undo_set_state_at_prepare(trx_t *trx, trx_undo_t *undo, bool rollback,
/*------------------------------*/ /*------------------------------*/
ut_ad(undo->state == TRX_UNDO_ACTIVE); ut_ad(undo->state == TRX_UNDO_ACTIVE);
undo->state = TRX_UNDO_PREPARED; undo->state = TRX_UNDO_PREPARED;
undo->xid = *trx->xid; undo->xid = trx->xid;
/*------------------------------*/ /*------------------------------*/
mtr->write<2>(*block, TRX_UNDO_SEG_HDR + TRX_UNDO_STATE + block->frame, mtr->write<2>(*block, TRX_UNDO_SEG_HDR + TRX_UNDO_STATE + block->frame,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment