mirror of
https://github.com/MariaDB/server.git
synced 2025-02-09 23:24:11 +01:00
![Denis Protivensky](/assets/img/avatar_default.png)
It's possible that MDL conflict handling code is called more than once for a transaction when: - it holds more than one conflicting MDL lock - reschedule_waiters() is executed, which results in repeated attempts to BF-abort already aborted transaction. In such situations, it might be that BF-aborting logic sees a partially rolled back transaction and erroneously decides on future actions for such a transaction. The specific situation tested and fixed is when a SR transaction applied in the node gets BF-aborted by a started TOI operation. It's then caught with the server transaction already rolled back, but with no MDL locks yet released. This caused wrong state detection for such a transaction during repeated MDL conflict handling code execution. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
34 lines
1.1 KiB
Text
34 lines
1.1 KiB
Text
connection node_2;
|
|
connection node_1;
|
|
connect node_1a,127.0.0.1,root,,test,$NODE_MYPORT_1;
|
|
connection node_1;
|
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
|
|
SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_rollback_mdl_release';
|
|
connection node_2;
|
|
SET SESSION wsrep_trx_fragment_size = 1;
|
|
START TRANSACTION;
|
|
INSERT INTO t1 VALUES (1);
|
|
connection node_1a;
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
0
|
|
SET SESSION wsrep_retry_autocommit = 0;
|
|
SET DEBUG_SYNC = 'ha_write_row_start SIGNAL may_toi WAIT_FOR bf_abort';
|
|
INSERT INTO t1 VALUES (2);
|
|
connection node_1;
|
|
SET DEBUG_SYNC = 'now WAIT_FOR may_toi';
|
|
SET DEBUG_SYNC = 'after_wsrep_thd_abort WAIT_FOR sync.wsrep_rollback_mdl_release_reached';
|
|
TRUNCATE TABLE t1;
|
|
connection node_1a;
|
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
|
SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_rollback_mdl_release';
|
|
connection node_2;
|
|
INSERT INTO t1 VALUES (3);
|
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
|
connection node_1;
|
|
SET GLOBAL DEBUG_DBUG = '';
|
|
SET DEBUG_SYNC = 'RESET';
|
|
DROP TABLE t1;
|
|
disconnect node_1a;
|
|
disconnect node_2;
|
|
disconnect node_1;
|