mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-5262, MDEV-5914, MDEV-5941, MDEV-6020: Deadlocks during parallel replication causing replication to fail.
Merge the patches into MariaDB 10.0 main. With this patch, parallel replication will now automatically retry a transaction that fails due to deadlock or other temporary error, same as single-threaded replication. We catch deadlocks with InnoDB transactions due to enforced commit order. If T1 must commit before T2 in parallel replication and T1 ends up waiting for T2 inside InnoDB, we kill T2 and retry it later to resolve the deadlock automatically.
This commit is contained in:
@ -86,7 +86,10 @@ SET DEBUG_SYNC= 'now SIGNAL killed';
|
||||
# Reaping: OPTIMIZE TABLE t1
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||
test.t1 optimize error Query execution was interrupted
|
||||
test.t1 optimize status Operation failed
|
||||
Warnings:
|
||||
Error 1317 Query execution was interrupted
|
||||
# Connection default
|
||||
DROP TABLE t1;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
BIN
mysql-test/std_data/mdev6020-mysql-bin.000001
Normal file
BIN
mysql-test/std_data/mdev6020-mysql-bin.000001
Normal file
Binary file not shown.
49
mysql-test/suite/rpl/r/rpl_mdev6020.result
Normal file
49
mysql-test/suite/rpl/r/rpl_mdev6020.result
Normal file
@ -0,0 +1,49 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
include/stop_slave.inc
|
||||
include/rpl_stop_server.inc [server_number=1]
|
||||
include/rpl_start_server.inc [server_number=1]
|
||||
SET SQL_LOG_BIN=0;
|
||||
ALTER TABLE mysql.gtid_slave_pos ENGINE = InnoDB;
|
||||
SET SQL_LOG_BIN=1;
|
||||
SET @old_engine= @@GLOBAL.default_storage_engine;
|
||||
SET GLOBAL default_storage_engine=InnoDB;
|
||||
SET @old_parallel= @@GLOBAL.slave_parallel_threads;
|
||||
SET GLOBAL slave_parallel_threads=12;
|
||||
CHANGE MASTER TO master_host='127.0.0.1', master_port=SERVER_MYPORT_1, master_user='root', master_log_file='master-bin.000001', master_log_pos=4;
|
||||
include/start_slave.inc
|
||||
SET SQL_LOG_BIN=0;
|
||||
ALTER TABLE mysql.gtid_slave_pos ENGINE = InnoDB;
|
||||
SET SQL_LOG_BIN=1;
|
||||
SELECT @@gtid_slave_pos;
|
||||
@@gtid_slave_pos
|
||||
0-1-1381
|
||||
CHECKSUM TABLE table0_int_autoinc, table0_key_pk_parts_2_int_autoinc, table100_int_autoinc, table100_key_pk_parts_2_int_autoinc, table10_int_autoinc, table10_key_pk_parts_2_int_autoinc, table1_int_autoinc, table1_key_pk_parts_2_int_autoinc, table2_int_autoinc, table2_key_pk_parts_2_int_autoinc;
|
||||
Table Checksum
|
||||
test.table0_int_autoinc 3623174395
|
||||
test.table0_key_pk_parts_2_int_autoinc 2888328157
|
||||
test.table100_int_autoinc 3624823809
|
||||
test.table100_key_pk_parts_2_int_autoinc 3316583308
|
||||
test.table10_int_autoinc 1615053718
|
||||
test.table10_key_pk_parts_2_int_autoinc 4147461080
|
||||
test.table1_int_autoinc 478809705
|
||||
test.table1_key_pk_parts_2_int_autoinc 3032208641
|
||||
test.table2_int_autoinc 854763867
|
||||
test.table2_key_pk_parts_2_int_autoinc 4231615291
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL default_storage_engine= @old_engine;
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel;
|
||||
SET sql_log_bin=0;
|
||||
DROP TABLE table0_int_autoinc;
|
||||
DROP TABLE table0_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table100_int_autoinc;
|
||||
DROP TABLE table100_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table10_int_autoinc;
|
||||
DROP TABLE table10_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table1_int_autoinc;
|
||||
DROP TABLE table1_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table2_int_autoinc;
|
||||
DROP TABLE table2_key_pk_parts_2_int_autoinc;
|
||||
SET sql_log_bin=1;
|
||||
include/start_slave.inc
|
||||
include/rpl_end.inc
|
@ -314,7 +314,7 @@ SET debug_sync='now WAIT_FOR t1_ready';
|
||||
KILL THD_ID;
|
||||
SET debug_sync='now WAIT_FOR t2_killed';
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1964]
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1927,1964]
|
||||
STOP SLAVE IO_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 30 ORDER BY a;
|
||||
a b
|
||||
@ -398,7 +398,7 @@ SET debug_sync='now WAIT_FOR t1_ready';
|
||||
KILL THD_ID;
|
||||
SET debug_sync='now WAIT_FOR t2_killed';
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1964]
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1927,1964]
|
||||
SET debug_sync='RESET';
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
@ -481,7 +481,7 @@ SET debug_sync='now WAIT_FOR t1_ready';
|
||||
KILL THD_ID;
|
||||
SET debug_sync='now WAIT_FOR t2_killed';
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1964]
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1927,1964]
|
||||
SELECT * FROM t3 WHERE a >= 50 ORDER BY a;
|
||||
a b
|
||||
51 51
|
||||
@ -819,11 +819,37 @@ test_check
|
||||
OK
|
||||
test_check
|
||||
OK
|
||||
*** MDEV_6435: Incorrect error handling when query binlogged partially on master with "killed" error ***
|
||||
CREATE TABLE t6 (a INT) ENGINE=MyISAM;
|
||||
CREATE TRIGGER tr AFTER INSERT ON t6 FOR EACH ROW SET @a = 1;
|
||||
SET @old_format= @@binlog_format;
|
||||
SET binlog_format= statement;
|
||||
SET debug_sync='sp_head_execute_before_loop SIGNAL ready WAIT_FOR cont';
|
||||
INSERT INTO t6 VALUES (1), (2), (3);
|
||||
SET debug_sync='now WAIT_FOR ready';
|
||||
KILL QUERY CONID;
|
||||
SET debug_sync='now SIGNAL cont';
|
||||
ERROR 70100: Query execution was interrupted
|
||||
SET binlog_format= @old_format;
|
||||
SET debug_sync='RESET';
|
||||
SET debug_sync='RESET';
|
||||
include/wait_for_slave_sql_error.inc [errno=1317]
|
||||
STOP SLAVE IO_THREAD;
|
||||
SET GLOBAL gtid_slave_pos= 'AFTER_ERROR_GTID_POS';
|
||||
include/start_slave.inc
|
||||
INSERT INTO t6 VALUES (4);
|
||||
SELECT * FROM t6 ORDER BY a;
|
||||
a
|
||||
1
|
||||
4
|
||||
SELECT * FROM t6 ORDER BY a;
|
||||
a
|
||||
4
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
include/start_slave.inc
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
DROP function foo;
|
||||
DROP TABLE t1,t2,t3,t4,t5;
|
||||
DROP TABLE t1,t2,t3,t4,t5,t6;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
include/rpl_end.inc
|
||||
|
196
mysql-test/suite/rpl/r/rpl_parallel_retry.result
Normal file
196
mysql-test/suite/rpl/r/rpl_parallel_retry.result
Normal file
@ -0,0 +1,196 @@
|
||||
include/rpl_init.inc [topology=1->2]
|
||||
*** Test retry of transactions that fail to replicate due to deadlock or similar temporary error. ***
|
||||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||
CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1,1);
|
||||
SET sql_log_bin=0;
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
SET sql_log_bin=1;
|
||||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=5;
|
||||
include/start_slave.inc
|
||||
SET sql_log_bin=0;
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
IF d1 != '' THEN
|
||||
SET debug_sync = d1;
|
||||
END IF;
|
||||
IF d2 != '' THEN
|
||||
SET debug_sync = d2;
|
||||
END IF;
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
SET sql_log_bin=1;
|
||||
include/stop_slave.inc
|
||||
SET gtid_seq_no = 100;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (2,1);
|
||||
UPDATE t1 SET b=b+1 WHERE a=1;
|
||||
INSERT INTO t1 VALUES (3,1);
|
||||
COMMIT;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 2
|
||||
2 1
|
||||
3 1
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100";
|
||||
include/start_slave.inc
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
retries
|
||||
1
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 2
|
||||
2 1
|
||||
3 1
|
||||
*** Test that double retry works when the first retry also fails with temp error ***
|
||||
include/stop_slave.inc
|
||||
SET gtid_seq_no = 100;
|
||||
SET @old_server_id = @@server_id;
|
||||
SET server_id = 10;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (4,1);
|
||||
UPDATE t1 SET b=b+1 WHERE a=1;
|
||||
INSERT INTO t1 VALUES (5,1);
|
||||
INSERT INTO t1 VALUES (6,1);
|
||||
COMMIT;
|
||||
SET server_id = @old_server_id;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 3
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
5 1
|
||||
6 1
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100,rpl_parallel_simulate_double_temp_err_gtid_0_x_100";
|
||||
include/start_slave.inc
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
retries
|
||||
2
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 3
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
5 1
|
||||
6 1
|
||||
*** Test too many retries, eventually causing failure. ***
|
||||
include/stop_slave.inc
|
||||
SET gtid_seq_no = 100;
|
||||
SET @old_server_id = @@server_id;
|
||||
SET server_id = 11;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (7,1);
|
||||
UPDATE t1 SET b=b+1 WHERE a=1;
|
||||
INSERT INTO t1 VALUES (8,1);
|
||||
INSERT INTO t1 VALUES (9,1);
|
||||
COMMIT;
|
||||
SET server_id = @old_server_id;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 4
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
5 1
|
||||
6 1
|
||||
7 1
|
||||
8 1
|
||||
9 1
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("Slave worker thread retried transaction 10 time\\(s\\) in vain, giving up");
|
||||
CALL mtr.add_suppression("Slave: Deadlock found when trying to get lock; try restarting transaction");
|
||||
SET sql_log_bin=1;
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100,rpl_parallel_simulate_infinite_temp_err_gtid_0_x_100";
|
||||
START SLAVE;
|
||||
include/wait_for_slave_sql_error.inc [errno=1213]
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
retries
|
||||
10
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 3
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
5 1
|
||||
6 1
|
||||
STOP SLAVE IO_THREAD;
|
||||
include/start_slave.inc
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 4
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
5 1
|
||||
6 1
|
||||
7 1
|
||||
8 1
|
||||
9 1
|
||||
*** Test retry of event group that spans multiple relay log files. ***
|
||||
CREATE TABLE t2 (a int PRIMARY KEY, b BLOB) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1,"Hulubullu");
|
||||
include/stop_slave.inc
|
||||
SET @old_max= @@GLOBAL.max_relay_log_size;
|
||||
SET GLOBAL max_relay_log_size=4096;
|
||||
SET gtid_seq_no = 100;
|
||||
SET @old_server_id = @@server_id;
|
||||
SET server_id = 12;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (10, 4);
|
||||
COMMIT;
|
||||
SET server_id = @old_server_id;
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
a b
|
||||
10 4
|
||||
SELECT a, LENGTH(b) FROM t2 ORDER BY a;
|
||||
a LENGTH(b)
|
||||
1 9
|
||||
2 5006
|
||||
3 5012
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100";
|
||||
include/start_slave.inc
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
retries
|
||||
1
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
a b
|
||||
10 4
|
||||
SELECT a, LENGTH(b) FROM t2 ORDER BY a;
|
||||
a LENGTH(b)
|
||||
1 9
|
||||
2 5006
|
||||
3 5012
|
||||
INSERT INTO t1 VALUES (11,11);
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
a b
|
||||
10 4
|
||||
11 11
|
||||
SELECT a, LENGTH(b) FROM t2 ORDER BY a;
|
||||
a LENGTH(b)
|
||||
1 9
|
||||
2 5006
|
||||
3 5012
|
||||
4 5000
|
||||
SET GLOBAL max_relay_log_size=@old_max;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
include/start_slave.inc
|
||||
DROP TABLE t1, t2;
|
||||
DROP function foo;
|
||||
include/rpl_end.inc
|
70
mysql-test/suite/rpl/t/rpl_mdev6020.test
Normal file
70
mysql-test/suite/rpl/t/rpl_mdev6020.test
Normal file
@ -0,0 +1,70 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_partition.inc
|
||||
--source include/have_binlog_format_mixed_or_row.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection master
|
||||
--let $datadir= `SELECT @@datadir`
|
||||
|
||||
--let $rpl_server_number= 1
|
||||
--source include/rpl_stop_server.inc
|
||||
|
||||
--remove_file $datadir/master-bin.000001
|
||||
--remove_file $datadir/master-bin.state
|
||||
--copy_file $MYSQL_TEST_DIR/std_data/mdev6020-mysql-bin.000001 $datadir/master-bin.000001
|
||||
|
||||
--let $rpl_server_number= 1
|
||||
--source include/rpl_start_server.inc
|
||||
|
||||
--source include/wait_until_connected_again.inc
|
||||
|
||||
--connection slave
|
||||
SET SQL_LOG_BIN=0;
|
||||
ALTER TABLE mysql.gtid_slave_pos ENGINE = InnoDB;
|
||||
SET SQL_LOG_BIN=1;
|
||||
SET @old_engine= @@GLOBAL.default_storage_engine;
|
||||
SET GLOBAL default_storage_engine=InnoDB;
|
||||
SET @old_parallel= @@GLOBAL.slave_parallel_threads;
|
||||
SET GLOBAL slave_parallel_threads=12;
|
||||
--replace_result $SERVER_MYPORT_1 SERVER_MYPORT_1
|
||||
eval CHANGE MASTER TO master_host='127.0.0.1', master_port=$SERVER_MYPORT_1, master_user='root', master_log_file='master-bin.000001', master_log_pos=4;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
SET SQL_LOG_BIN=0;
|
||||
ALTER TABLE mysql.gtid_slave_pos ENGINE = InnoDB;
|
||||
SET SQL_LOG_BIN=1;
|
||||
--save_master_pos
|
||||
|
||||
--connection slave
|
||||
--sync_with_master
|
||||
|
||||
SELECT @@gtid_slave_pos;
|
||||
CHECKSUM TABLE table0_int_autoinc, table0_key_pk_parts_2_int_autoinc, table100_int_autoinc, table100_key_pk_parts_2_int_autoinc, table10_int_autoinc, table10_key_pk_parts_2_int_autoinc, table1_int_autoinc, table1_key_pk_parts_2_int_autoinc, table2_int_autoinc, table2_key_pk_parts_2_int_autoinc;
|
||||
|
||||
--source include/stop_slave.inc
|
||||
|
||||
|
||||
SET GLOBAL default_storage_engine= @old_engine;
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel;
|
||||
SET sql_log_bin=0;
|
||||
DROP TABLE table0_int_autoinc;
|
||||
DROP TABLE table0_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table100_int_autoinc;
|
||||
DROP TABLE table100_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table10_int_autoinc;
|
||||
DROP TABLE table10_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table1_int_autoinc;
|
||||
DROP TABLE table1_key_pk_parts_2_int_autoinc;
|
||||
DROP TABLE table2_int_autoinc;
|
||||
DROP TABLE table2_key_pk_parts_2_int_autoinc;
|
||||
SET sql_log_bin=1;
|
||||
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
|
||||
--source include/rpl_end.inc
|
@ -438,7 +438,7 @@ SET debug_sync='now WAIT_FOR t2_killed';
|
||||
# Now we can allow T1 to proceed.
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
|
||||
--let $slave_sql_errno= 1317,1964
|
||||
--let $slave_sql_errno= 1317,1927,1964
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
STOP SLAVE IO_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 30 ORDER BY a;
|
||||
@ -573,7 +573,7 @@ SET debug_sync='now WAIT_FOR t2_killed';
|
||||
# Now we can allow T1 to proceed.
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
|
||||
--let $slave_sql_errno= 1317,1964
|
||||
--let $slave_sql_errno= 1317,1927,1964
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
|
||||
# Now we have to disable the debug_sync statements, so they do not trigger
|
||||
@ -712,7 +712,7 @@ SET debug_sync='now WAIT_FOR t2_killed';
|
||||
# Now we can allow T1 to proceed.
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
|
||||
--let $slave_sql_errno= 1317,1964
|
||||
--let $slave_sql_errno= 1317,1927,1964
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
SELECT * FROM t3 WHERE a >= 50 ORDER BY a;
|
||||
|
||||
@ -1277,6 +1277,7 @@ eval SELECT IF('$io_pos' = '$sql_pos', "OK", "Not ok, $io_pos <> $sql_pos") AS t
|
||||
|
||||
--connection server_1
|
||||
FLUSH LOGS;
|
||||
--source include/wait_for_binlog_checkpoint.inc
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
@ -1291,6 +1292,54 @@ eval SELECT IF('$io_pos' = '$sql_pos', "OK", "Not ok, $io_pos <> $sql_pos") AS t
|
||||
--enable_query_log
|
||||
|
||||
|
||||
--echo *** MDEV_6435: Incorrect error handling when query binlogged partially on master with "killed" error ***
|
||||
|
||||
--connection server_1
|
||||
CREATE TABLE t6 (a INT) ENGINE=MyISAM;
|
||||
CREATE TRIGGER tr AFTER INSERT ON t6 FOR EACH ROW SET @a = 1;
|
||||
|
||||
--connection con1
|
||||
SET @old_format= @@binlog_format;
|
||||
SET binlog_format= statement;
|
||||
--let $conid = `SELECT CONNECTION_ID()`
|
||||
SET debug_sync='sp_head_execute_before_loop SIGNAL ready WAIT_FOR cont';
|
||||
send INSERT INTO t6 VALUES (1), (2), (3);
|
||||
|
||||
--connection server_1
|
||||
SET debug_sync='now WAIT_FOR ready';
|
||||
--replace_result $conid CONID
|
||||
eval KILL QUERY $conid;
|
||||
SET debug_sync='now SIGNAL cont';
|
||||
|
||||
--connection con1
|
||||
--error ER_QUERY_INTERRUPTED
|
||||
--reap
|
||||
SET binlog_format= @old_format;
|
||||
SET debug_sync='RESET';
|
||||
--let $after_error_gtid_pos= `SELECT @@gtid_binlog_pos`
|
||||
|
||||
--connection server_1
|
||||
SET debug_sync='RESET';
|
||||
|
||||
|
||||
--connection server_2
|
||||
--let $slave_sql_errno= 1317
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
STOP SLAVE IO_THREAD;
|
||||
--replace_result $after_error_gtid_pos AFTER_ERROR_GTID_POS
|
||||
eval SET GLOBAL gtid_slave_pos= '$after_error_gtid_pos';
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection server_1
|
||||
INSERT INTO t6 VALUES (4);
|
||||
SELECT * FROM t6 ORDER BY a;
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
--sync_with_master
|
||||
SELECT * FROM t6 ORDER BY a;
|
||||
|
||||
|
||||
--connection server_2
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
@ -1299,7 +1348,7 @@ SET DEBUG_SYNC= 'RESET';
|
||||
|
||||
--connection server_1
|
||||
DROP function foo;
|
||||
DROP TABLE t1,t2,t3,t4,t5;
|
||||
DROP TABLE t1,t2,t3,t4,t5,t6;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
||||
--source include/rpl_end.inc
|
||||
|
220
mysql-test/suite/rpl/t/rpl_parallel_retry.test
Normal file
220
mysql-test/suite/rpl/t/rpl_parallel_retry.test
Normal file
@ -0,0 +1,220 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--let $rpl_topology=1->2
|
||||
--source include/rpl_init.inc
|
||||
|
||||
--echo *** Test retry of transactions that fail to replicate due to deadlock or similar temporary error. ***
|
||||
|
||||
--connection server_1
|
||||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||
CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1,1);
|
||||
--save_master_pos
|
||||
|
||||
# Use a stored function to inject a debug_sync into the appropriate THD.
|
||||
# The function does nothing on the master, and on the slave it injects the
|
||||
# desired debug_sync action(s).
|
||||
SET sql_log_bin=0;
|
||||
--delimiter ||
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
--delimiter ;
|
||||
SET sql_log_bin=1;
|
||||
|
||||
--connection server_2
|
||||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=5;
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
SET sql_log_bin=0;
|
||||
--delimiter ||
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
IF d1 != '' THEN
|
||||
SET debug_sync = d1;
|
||||
END IF;
|
||||
IF d2 != '' THEN
|
||||
SET debug_sync = d2;
|
||||
END IF;
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
--delimiter ;
|
||||
SET sql_log_bin=1;
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection server_1
|
||||
SET gtid_seq_no = 100;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (2,1);
|
||||
UPDATE t1 SET b=b+1 WHERE a=1;
|
||||
INSERT INTO t1 VALUES (3,1);
|
||||
COMMIT;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100";
|
||||
let $old_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
let $new_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--disable_query_log
|
||||
eval SELECT $new_retry - $old_retry AS retries;
|
||||
--enable_query_log
|
||||
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
|
||||
--echo *** Test that double retry works when the first retry also fails with temp error ***
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection server_1
|
||||
SET gtid_seq_no = 100;
|
||||
SET @old_server_id = @@server_id;
|
||||
SET server_id = 10;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (4,1);
|
||||
UPDATE t1 SET b=b+1 WHERE a=1;
|
||||
INSERT INTO t1 VALUES (5,1);
|
||||
INSERT INTO t1 VALUES (6,1);
|
||||
COMMIT;
|
||||
SET server_id = @old_server_id;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100,rpl_parallel_simulate_double_temp_err_gtid_0_x_100";
|
||||
let $old_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
let $new_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--disable_query_log
|
||||
eval SELECT $new_retry - $old_retry AS retries;
|
||||
--enable_query_log
|
||||
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
|
||||
--echo *** Test too many retries, eventually causing failure. ***
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection server_1
|
||||
SET gtid_seq_no = 100;
|
||||
SET @old_server_id = @@server_id;
|
||||
SET server_id = 11;
|
||||
BEGIN;
|
||||
INSERT INTO t1 VALUES (7,1);
|
||||
UPDATE t1 SET b=b+1 WHERE a=1;
|
||||
INSERT INTO t1 VALUES (8,1);
|
||||
INSERT INTO t1 VALUES (9,1);
|
||||
COMMIT;
|
||||
SET server_id = @old_server_id;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("Slave worker thread retried transaction 10 time\\(s\\) in vain, giving up");
|
||||
CALL mtr.add_suppression("Slave: Deadlock found when trying to get lock; try restarting transaction");
|
||||
SET sql_log_bin=1;
|
||||
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100,rpl_parallel_simulate_infinite_temp_err_gtid_0_x_100";
|
||||
let $old_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
START SLAVE;
|
||||
--let $slave_sql_errno= 1213
|
||||
--let $slave_timeout= 10
|
||||
--source include/wait_for_slave_sql_error.inc
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
let $new_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--disable_query_log
|
||||
eval SELECT $new_retry - $old_retry AS retries;
|
||||
--enable_query_log
|
||||
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
STOP SLAVE IO_THREAD;
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
--echo *** Test retry of event group that spans multiple relay log files. ***
|
||||
|
||||
--connection server_1
|
||||
CREATE TABLE t2 (a int PRIMARY KEY, b BLOB) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1,"Hulubullu");
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
--sync_with_master
|
||||
--source include/stop_slave.inc
|
||||
SET @old_max= @@GLOBAL.max_relay_log_size;
|
||||
SET GLOBAL max_relay_log_size=4096;
|
||||
|
||||
--connection server_1
|
||||
--let $big= `SELECT REPEAT("*", 5000)`
|
||||
SET gtid_seq_no = 100;
|
||||
SET @old_server_id = @@server_id;
|
||||
SET server_id = 12;
|
||||
BEGIN;
|
||||
--disable_query_log
|
||||
eval INSERT INTO t2 VALUES (2, CONCAT("Hello ", "$big"));
|
||||
eval INSERT INTO t2 VALUES (3, CONCAT("Long data: ", "$big"));
|
||||
--enable_query_log
|
||||
INSERT INTO t1 VALUES (10, 4);
|
||||
COMMIT;
|
||||
SET server_id = @old_server_id;
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
SELECT a, LENGTH(b) FROM t2 ORDER BY a;
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_simulate_temp_err_gtid_0_x_100";
|
||||
let $old_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
let $new_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--disable_query_log
|
||||
eval SELECT $new_retry - $old_retry AS retries;
|
||||
--enable_query_log
|
||||
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
SELECT a, LENGTH(b) FROM t2 ORDER BY a;
|
||||
|
||||
--connection server_1
|
||||
INSERT INTO t1 VALUES (11,11);
|
||||
--disable_query_log
|
||||
eval INSERT INTO t2 VALUES (4, "$big");
|
||||
--enable_query_log
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
--sync_with_master
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
SELECT a, LENGTH(b) FROM t2 ORDER BY a;
|
||||
SET GLOBAL max_relay_log_size=@old_max;
|
||||
|
||||
|
||||
--connection server_2
|
||||
--source include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection server_1
|
||||
DROP TABLE t1, t2;
|
||||
DROP function foo;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -1137,6 +1137,17 @@
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
OpenSSL still reachable.
|
||||
Memcheck:Leak
|
||||
fun:*alloc
|
||||
fun:CRYPTO_malloc
|
||||
obj:*libssl*
|
||||
fun:SSL_COMP_get_compression_methods
|
||||
fun:SSL_library_init
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
Problem with udf and libresolve
|
||||
Memcheck:Cond
|
||||
|
Reference in New Issue
Block a user