mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Bug#16513588:"PREPARE_COMMIT_MUTEX" IS NOT FREED DURING
TRANSACTION ROLLBACK Problem: ======= "prepare_commit_mutex" is acquired during "innobase_xa_prepare" and it is freed only in "innobase_commit". After prepare, if the commit operation fails the transaction is rolled back but the mutex is not released. Analysis: ======== During transaction commit process transaction is prepared and the "prepare_commit_mutex" is acquired to preserve the order of commit. After prepare write to binlog is initiated. File: sql/handler.cc if (error || (is_real_trans && xid && -----> (error= !(cookie= tc_log->log_xid(thd, xid))))) { ha_rollback_trans(thd, all); In the above code "tc_log->log_xid" operation fails. When the write to binlog fails the transaction is rolled back with out freeing the mutex. A subsequent "INSERT" operation tries to acquire the same mutex during its commit process and the server aborts. Fix: === "prepare_commit_mutex" is freed during "innobase_rollback".
This commit is contained in:
parent
78a9e05080
commit
627e7334ec
1 changed files with 3 additions and 0 deletions
|
@ -2881,6 +2881,9 @@ innobase_rollback(
|
|||
|| !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) {
|
||||
|
||||
error = trx_rollback_for_mysql(trx);
|
||||
if (trx_has_prepare_commit_mutex(trx)) {
|
||||
mysql_mutex_unlock(&prepare_commit_mutex);
|
||||
}
|
||||
trx_deregister_from_2pc(trx);
|
||||
} else {
|
||||
error = trx_rollback_last_sql_stat_for_mysql(trx);
|
||||
|
|
Loading…
Reference in a new issue