MDEV-21718 Assertion in wsrep::client_state::before_command().
An assertion `server_state_.rollback_mode() == wsrep::server_state::rm_async` fired in before_command() when - thread-handling was set to pool-of-threads and - a BF abort happened between client session calls to wait_rollback_complete_and_acquire_ownership() and before_command(). This commit introduces a test case to reproduce the crash and updates wsrep-lib submodule to fixed version.
This commit is contained in:
parent
134a6a8d2f
commit
1e2a4ed7ed
16
mysql-test/suite/galera/r/mdev_21718.result
Normal file
16
mysql-test/suite/galera/r/mdev_21718.result
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
connection node_2;
|
||||||
|
connection node_1;
|
||||||
|
CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
connection node_1;
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL reached WAIT_FOR continue";
|
||||||
|
COMMIT;
|
||||||
|
connection node_1_ctrl;
|
||||||
|
SET DEBUG_SYNC = "now WAIT_FOR reached";
|
||||||
|
connection node_2;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
connection node_1;
|
||||||
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET DEBUG_SYNC = "RESET";
|
4
mysql-test/suite/galera/t/mdev_21718.cnf
Normal file
4
mysql-test/suite/galera/t/mdev_21718.cnf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
!include ../galera_2nodes.cnf
|
||||||
|
|
||||||
|
[mysqld]
|
||||||
|
thread-handling=pool-of-threads
|
33
mysql-test/suite/galera/t/mdev_21718.test
Normal file
33
mysql-test/suite/galera/t/mdev_21718.test
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#
|
||||||
|
# MDEV-21718 Reproduce a case where BF abort after
|
||||||
|
# client session acquires the ownership but before calls
|
||||||
|
# before_command() causes an assertion in wsrep-lib.
|
||||||
|
#
|
||||||
|
--source include/galera_cluster.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
--let $galera_connection_name = node_1_ctrl
|
||||||
|
--let $galera_server_number = 1
|
||||||
|
--source include/galera_connect.inc
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
START TRANSACTION;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL reached WAIT_FOR continue";
|
||||||
|
--send COMMIT
|
||||||
|
|
||||||
|
--connection node_1_ctrl
|
||||||
|
SET DEBUG_SYNC = "now WAIT_FOR reached";
|
||||||
|
|
||||||
|
--connection node_2
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
# BF abort wakes up node_1 from sync wait.
|
||||||
|
--connection node_1
|
||||||
|
--error ER_LOCK_DEADLOCK
|
||||||
|
--reap
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET DEBUG_SYNC = "RESET";
|
@ -1280,6 +1280,7 @@ bool do_command(THD *thd)
|
|||||||
command= fetch_command(thd, packet);
|
command= fetch_command(thd, packet);
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
|
DEBUG_SYNC(thd, "wsrep_before_before_command");
|
||||||
/*
|
/*
|
||||||
Aborted by background rollbacker thread.
|
Aborted by background rollbacker thread.
|
||||||
Handle error here and jump straight to out
|
Handle error here and jump straight to out
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 8ba574f7bf19bdc0de18e2225068c5a3f2dcdea4
|
Subproject commit 3e5a28df32c85c7768dd84d1731ad4661bf90022
|
Loading…
x
Reference in New Issue
Block a user