diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-07-01 16:38:24 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-07-01 16:38:24 +0300 |
commit | 0a67b15a9d3348d10f6df0caae6f2f973295a43a (patch) | |
tree | 97335bca6d55c2fa524517266257209af45f2b76 | |
parent | 83234719f11b45d1d826f84cc7c758d939cd636d (diff) | |
download | mariadb-git-0a67b15a9d3348d10f6df0caae6f2f973295a43a.tar.gz |
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.
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 15 | ||||
-rw-r--r-- | storage/innobase/include/trx0trx.h | 2 | ||||
-rw-r--r-- | storage/innobase/trx/trx0purge.cc | 4 | ||||
-rw-r--r-- | storage/innobase/trx/trx0trx.cc | 17 | ||||
-rw-r--r-- | storage/innobase/trx/trx0undo.cc | 6 |
5 files changed, 21 insertions, 23 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 1acb8ef5e20..87c59e758b4 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4357,7 +4357,7 @@ innobase_commit_ordered_2( /* If the transaction is not run in 2pc, we must assign wsrep XID here in order to get it written in rollback segment. */ 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 */ @@ -4552,8 +4552,9 @@ innobase_rollback( 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 will be reassigned when the transaction is replayed. */ - if (trx->state != TRX_STATE_NOT_STARTED && wsrep_is_wsrep_xid(trx->xid)) { - trx->xid->null(); + if (trx->state != TRX_STATE_NOT_STARTED + && wsrep_is_wsrep_xid(&trx->xid)) { + trx->xid.null(); } #endif /* WITH_WSREP */ if (rollback_trx @@ -16683,7 +16684,7 @@ innobase_xa_prepare( 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)) { @@ -16815,8 +16816,8 @@ int innobase_rollback_by_xid(handlerton* hton, XID* xid) /* If a wsrep transaction is being rolled back during the recovery, we must clear the xid in order to avoid writing serialisation history for rolled back transaction. */ - if (wsrep_is_wsrep_xid(trx->xid)) { - trx->xid->null(); + if (wsrep_is_wsrep_xid(&trx->xid)) { + trx->xid.null(); } #endif /* WITH_WSREP */ 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) default: break; case TRX_STATE_PREPARED: - if (!wsrep_is_wsrep_xid(vtrx->xid)) + if (!wsrep_is_wsrep_xid(&vtrx->xid)) break; /* fall through */ case TRX_STATE_ACTIVE: diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 1ed256eed23..b06c37e734e 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -859,7 +859,7 @@ public: const char* start_file; /*!< Filename where it was started */ #endif /* UNIV_DEBUG */ - XID* xid; /*!< X/Open XA transaction + XID xid; /*!< X/Open XA transaction identification to identify a transaction branch */ trx_mod_tables_t mod_tables; /*!< List of tables that were modified diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 2584e534fbc..87284a5d90a 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -284,8 +284,8 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr) && srv_fast_shutdown)); #ifdef WITH_WSREP - if (wsrep_is_wsrep_xid(trx->xid)) { - trx_rseg_update_wsrep_checkpoint(rseg_header, trx->xid, mtr); + if (wsrep_is_wsrep_xid(&trx->xid)) { + trx_rseg_update_wsrep_checkpoint(rseg_header, &trx->xid, mtr); } #endif diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index dc7a719d5b0..b9e95b37d2f 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -178,8 +178,6 @@ struct TrxFactory { trx->dict_operation_lock_mode = 0; - trx->xid = UT_NEW_NOKEY(xid_t()); - trx->detailed_error = reinterpret_cast<char*>( ut_zalloc_nokey(MAX_DETAILED_ERROR_LEN)); @@ -231,7 +229,6 @@ struct TrxFactory { ut_a(UT_LIST_GET_LEN(trx->lock.trx_locks) == 0); ut_ad(UT_LIST_GET_LEN(trx->lock.evicted_tables) == 0); - UT_DELETE(trx->xid); ut_free(trx->detailed_error); trx->mutex_destroy(); @@ -675,7 +672,7 @@ static void trx_resurrect(trx_undo_t *undo, trx_rseg_t *rseg, this trx_ref_count w/o mutex protection. */ trx->rsegs.m_redo.rseg->acquire(); - *trx->xid= undo->xid; + trx->xid= undo->xid; trx->id= undo->trx_id; trx->is_recovered= true; trx->start_time= start_time; @@ -913,7 +910,7 @@ trx_start_low( } #ifdef WITH_WSREP - trx->xid->null(); + trx->xid.null(); #endif /* WITH_WSREP */ ut_a(ib_vector_is_empty(trx->autoinc_locks)); @@ -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 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) /* Nothing to be done. */; else if (flush_log_later) @@ -1922,7 +1919,7 @@ static my_bool trx_recover_for_mysql_callback(rw_trx_hash_element_t *element, << " in prepared state after recovery"; ib::info() << "Transaction contains changes to " << trx->undo_no << " 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, if (trx->is_recovered && (trx_state_eq(trx, TRX_STATE_PREPARED) || trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)) && - arg->xid->eq(reinterpret_cast<XID*>(trx->xid))) + arg->xid->eq(&trx->xid)) { #ifdef WITH_WSREP /* The commit of a prepared recovered Galera transaction needs a valid trx->xid for invoking trx_sys_update_wsrep_checkpoint(). */ - if (!wsrep_is_wsrep_xid(trx->xid)) + if (!wsrep_is_wsrep_xid(&trx->xid)) #endif /* WITH_WSREP */ /* Invalidate the XID, so that subsequent calls will not find it. */ - trx->xid->null(); + trx->xid.null(); arg->trx= trx; found= 1; } diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 8b84cf36258..da3f6b592fa 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -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); - *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); if (*undo == NULL) { *err = DB_OUT_OF_MEMORY; @@ -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); - 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) { return block; @@ -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); 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, |