Commit 8e9e1c39 authored by sjaakola's avatar sjaakola Committed by Jan Lindström

MDEV-27649 Crash with PS execute after BF abort

This commit contains a test for reproducing the issue in MDEV-27649,
where a transaction, executing a prepared statment, is BF aborted.
The scenario, in MDEV-27649  has a transaction which has prepared a PS,
but not yet executed it, and this transaction is then BF aborted in this state.
When the BF aborted transaction tries to execute the PS, it will receive deadlock error.
But, when it tries to execute the PS second time, the node crashes.

Mtr test galera.galera_bf_abort_ps_bind, exercises this scenario.

However, mtr test platform does not have mechanism to control the execution of PS in required detail.
For this purpose, mysqltetst.cc was extended to contain 4 new commands:
PS_prepare   - to prepare a prepared statement
PS_bind      - to bind values for parameters for the PS
PS_execute   - to execute the PS
PS_close     - to close the PS

The support for controlling prepared statments in mtr scripts is quite minimal
in this commit. Limitations are:
* only one PS can be used by a connection, at a time
* only input parameters can be bound for the PS
* only varchar, integer or float type of parameters can be bound

added the result

fixes
Reviewed-by: default avatarJan Lindström <jan.lindstrom@mariadb.com>
parent 069139a5
This diff is collapsed.
connection node_2;
connection node_1;
CREATE TABLE t (i int primary key auto_increment, j varchar(20) character set utf8);
connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1;
connection node_1a;
SET SESSION wsrep_sync_wait = 0;
connection node_1;
insert into t values (1, 'first');
PS_prepare INSERT INTO t(j) VALUES (?);;
PS_bind node1;
PS_execute;
PS_execute;
select * from t;
i j
1 first
3 node1
5 node1
PS_close;
PS_prepare INSERT INTO t(j) VALUES (?);;
PS_bind node1;
begin;
update t set j='node1' where i=1;
connection node_2;
update t set j='node2' where i=1;
connection node_1a;
connection node_1;
PS_execute;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
PS_execute;
commit;
select * from t;
i j
1 node2
3 node1
5 node1
7 node1
drop table t;
!include ../galera_2nodes.cnf
[mysqld.1]
wsrep-debug=1
[mysqld.2]
wsrep-debug=1
--source include/galera_cluster.inc
--source include/have_innodb.inc
CREATE TABLE t (i int primary key auto_increment, j varchar(20) character set utf8);
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1a
SET SESSION wsrep_sync_wait = 0;
--connection node_1
insert into t values (1, 'first');
# prepare a statement for inserting rows into table t
--PS_prepare INSERT INTO t(j) VALUES (?);
# bind parameter, to insert with column j having value 'node1'
--PS_bind node1
# insert two rows with the PS
# this is for showing that two execute commands can follow a bind command
--PS_execute
--PS_execute
select * from t;
# close the prepared statement, and prepare a new PS,
# this happens to be same as the first PS
# also bind parameter for the PS
--PS_close
--PS_prepare INSERT INTO t(j) VALUES (?);
--PS_bind node1
# start a transaction and make one update
# leaving the transaction open
begin;
update t set j='node1' where i=1;
# replicate a transaction from node2, which BF aborts the open
# transaction in node1
--connection node_2
update t set j='node2' where i=1;
# wait until the BF has completed, and update from node_2 has committed
--connection node_1a
--let $wait_condition = SELECT COUNT(*) = 1 FROM t WHERE j='node2'
--source include/wait_condition.inc
# continue the open transaction, trying to insert third row, deadlock is now observed
--connection node_1
--error ER_LOCK_DEADLOCK
--PS_execute
# try to insert one more row
--PS_execute
commit;
select * from t;
drop table t;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment