diff options
Diffstat (limited to 'storage/innobase')
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 128 | ||||
-rw-r--r-- | storage/innobase/include/lock0lock.h | 6 | ||||
-rw-r--r-- | storage/innobase/include/trx0trx.h | 7 | ||||
-rw-r--r-- | storage/innobase/lock/lock0lock.cc | 21 | ||||
-rw-r--r-- | storage/innobase/lock/lock0wait.cc | 10 | ||||
-rw-r--r-- | storage/innobase/row/row0ins.cc | 4 | ||||
-rw-r--r-- | storage/innobase/row/row0upd.cc | 2 | ||||
-rw-r--r-- | storage/innobase/srv/srv0conc.cc | 5 | ||||
-rw-r--r-- | storage/innobase/trx/trx0trx.cc | 12 |
9 files changed, 80 insertions, 115 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 10f5e0a2f4b..31841ccff2f 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1715,20 +1715,14 @@ thd_trx_is_auto_commit( /** Enter InnoDB engine after checking the max number of user threads allowed, else the thread is put into sleep. @param[in,out] prebuilt row prebuilt handler */ -static inline -void -innobase_srv_conc_enter_innodb( - row_prebuilt_t* prebuilt) +static inline void innobase_srv_conc_enter_innodb(row_prebuilt_t *prebuilt) { + trx_t* trx = prebuilt->trx; + #ifdef WITH_WSREP - if (wsrep_on(prebuilt->trx->mysql_thd) && - wsrep_thd_is_BF(prebuilt->trx->mysql_thd, FALSE)) { - return; - } + if (trx->is_wsrep() && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) return; #endif /* WITH_WSREP */ - trx_t* trx = prebuilt->trx; - if (srv_thread_concurrency) { if (trx->n_tickets_to_enter_innodb > 0) { @@ -1755,22 +1749,16 @@ innobase_srv_conc_enter_innodb( /** Note that the thread wants to leave InnoDB only if it doesn't have any spare tickets. @param[in,out] m_prebuilt row prebuilt handler */ -static inline -void -innobase_srv_conc_exit_innodb( - row_prebuilt_t* prebuilt) +static inline void innobase_srv_conc_exit_innodb(row_prebuilt_t *prebuilt) { ut_ad(!sync_check_iterate(sync_check())); + trx_t* trx = prebuilt->trx; + #ifdef WITH_WSREP - if (wsrep_on(prebuilt->trx->mysql_thd) && - wsrep_thd_is_BF(prebuilt->trx->mysql_thd, FALSE)) { - return; - } + if (trx->is_wsrep() && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) return; #endif /* WITH_WSREP */ - trx_t* trx = prebuilt->trx; - /* This is to avoid making an unnecessary function call. */ if (trx->declared_to_be_inside_innodb && trx->n_tickets_to_enter_innodb == 0) { @@ -2763,6 +2751,9 @@ innobase_trx_init( trx->check_unique_secondary = !thd_test_options( thd, OPTION_RELAXED_UNIQUE_CHECKS); +#ifdef WITH_WSREP + trx->wsrep = wsrep_on(thd); +#endif DBUG_VOID_RETURN; } @@ -4475,19 +4466,17 @@ innobase_commit_low( trx_t* trx) /*!< in: transaction handle */ { #ifdef WITH_WSREP - THD* thd = (THD*)trx->mysql_thd; const char* tmp = 0; - if (thd && wsrep_on(thd)) { + if (trx->is_wsrep()) { #ifdef WSREP_PROC_INFO char info[64]; info[sizeof(info) - 1] = '\0'; snprintf(info, sizeof(info) - 1, "innobase_commit_low():trx_commit_for_mysql(%lld)", - (long long) wsrep_thd_trx_seqno(thd)); - tmp = thd_proc_info(thd, info); - + (long long) wsrep_thd_trx_seqno(trx->mysql_thd)); + tmp = thd_proc_info(trx->mysql_thd, info); #else - tmp = thd_proc_info(thd, "innobase_commit_low()"); + tmp = thd_proc_info(trx->mysql_thd, "innobase_commit_low()"); #endif /* WSREP_PROC_INFO */ } #endif /* WITH_WSREP */ @@ -4497,7 +4486,7 @@ innobase_commit_low( } trx->will_lock = 0; #ifdef WITH_WSREP - if (thd && wsrep_on(thd)) { thd_proc_info(thd, tmp); } + if (trx->is_wsrep()) { thd_proc_info(trx->mysql_thd, tmp); } #endif /* WITH_WSREP */ } @@ -8113,7 +8102,7 @@ ha_innobase::write_row( { dberr_t error; #ifdef WITH_WSREP - ibool auto_inc_inserted= FALSE; /* if NULL was inserted */ + bool wsrep_auto_inc_inserted= false; #endif int error_result = 0; bool auto_inc_used = false; @@ -8144,7 +8133,7 @@ ha_innobase::write_row( } #ifdef WITH_WSREP - if (wsrep_is_load_multi_commit(m_user_thd)) + if (trx->is_wsrep() && wsrep_is_load_multi_commit(m_user_thd)) { /* Note that this transaction is still active. */ trx_register_for_2pc(m_prebuilt->trx); @@ -8161,7 +8150,9 @@ ha_innobase::write_row( m_prebuilt->autoinc_error = DB_SUCCESS; #ifdef WITH_WSREP - auto_inc_inserted= (table->next_number_field->val_int() == 0); + wsrep_auto_inc_inserted = trx->is_wsrep() + && wsrep_drupal_282555_workaround + && table->next_number_field->val_int() == 0; #endif if ((error_result = update_auto_increment())) { @@ -8255,18 +8246,14 @@ ha_innobase::write_row( m_prebuilt->autoinc_offset, m_prebuilt->autoinc_increment); - if (wsrep_on(m_user_thd) && - auto_inc_inserted && - wsrep_drupal_282555_workaround && + if (wsrep_auto_inc_inserted && wsrep_thd_retry_counter(m_user_thd) == 0 && !thd_test_options(m_user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { WSREP_DEBUG( "retrying insert: %s", - (*wsrep_thd_query(m_user_thd)) ? - wsrep_thd_query(m_user_thd) : - (char *)"void"); + wsrep_thd_query(m_user_thd)); error= DB_SUCCESS; wsrep_thd_set_conflict_state( m_user_thd, MUST_ABORT); @@ -8306,7 +8293,7 @@ set_max_autoinc: m_prebuilt autoinc values don't get properly assigned. Fetch values from server side. */ - if (wsrep_on(m_user_thd) && + if (trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == REPL_RECV) { wsrep_thd_auto_increment_variables( @@ -8355,8 +8342,7 @@ report_error: error, m_prebuilt->table->flags, m_user_thd); #ifdef WITH_WSREP - if (!error_result - && wsrep_on(m_user_thd) + if (!error_result && trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == LOCAL_STATE && !wsrep_consistency_check(m_user_thd) && !wsrep_thd_ignore_table(m_user_thd)) { @@ -8364,10 +8350,9 @@ report_error: NULL)) { DBUG_PRINT("wsrep", ("row key failed")); error_result = HA_ERR_INTERNAL_ERROR; - goto wsrep_error; + goto func_exit; } } -wsrep_error: #endif /* WITH_WSREP */ if (error_result == HA_FTS_INVALID_DOCID) { @@ -9000,7 +8985,7 @@ ha_innobase::update_row( m_prebuilt autoinc values don't get properly assigned. Fetch values from server side. */ - if (wsrep_on(m_user_thd) && + if (trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == REPL_RECV) { wsrep_thd_auto_increment_variables( @@ -9051,9 +9036,8 @@ func_exit: innobase_active_small(); #ifdef WITH_WSREP - if (error == DB_SUCCESS && + if (error == DB_SUCCESS && trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == LOCAL_STATE && - wsrep_on(m_user_thd) && !wsrep_thd_ignore_table(m_user_thd)) { DBUG_PRINT("wsrep", ("update row key")); @@ -9061,14 +9045,11 @@ func_exit: new_row)) { WSREP_DEBUG("WSREP: UPDATE_ROW_KEY FAILED"); DBUG_PRINT("wsrep", ("row key failed")); - err = HA_ERR_INTERNAL_ERROR; - goto wsrep_error; + DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } } -wsrep_error: #endif /* WITH_WSREP */ - DBUG_RETURN(err); } @@ -9115,18 +9096,15 @@ ha_innobase::delete_row( innobase_active_small(); #ifdef WITH_WSREP - if (error == DB_SUCCESS + if (error == DB_SUCCESS && trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == LOCAL_STATE - && wsrep_on(m_user_thd) && !wsrep_thd_ignore_table(m_user_thd)) { if (wsrep_append_keys(m_user_thd, WSREP_KEY_EXCLUSIVE, record, NULL)) { DBUG_PRINT("wsrep", ("delete fail")); - error = (dberr_t) HA_ERR_INTERNAL_ERROR; - goto wsrep_error; + DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } } -wsrep_error: #endif /* WITH_WSREP */ DBUG_RETURN(convert_error_code_to_mysql( error, m_prebuilt->table->flags, m_user_thd)); @@ -10320,30 +10298,27 @@ wsrep_append_foreign_key( wsrep_key_type key_type) /*!< in: access type of this key (shared, exclusive, semi...) */ { - ut_a(trx); - THD* thd = (THD*)trx->mysql_thd; - ulint rcode = DB_SUCCESS; - char cache_key[513] = {'\0'}; - int cache_key_len=0; - bool const copy = true; + THD* thd = trx->mysql_thd; - if (!wsrep_on(trx->mysql_thd) || - wsrep_thd_exec_mode(thd) != LOCAL_STATE) { + if (!trx->is_wsrep() || wsrep_thd_exec_mode(thd) != LOCAL_STATE) { return DB_SUCCESS; } - if (!thd || !foreign || + if (!foreign || (!foreign->referenced_table && !foreign->foreign_table)) { WSREP_INFO("FK: %s missing in: %s", - (!thd) ? "thread" : - ((!foreign) ? "constraint" : - ((!foreign->referenced_table) ? + (!foreign ? "constraint" : + (!foreign->referenced_table ? "referenced table" : "foreign table")), - (thd && wsrep_thd_query(thd)) ? - wsrep_thd_query(thd) : "void"); + wsrep_thd_query(thd)); return DB_ERROR; } + ulint rcode = DB_SUCCESS; + char cache_key[513] = {'\0'}; + int cache_key_len=0; + bool const copy = true; + if ( !((referenced) ? foreign->referenced_table : foreign->foreign_table)) { WSREP_DEBUG("pulling %s table into cache", @@ -15975,9 +15950,7 @@ ha_innobase::external_lock( DBUG_PRINT("enter",("lock_type: %d", lock_type)); update_thd(thd); - - trx_t* trx = m_prebuilt->trx; - + trx_t* trx = m_prebuilt->trx; ut_ad(m_prebuilt->table); /* Statement based binlogging does not work in isolation level @@ -15992,26 +15965,21 @@ ha_innobase::external_lock( && thd_binlog_format(thd) == BINLOG_FORMAT_STMT && thd_binlog_filter_ok(thd) && thd_sqlcom_can_generate_row_events(thd)) { - - bool skip = false; - + bool skip = false; +#ifdef WITH_WSREP + skip = trx->is_wsrep() + && wsrep_thd_exec_mode(thd) != LOCAL_STATE; +#endif /* WITH_WSREP */ /* used by test case */ DBUG_EXECUTE_IF("no_innodb_binlog_errors", skip = true;); if (!skip) { -#ifdef WITH_WSREP - if (!wsrep_on(thd) || wsrep_thd_exec_mode(thd) == LOCAL_STATE) - { -#endif /* WITH_WSREP */ my_error(ER_BINLOG_STMT_MODE_AND_ROW_ENGINE, MYF(0), " InnoDB is limited to row-logging when" " transaction isolation level is" " READ COMMITTED or READ UNCOMMITTED."); DBUG_RETURN(HA_ERR_LOGGING_IMPOSSIBLE); -#ifdef WITH_WSREP - } -#endif /* WITH_WSREP */ } } diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h index 21760d1dca9..6b30bc5ae1b 100644 --- a/storage/innobase/include/lock0lock.h +++ b/storage/innobase/include/lock0lock.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2019, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1045,10 +1045,6 @@ std::string lock_get_info( const lock_t*); -/*******************************************************************//** -@return whether wsrep_on is true on trx->mysql_thd*/ -#define wsrep_on_trx(trx) ((trx)->mysql_thd && wsrep_on((trx)->mysql_thd)) - #endif /* WITH_WSREP */ #include "lock0lock.ic" diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 7e46304b6ee..60e6fc58089 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -873,6 +873,13 @@ public: rolled back by trx_rollback_or_clean_recovered(). Protected by trx_t::mutex for transactions that are in trx_sys. */ bool is_recovered; +#ifdef WITH_WSREP + /** whether wsrep_on(mysql_thd) held at the start of transaction */ + bool wsrep; + bool is_wsrep() const { return UNIV_UNLIKELY(wsrep); } +#else /* WITH_WSREP */ + bool is_wsrep() const { return false; } +#endif /* WITH_WSREP */ ReadView* read_view; /*!< consistent read view used in the transaction, or NULL if not yet set */ diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 006ecc28276..b17f2903e6e 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2019, MariaDB Corporation. +Copyright (c) 2014, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1100,9 +1100,7 @@ wsrep_kill_victim( ut_ad(trx_mutex_own(lock->trx)); /* quit for native mysql */ - if (!wsrep_on(trx->mysql_thd)) { - return; - } + if (!trx->is_wsrep()) return; my_bool bf_this = wsrep_thd_is_BF(trx->mysql_thd, FALSE); my_bool bf_other = wsrep_thd_is_BF(lock->trx->mysql_thd, TRUE); @@ -1185,7 +1183,7 @@ lock_rec_other_has_conflicting( if (lock_rec_has_to_wait(true, trx, mode, lock, is_supremum)) { #ifdef WITH_WSREP - if (wsrep_on_trx(trx)) { + if (trx->is_wsrep()) { trx_mutex_enter(lock->trx); /* Below function will roll back either trx or lock->trx depending on priority of the @@ -1478,7 +1476,7 @@ lock_rec_create_low( ut_ad(index->table->get_ref_count() > 0 || !index->table->can_be_evicted); #ifdef WITH_WSREP - if (c_lock && wsrep_on_trx(trx) + if (c_lock && trx->is_wsrep() && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { lock_t *hash = (lock_t *)c_lock->hash; lock_t *prev = NULL; @@ -1879,8 +1877,7 @@ lock_rec_add_to_queue( #ifdef WITH_WSREP //ut_a(!other_lock || (wsrep_thd_is_BF(trx->mysql_thd, FALSE) && // wsrep_thd_is_BF(other_lock->trx->mysql_thd, TRUE))); - if (other_lock && - wsrep_on(trx->mysql_thd) && + if (other_lock && trx->is_wsrep() && !wsrep_thd_is_BF(trx->mysql_thd, FALSE) && !wsrep_thd_is_BF(other_lock->trx->mysql_thd, TRUE)) { @@ -3656,7 +3653,7 @@ lock_table_create( UT_LIST_ADD_LAST(trx->lock.trx_locks, lock); #ifdef WITH_WSREP - if (c_lock && wsrep_on_trx(trx)) { + if (c_lock && trx->is_wsrep()) { if (wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { ut_list_insert(table->locks, c_lock, lock, TableLockGetNode()); @@ -3886,7 +3883,7 @@ lock_table_enqueue_waiting( } #ifdef WITH_WSREP - if (trx->lock.was_chosen_as_deadlock_victim && wsrep_on_trx(trx)) { + if (trx->is_wsrep() && trx->lock.was_chosen_as_deadlock_victim) { return(DB_DEADLOCK); } #endif /* WITH_WSREP */ @@ -3959,7 +3956,7 @@ lock_table_other_has_incompatible( && (wait || !lock_get_wait(lock))) { #ifdef WITH_WSREP - if (wsrep_on(lock->trx->mysql_thd)) { + if (lock->trx->is_wsrep()) { if (wsrep_debug) { ib::info() << "WSREP: table lock abort for table:" << table->name.m_name; @@ -5253,7 +5250,7 @@ lock_rec_queue_validate( explicit granted lock. */ #ifdef WITH_WSREP - if (wsrep_on(other_lock->trx->mysql_thd)) { + if (other_lock->trx->is_wsrep()) { if (!lock_get_wait(other_lock) ) { ib::info() << "WSREP impl BF lock conflict for my impl lock:\n BF:" << ((wsrep_thd_is_BF(impl_trx->mysql_thd, FALSE)) ? "BF" : "normal") << " exec: " << diff --git a/storage/innobase/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc index 947e56ebeee..5d0d41ef494 100644 --- a/storage/innobase/lock/lock0wait.cc +++ b/storage/innobase/lock/lock0wait.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2019, MariaDB Corporation. +Copyright (c) 2014, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -192,8 +192,7 @@ wsrep_is_BF_lock_timeout( const trx_t* trx, bool locked = true) { - if (wsrep_on_trx(trx) - && wsrep_thd_is_BF(trx->mysql_thd, FALSE) + if (trx->is_wsrep() && wsrep_thd_is_BF(trx->mysql_thd, FALSE) && trx->error_state != DB_DEADLOCK) { ib::info() << "WSREP: BF lock wait long for trx:" << ib::hex(trx->id) << " query: " << wsrep_thd_query(trx->mysql_thd); @@ -402,8 +401,9 @@ lock_wait_suspend_thread( if (lock_wait_timeout < 100000000 && wait_time > (double) lock_wait_timeout #ifdef WITH_WSREP - && (!wsrep_on_trx(trx) || - (!wsrep_is_BF_lock_timeout(trx, false) && trx->error_state != DB_DEADLOCK)) + && (!trx->is_wsrep() + || (!wsrep_is_BF_lock_timeout(trx, false) + && trx->error_state != DB_DEADLOCK)) #endif /* WITH_WSREP */ ) { diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index c4410f15b84..5b7faa4888a 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2019, 2020 MariaDB Corporation. +Copyright (c) 2016, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1779,7 +1779,7 @@ row_ins_check_foreign_constraint( if (check_ref) { err = DB_SUCCESS; #ifdef WITH_WSREP - if (!wsrep_on(trx->mysql_thd)) { + if (!trx->is_wsrep()) { goto end_scan; } enum wsrep_key_type key_type; diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 943e31d99fe..31d4d31c1f9 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -464,7 +464,7 @@ func_exit: inline bool wsrep_must_process_fk(const upd_node_t* node, const trx_t* trx) { - if (!wsrep_on_trx(trx)) { + if (!trx->is_wsrep()) { return false; } return que_node_get_type(node->common.parent) != QUE_NODE_UPDATE diff --git a/storage/innobase/srv/srv0conc.cc b/storage/innobase/srv/srv0conc.cc index 347e604479a..9936635a055 100644 --- a/storage/innobase/srv/srv0conc.cc +++ b/storage/innobase/srv/srv0conc.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2018, MariaDB Corporation. +Copyright (c) 2015, 2020, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -122,8 +122,7 @@ srv_conc_enter_innodb_with_atomics( for (;;) { ulint sleep_in_us; #ifdef WITH_WSREP - if (wsrep_on(trx->mysql_thd) && - wsrep_trx_is_aborting(trx->mysql_thd)) { + if (trx->is_wsrep() && wsrep_trx_is_aborting(trx->mysql_thd)) { if (wsrep_debug) { ib::info() << "srv_conc_enter due to MUST_ABORT"; diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 458165a3816..80de62b8b28 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2019, MariaDB Corporation. +Copyright (c) 2015, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -102,6 +102,9 @@ trx_init( trx->state = TRX_STATE_NOT_STARTED; trx->is_recovered = false; +#ifdef WITH_WSREP + trx->wsrep = false; +#endif /* WITH_WSREP */ trx->op_info = ""; @@ -1814,12 +1817,7 @@ trx_commit_in_memory( trx_mutex_enter(trx); trx->dict_operation = TRX_DICT_OP_NONE; - -#ifdef WITH_WSREP - if (trx->mysql_thd && wsrep_on(trx->mysql_thd)) { - trx->lock.was_chosen_as_deadlock_victim = FALSE; - } -#endif + trx->lock.was_chosen_as_deadlock_victim = false; DBUG_LOG("trx", "Commit in memory: " << trx); trx->state = TRX_STATE_NOT_STARTED; |