Commit 1e2a4ed7 authored by Teemu Ollakka's avatar Teemu Ollakka Committed by Jan Lindström

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.
parent 134a6a8d
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";
!include ../galera_2nodes.cnf
[mysqld]
thread-handling=pool-of-threads
#
# 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) ...@@ -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
......
Subproject commit 8ba574f7bf19bdc0de18e2225068c5a3f2dcdea4 Subproject commit 3e5a28df32c85c7768dd84d1731ad4661bf90022
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