mirror of
https://github.com/MariaDB/server.git
synced 2025-12-06 05:42:06 +03:00
MDEV-22494 : Galera assertion lock_sys.mutex.is_owned() at lock_trx_handle_wait_low
Problem was that trx->lock.was_chosen_as_wsrep_victim variable was not set back to false after it was set true. wsrep_thd_bf_abort Add assertions for correct mutex status and take necessary mutexes before calling thd->awake_no_mutex(). innobase_rollback_trx() Reset trx->lock.was_chosen_as_wsrep_victim wsrep_abort_slave_trx() Removed unused function. wsrep_innobase_kill_one_trx() Added function comment, removed unnecessary parameters and added debug assertions to enforce correct usage. Added more debug output to help out on error analysis. wsrep_abort_transaction() Added debug assertions and removed unused variables. trx0trx.h Removed assert_trx_is_free macro and replaced it with assert_freed() member function. trx_create() Use above assert_free() and initialize wsrep variables. trx_free() Use assert_free() trx_t::commit_in_memory() Reset lock.was_chosen_as_wsrep_victim trx_rollback_for_mysql() Reset trx->lock.was_chosen_as_wsrep_victim Add test case galera_bf_kill
This commit is contained in:
72
mysql-test/suite/galera/r/galera_bf_kill.result
Normal file
72
mysql-test/suite/galera/r/galera_bf_kill.result
Normal file
@@ -0,0 +1,72 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
connection node_2;
|
||||
CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB;
|
||||
insert into t1 values (NULL,1);
|
||||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
begin;
|
||||
update t1 set a = 5;
|
||||
connection node_2;
|
||||
select * from t1;
|
||||
a b
|
||||
2 1
|
||||
disconnect node_2a;
|
||||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
begin;
|
||||
update t1 set a =5;
|
||||
connection node_2;
|
||||
select * from t1;
|
||||
a b
|
||||
2 1
|
||||
disconnect node_2a;
|
||||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
connection node_2;
|
||||
ALTER TABLE t1 ADD UNIQUE KEY b1(b);
|
||||
ALTER TABLE t1 DROP KEY b1;
|
||||
select * from t1;
|
||||
a b
|
||||
2 1
|
||||
disconnect node_2a;
|
||||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2b;
|
||||
begin;
|
||||
update t1 set a =6, b=7;
|
||||
connection node_2;
|
||||
ALTER TABLE t1 ADD UNIQUE KEY b2(b);
|
||||
ALTER TABLE t1 DROP KEY b2;
|
||||
select * from t1;
|
||||
a b
|
||||
2 1
|
||||
disconnect node_2a;
|
||||
disconnect node_2b;
|
||||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
SET SESSION wsrep_on=OFF;
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
connection node_2;
|
||||
ALTER TABLE t1 ADD UNIQUE KEY b3(b);
|
||||
select * from t1;
|
||||
a b
|
||||
2 1
|
||||
disconnect node_2a;
|
||||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
SET SESSION wsrep_on=OFF;
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
connection node_2;
|
||||
select * from t1;
|
||||
a b
|
||||
2 1
|
||||
disconnect node_2a;
|
||||
drop table t1;
|
||||
@@ -1,5 +1,7 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
connection node_1;
|
||||
call mtr.add_suppression("WSREP: Trying to continue unpaused monitor");
|
||||
CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2;
|
||||
ALTER TABLE t1 add primary key(a);
|
||||
CREATE PROCEDURE p1()
|
||||
@@ -19,7 +21,7 @@ connect node_2_p1, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
call p1;
|
||||
connect node_2_p2, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
call p1;
|
||||
connection default;
|
||||
connection node_1;
|
||||
checking error log for 'BF lock wait long' message for 10 times every 10 seconds ...
|
||||
drop table t1;
|
||||
drop procedure p1;
|
||||
|
||||
7
mysql-test/suite/galera/t/galera_bf_kill.cnf
Normal file
7
mysql-test/suite/galera/t/galera_bf_kill.cnf
Normal file
@@ -0,0 +1,7 @@
|
||||
!include ../galera_2nodes.cnf
|
||||
|
||||
[mysqld.1]
|
||||
wsrep-debug=SERVER
|
||||
|
||||
[mysqld.2]
|
||||
wsrep-debug=SERVER
|
||||
143
mysql-test/suite/galera/t/galera_bf_kill.test
Normal file
143
mysql-test/suite/galera/t/galera_bf_kill.test
Normal file
@@ -0,0 +1,143 @@
|
||||
--source include/galera_cluster.inc
|
||||
|
||||
#
|
||||
# Test case 1: Start a transaction on node_2a and kill it
|
||||
# from other connection on same node
|
||||
#
|
||||
|
||||
--connection node_2
|
||||
CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB;
|
||||
insert into t1 values (NULL,1);
|
||||
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2a
|
||||
begin;
|
||||
update t1 set a = 5;
|
||||
|
||||
--connection node_2
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
|
||||
|
||||
--disable_query_log
|
||||
--eval KILL $k_thread
|
||||
--enable_query_log
|
||||
|
||||
select * from t1;
|
||||
--disconnect node_2a
|
||||
|
||||
#
|
||||
# Test case 2: Start a transaction on node_2a and use
|
||||
# kill query from other connection on same node
|
||||
#
|
||||
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2a
|
||||
begin;
|
||||
update t1 set a =5;
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
|
||||
|
||||
--disable_query_log
|
||||
--eval KILL QUERY $k_thread
|
||||
--enable_query_log
|
||||
|
||||
select * from t1;
|
||||
--disconnect node_2a
|
||||
#
|
||||
# Test case 3: Start a transaction on node_2a and start a DDL on other transaction
|
||||
# that will then abort node_2a transaction
|
||||
#
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2a
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
|
||||
--connection node_2
|
||||
ALTER TABLE t1 ADD UNIQUE KEY b1(b);
|
||||
ALTER TABLE t1 DROP KEY b1;
|
||||
|
||||
select * from t1;
|
||||
|
||||
--disconnect node_2a
|
||||
|
||||
#
|
||||
# Test case 4: Start a transaction on node_2a and conflicting transaction on node_2b
|
||||
# and start a DDL on other transaction that will then abort node_2a and node_2b
|
||||
# transactions
|
||||
#
|
||||
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2a
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
|
||||
--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2b
|
||||
begin;
|
||||
send update t1 set a =6, b=7;
|
||||
|
||||
--connection node_2
|
||||
ALTER TABLE t1 ADD UNIQUE KEY b2(b);
|
||||
ALTER TABLE t1 DROP KEY b2;
|
||||
|
||||
select * from t1;
|
||||
|
||||
--disconnect node_2a
|
||||
--disconnect node_2b
|
||||
|
||||
#
|
||||
# Test case 5: Start a transaction on node_2a with wsrep disabled
|
||||
# and start a DDL on other transaction that will then abort node_2a
|
||||
# transactions
|
||||
#
|
||||
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2a
|
||||
SET SESSION wsrep_on=OFF;
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
|
||||
--connection node_2
|
||||
ALTER TABLE t1 ADD UNIQUE KEY b3(b);
|
||||
|
||||
select * from t1;
|
||||
|
||||
--disconnect node_2a
|
||||
|
||||
#
|
||||
# Test case 6: Start a transaction on node_2a with wsrep disabled
|
||||
# and kill it from other connection on same node
|
||||
#
|
||||
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2a
|
||||
SET SESSION wsrep_on=OFF;
|
||||
begin;
|
||||
update t1 set a =5, b=2;
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
|
||||
|
||||
--disable_query_log
|
||||
--eval KILL $k_thread
|
||||
--enable_query_log
|
||||
|
||||
|
||||
select * from t1;
|
||||
|
||||
--disconnect node_2a
|
||||
|
||||
drop table t1;
|
||||
|
||||
|
||||
|
||||
7
mysql-test/suite/galera/t/galera_bf_lock_wait.cnf
Normal file
7
mysql-test/suite/galera/t/galera_bf_lock_wait.cnf
Normal file
@@ -0,0 +1,7 @@
|
||||
!include ../galera_2nodes.cnf
|
||||
|
||||
[mysqld.1]
|
||||
wsrep-debug=SERVER
|
||||
|
||||
[mysqld.2]
|
||||
wsrep-debug=SERVER
|
||||
@@ -1,6 +1,10 @@
|
||||
--source include/galera_cluster.inc
|
||||
--source include/big_test.inc
|
||||
|
||||
|
||||
--connection node_1
|
||||
|
||||
call mtr.add_suppression("WSREP: Trying to continue unpaused monitor");
|
||||
|
||||
CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2;
|
||||
ALTER TABLE t1 add primary key(a);
|
||||
|
||||
@@ -28,7 +32,7 @@ send call p1;
|
||||
--connect node_2_p2, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
send call p1;
|
||||
|
||||
connection default;
|
||||
connection node_1;
|
||||
let $counter=10;
|
||||
let $sleep_period=10;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user