mariadb/mysql-test/suite/galera/t/MDEV-33064.test
Denis Protivensky cfbd57dfb7 MDEV-33064: Sync trx->wsrep state from THD on trx start
InnoDB transactions may be reused after committed:
- when taken from the transaction pool
- during a DDL operation execution

In this case wsrep flag on trx object is cleared, which may cause wrong
execution logic afterwards (wsrep-related hooks are not run).

Make trx->wsrep flag initialize from THD object only once on InnoDB transaction
start and don't change it throughout the transaction's lifetime.
The flag is reset at commit time as before.

Unconditionally set wsrep=OFF for THD objects that represent InnoDB background
threads.

Make Wsrep_schema::store_view() operate in its own transaction.

Fix streaming replication transactions' fragments rollback to not switch
THD->wsrep value during transaction's execution
(use THD->wsrep_ignore_table as a workaround).

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2024-07-01 13:07:39 +02:00

57 lines
1.7 KiB
Text

#
# MDEV-33064: ALTER INPLACE running TOI should abort a conflicting DML operation
#
# DDL operations may commit InnoDB transactions more than once during the execution.
# In this case wsrep flag on trx object is cleared, which may cause wrong logic of
# such operations afterwards (wsrep-related hooks are not run).
# One of the consequences was that DDL operation couldn't abort a DML operation
# holding conflicting locks.
#
# The fix: re-enable wsrep flag on trx restart if it's a part of a DDL operation.
#
--source include/galera_cluster.inc
--source include/have_debug_sync.inc
--source include/have_debug.inc
--connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1
CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t1_fk(c1 INT PRIMARY KEY, c2 INT, INDEX (c2), FOREIGN KEY (c2) REFERENCES t1(c1)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
--connection con1
SET SESSION wsrep_retry_autocommit = 0;
SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL may_alter WAIT_FOR bf_abort';
# INSERT also grabs FK-referenced table lock.
--send
INSERT INTO t1_fk VALUES (1, 1);
--connection node_1
SET DEBUG_SYNC = 'now WAIT_FOR may_alter';
SET DEBUG_SYNC = 'lock_wait_end WAIT_FOR alter_continue';
# ALTER BF-aborts INSERT.
--send
ALTER TABLE t1 ADD COLUMN c2 INT, ALGORITHM=INPLACE;
--connection con1
# INSERT gets BF-aborted.
--error ER_LOCK_DEADLOCK
--reap
SET DEBUG_SYNC = 'now SIGNAL alter_continue';
--connection node_1
# ALTER succeeds.
--reap
--connection node_2
# Sanity check that ALTER has been replicated.
INSERT INTO t1 (c1, c2) VALUES (2, 2);
# Cleanup.
--connection node_1
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1_fk, t1;
--disconnect con1
--source include/galera_end.inc