diff options
Diffstat (limited to 'storage/innobase/handler/ha_innodb.cc')
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 0b0c3b045ff..6729e7e1747 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -3185,6 +3185,7 @@ the query cache. @param[in] table table object @param[in] trx transaction object @return whether the storing or retrieving from the query cache is permitted */ +TRANSACTIONAL_TARGET static bool innobase_query_caching_table_check_low( dict_table_t* table, trx_t* trx) { @@ -3211,6 +3212,16 @@ static bool innobase_query_caching_table_check_low( return false; } +#if !defined NO_ELISION && !defined SUX_LOCK_GENERIC + if (xbegin()) { + if (table->lock_mutex_is_locked()) + xabort(); + auto len = UT_LIST_GET_LEN(table->locks); + xend(); + return len == 0; + } +#endif + table->lock_mutex_lock(); auto len= UT_LIST_GET_LEN(table->locks); table->lock_mutex_unlock(); @@ -18562,7 +18573,9 @@ void lock_wait_wsrep_kill(trx_t *bf_trx, ulong thd_id, trx_id_t trx_id) trx_t *vtrx= thd_to_trx(vthd); if (vtrx) { - lock_sys.wr_lock(SRW_LOCK_CALL); + /* Do not bother with lock elision using transactional memory here; + this is rather complex code */ + LockMutexGuard g{SRW_LOCK_CALL}; mysql_mutex_lock(&lock_sys.wait_mutex); vtrx->mutex_lock(); /* victim transaction is either active or prepared, if it has already @@ -18607,7 +18620,6 @@ void lock_wait_wsrep_kill(trx_t *bf_trx, ulong thd_id, trx_id_t trx_id) WSREP_DEBUG("kill transaction skipped due to wsrep_aborter set"); } } - lock_sys.wr_unlock(); mysql_mutex_unlock(&lock_sys.wait_mutex); vtrx->mutex_unlock(); } |