diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-04-29 16:00:17 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-04-29 16:00:17 +0300 |
commit | 3e6722d88d686a5e14266abdc8b85577124bb309 (patch) | |
tree | 1f235f32765433b32a95dc40d9c33821a220c9e9 /storage/innobase/trx/trx0roll.cc | |
parent | 496d0372ef2ff2a570c20923af4df32a03781acd (diff) | |
download | mariadb-git-3e6722d88d686a5e14266abdc8b85577124bb309.tar.gz |
Cleanup: More trx_t member functions
trx_t::rollback(): Renamed from trx_rollback_to_savepoint().
trx_t::rollback_low(): Renamed from trx_rollback_to_savepoint_low().
fts_sql_commit(): Defined as an alias of trx_commit_for_mysql().
fts_sql_rollback(): Defined as an alias of trx_t::rollback().
fts_rename_aux_tables_to_hex_format(): Fix the error handling
that likely never worked because we failed to roll back the
first transaction.
Diffstat (limited to 'storage/innobase/trx/trx0roll.cc')
-rw-r--r-- | storage/innobase/trx/trx0roll.cc | 153 |
1 files changed, 65 insertions, 88 deletions
diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index 346b208700f..adf41906cb7 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -90,107 +90,85 @@ inline bool trx_t::rollback_finish() undo= nullptr; } commit_low(); - lock.que_state = TRX_QUE_RUNNING; + lock.que_state= TRX_QUE_RUNNING; return false; } -/*******************************************************************//** -Rollback a transaction used in MySQL. */ -static -void -trx_rollback_to_savepoint_low( -/*==========================*/ - trx_t* trx, /*!< in: transaction handle */ - trx_savept_t* savept) /*!< in: pointer to savepoint undo number, if - partial rollback requested, or NULL for - complete rollback */ +/** Roll back an active transaction. */ +inline void trx_t::rollback_low(trx_savept_t *savept) { - que_thr_t* thr; - mem_heap_t* heap; - roll_node_t* roll_node; - - heap = mem_heap_create(512); - - roll_node = roll_node_create(heap); - - if (savept != NULL) { - roll_node->savept = savept; - check_trx_state(trx); - } else { - assert_trx_nonlocking_or_in_list(trx); - } - - trx->error_state = DB_SUCCESS; - - if (trx->has_logged_or_recovered()) { + mem_heap_t *heap= mem_heap_create(512); + roll_node_t *roll_node= roll_node_create(heap); + roll_node->savept= savept; - ut_ad(trx->rsegs.m_redo.rseg != 0 - || trx->rsegs.m_noredo.rseg != 0); + if (savept) + check_trx_state(this); + else + assert_trx_nonlocking_or_in_list(this); - thr = pars_complete_graph_for_exec(roll_node, trx, heap, NULL); + error_state = DB_SUCCESS; - ut_a(thr == que_fork_start_command( - static_cast<que_fork_t*>(que_node_get_parent(thr)))); - - que_run_threads(thr); - - ut_a(roll_node->undo_thr != NULL); - que_run_threads(roll_node->undo_thr); - - /* Free the memory reserved by the undo graph. */ - que_graph_free(static_cast<que_t*>( - roll_node->undo_thr->common.parent)); - } + if (has_logged_or_recovered()) + { + ut_ad(rsegs.m_redo.rseg || rsegs.m_noredo.rseg); + que_thr_t *thr= pars_complete_graph_for_exec(roll_node, this, heap, + nullptr); + ut_a(thr == que_fork_start_command(static_cast<que_fork_t*> + (que_node_get_parent(thr)))); + que_run_threads(thr); + que_run_threads(roll_node->undo_thr); + + /* Free the memory reserved by the undo graph. */ + que_graph_free(static_cast<que_t*>(roll_node->undo_thr->common.parent)); + } - if (!savept) { - trx->rollback_finish(); - MONITOR_INC(MONITOR_TRX_ROLLBACK); - } else { - ut_a(trx->error_state == DB_SUCCESS); - const undo_no_t limit = savept->least_undo_no; - for (trx_mod_tables_t::iterator i = trx->mod_tables.begin(); - i != trx->mod_tables.end(); ) { - trx_mod_tables_t::iterator j = i++; - ut_ad(j->second.valid()); - if (j->second.rollback(limit)) { - trx->mod_tables.erase(j); - } - } - trx->lock.que_state = TRX_QUE_RUNNING; - MONITOR_INC(MONITOR_TRX_ROLLBACK_SAVEPOINT); - } + if (!savept) + { + rollback_finish(); + MONITOR_INC(MONITOR_TRX_ROLLBACK); + } + else + { + ut_a(error_state == DB_SUCCESS); + const undo_no_t limit= savept->least_undo_no; + for (trx_mod_tables_t::iterator i= mod_tables.begin(); + i != mod_tables.end(); ) + { + trx_mod_tables_t::iterator j= i++; + ut_ad(j->second.valid()); + if (j->second.rollback(limit)) + mod_tables.erase(j); + } + lock.que_state= TRX_QUE_RUNNING; + MONITOR_INC(MONITOR_TRX_ROLLBACK_SAVEPOINT); + } - mem_heap_free(heap); + mem_heap_free(heap); - /* There might be work for utility threads.*/ - srv_active_wake_master_thread(); + /* There might be work for utility threads.*/ + srv_active_wake_master_thread(); - MONITOR_DEC(MONITOR_TRX_ACTIVE); + MONITOR_DEC(MONITOR_TRX_ACTIVE); } -/*******************************************************************//** -Rollback a transaction to a given savepoint or do a complete rollback. +/** Initiate rollback. +@param savept savepoint @return error code or DB_SUCCESS */ -dberr_t -trx_rollback_to_savepoint( -/*======================*/ - trx_t* trx, /*!< in: transaction handle */ - trx_savept_t* savept) /*!< in: pointer to savepoint undo number, if - partial rollback requested, or NULL for - complete rollback */ +dberr_t trx_t::rollback(trx_savept_t *savept) { + ut_ad(!trx_mutex_own(this)); + if (state == TRX_STATE_NOT_STARTED) + { + error_state= DB_SUCCESS; + return DB_SUCCESS; + } + ut_ad(state == TRX_STATE_ACTIVE); #ifdef WITH_WSREP - if (!savept && trx->is_wsrep() && wsrep_thd_is_SR(trx->mysql_thd)) { - wsrep_handle_SR_rollback(NULL, trx->mysql_thd); - } + if (!savept && is_wsrep() && wsrep_thd_is_SR(mysql_thd)) + wsrep_handle_SR_rollback(nullptr, mysql_thd); #endif /* WITH_WSREP */ - ut_ad(!trx_mutex_own(trx)); - - trx_start_if_not_started_xa(trx, true); - - trx_rollback_to_savepoint_low(trx, savept); - - return(trx->error_state); + rollback_low(savept); + return error_state; } /*******************************************************************//** @@ -209,7 +187,7 @@ trx_rollback_for_mysql_low( object, and we set a dummy session that we use for all MySQL transactions. */ - trx_rollback_to_savepoint_low(trx, NULL); + trx->rollback_low(); trx->op_info = ""; @@ -319,8 +297,7 @@ trx_rollback_last_sql_stat_for_mysql( trx->op_info = "rollback of SQL statement"; - err = trx_rollback_to_savepoint( - trx, &trx->last_sql_stat_start); + err = trx->rollback(&trx->last_sql_stat_start); if (trx->fts_trx != NULL) { fts_savepoint_rollback_last_stmt(trx); @@ -441,7 +418,7 @@ trx_rollback_to_savepoint_for_mysql_low( trx->op_info = "rollback to a savepoint"; - err = trx_rollback_to_savepoint(trx, &savep->savept); + err = trx->rollback(&savep->savept); /* Store the current undo_no of the transaction so that we know where to roll back if we have to roll back the |