Browse Source
Merge MDEV-6589 and MDEV-6403 into 10.1.
Merge MDEV-6589 and MDEV-6403 into 10.1.
Conflicts: sql/log.cc sql/rpl_rli.cc sql/sql_repl.ccpull/28/merge
13 changed files with 666 additions and 14 deletions
-
25mysql-test/suite/rpl/r/rpl_gtid_misc.result
-
147mysql-test/suite/rpl/r/rpl_parallel_mdev6589.result
-
50mysql-test/suite/rpl/t/rpl_gtid_misc.test
-
132mysql-test/suite/rpl/t/rpl_parallel_mdev6589.test
-
2sql/log.cc
-
46sql/rpl_gtid.cc
-
2sql/rpl_gtid.h
-
98sql/rpl_parallel.cc
-
1sql/rpl_parallel.h
-
71sql/rpl_rli.cc
-
26sql/rpl_rli.h
-
56sql/slave.cc
-
24sql/sql_repl.cc
@ -0,0 +1,25 @@ |
|||
include/master-slave.inc |
|||
[connection master] |
|||
*** MDEV-6403: Temporary tables lost at STOP SLAVE in GTID mode if master has not rotated binlog since restart *** |
|||
CREATE TABLE t1 (a INT PRIMARY KEY); |
|||
include/stop_slave.inc |
|||
SET sql_log_bin= 0; |
|||
INSERT INTO t1 VALUES (1); |
|||
SET sql_log_bin= 1; |
|||
CHANGE MASTER TO master_use_gtid= current_pos; |
|||
CREATE TEMPORARY TABLE t2 LIKE t1; |
|||
INSERT INTO t2 VALUE (1); |
|||
INSERT INTO t1 SELECT * FROM t2; |
|||
DROP TEMPORARY TABLE t2; |
|||
START SLAVE; |
|||
include/wait_for_slave_sql_error.inc [errno=1062] |
|||
STOP SLAVE IO_THREAD; |
|||
SET sql_log_bin= 0; |
|||
DELETE FROM t1 WHERE a=1; |
|||
SET sql_log_bin= 1; |
|||
include/start_slave.inc |
|||
SELECT * FROM t1 ORDER BY a; |
|||
a |
|||
1 |
|||
DROP TABLE t1; |
|||
include/rpl_end.inc |
|||
@ -0,0 +1,147 @@ |
|||
include/master-slave.inc |
|||
[connection master] |
|||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; |
|||
include/stop_slave.inc |
|||
SET GLOBAL slave_parallel_threads=10; |
|||
CHANGE MASTER TO master_use_gtid=current_pos; |
|||
include/start_slave.inc |
|||
*** MDEV-6589: Incorrect relay log start position when restarting SQL thread after error in parallel replication *** |
|||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; |
|||
CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=MyISAM; |
|||
CREATE TABLE t2 (a int PRIMARY KEY) ENGINE=InnoDB; |
|||
INSERT INTO t1 VALUES (1); |
|||
INSERT INTO t2 VALUES (1); |
|||
SELECT * FROM t1; |
|||
a |
|||
1 |
|||
SELECT * FROM t2; |
|||
a |
|||
1 |
|||
SET sql_log_bin=0; |
|||
BEGIN; |
|||
INSERT INTO t2 VALUES (5); |
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t1 VALUES (2); |
|||
INSERT INTO t2 VALUES (3); |
|||
FLUSH LOGS; |
|||
INSERT INTO t1 VALUES (4); |
|||
SET gtid_domain_id=1; |
|||
INSERT INTO t2 VALUES (5); |
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t1 VALUES (6); |
|||
INSERT INTO t1 VALUES (7); |
|||
SET gtid_domain_id=2; |
|||
INSERT INTO t2 VALUES (8); |
|||
INSERT INTO t1 VALUES (9); |
|||
FLUSH LOGS; |
|||
SET gtid_domain_id=3; |
|||
INSERT INTO t2 VALUES (10); |
|||
INSERT INTO t1 VALUES (11); |
|||
SET gtid_domain_id=1; |
|||
INSERT INTO t1 VALUES (12); |
|||
INSERT INTO t2 VALUES (13); |
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t2 VALUES (14); |
|||
FLUSH LOGS; |
|||
SET gtid_domain_id=3; |
|||
INSERT INTO t2 VALUES (15); |
|||
SET gtid_domain_id=2; |
|||
INSERT INTO t2 VALUES (16); |
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t1 VALUES (17); |
|||
SET @gtid0 = @@last_gtid; |
|||
SET gtid_domain_id=2; |
|||
INSERT INTO t1 VALUES (18); |
|||
SET @gtid2 = @@last_gtid; |
|||
SET gtid_domain_id=3; |
|||
INSERT INTO t1 VALUES (19); |
|||
SET @gtid3 = @@last_gtid; |
|||
SELECT * FROM t1 ORDER BY a; |
|||
a |
|||
1 |
|||
2 |
|||
4 |
|||
6 |
|||
7 |
|||
9 |
|||
11 |
|||
12 |
|||
17 |
|||
18 |
|||
19 |
|||
SELECT * FROM t2 ORDER BY a; |
|||
a |
|||
1 |
|||
3 |
|||
5 |
|||
8 |
|||
10 |
|||
13 |
|||
14 |
|||
15 |
|||
16 |
|||
include/save_master_gtid.inc |
|||
SELECT MASTER_GTID_WAIT('WAIT_POS'); |
|||
MASTER_GTID_WAIT('WAIT_POS') |
|||
0 |
|||
COMMIT; |
|||
SET sql_log_bin=1; |
|||
include/wait_for_slave_sql_error.inc [errno=1062] |
|||
SELECT * FROM t1 ORDER BY a; |
|||
a |
|||
1 |
|||
2 |
|||
4 |
|||
6 |
|||
7 |
|||
9 |
|||
11 |
|||
17 |
|||
18 |
|||
19 |
|||
SELECT * FROM t2 ORDER BY a; |
|||
a |
|||
1 |
|||
3 |
|||
5 |
|||
8 |
|||
10 |
|||
14 |
|||
15 |
|||
16 |
|||
SET sql_log_bin=0; |
|||
DELETE FROM t2 WHERE a=5; |
|||
SET sql_log_bin=1; |
|||
include/start_slave.inc |
|||
include/sync_with_master_gtid.inc |
|||
SELECT * FROM t1 ORDER BY a; |
|||
a |
|||
1 |
|||
2 |
|||
4 |
|||
6 |
|||
7 |
|||
9 |
|||
11 |
|||
12 |
|||
17 |
|||
18 |
|||
19 |
|||
SELECT * FROM t2 ORDER BY a; |
|||
a |
|||
1 |
|||
3 |
|||
5 |
|||
8 |
|||
10 |
|||
13 |
|||
14 |
|||
15 |
|||
16 |
|||
include/stop_slave.inc |
|||
SET GLOBAL slave_parallel_threads=@old_parallel_threads; |
|||
include/start_slave.inc |
|||
SET DEBUG_SYNC= 'RESET'; |
|||
DROP TABLE t1,t2; |
|||
SET DEBUG_SYNC= 'RESET'; |
|||
include/rpl_end.inc |
|||
@ -0,0 +1,50 @@ |
|||
--source include/master-slave.inc |
|||
|
|||
--echo *** MDEV-6403: Temporary tables lost at STOP SLAVE in GTID mode if master has not rotated binlog since restart *** |
|||
|
|||
--connection master |
|||
CREATE TABLE t1 (a INT PRIMARY KEY); |
|||
--sync_slave_with_master |
|||
|
|||
--connection slave |
|||
--source include/stop_slave.inc |
|||
# Inject a duplicate key error that will make the slave stop in the middle of |
|||
# a sequence of transactions that use a temporary table. |
|||
SET sql_log_bin= 0; |
|||
INSERT INTO t1 VALUES (1); |
|||
SET sql_log_bin= 1; |
|||
CHANGE MASTER TO master_use_gtid= current_pos; |
|||
|
|||
--connection master |
|||
|
|||
# Make some queries that use a temporary table. |
|||
CREATE TEMPORARY TABLE t2 LIKE t1; |
|||
INSERT INTO t2 VALUE (1); |
|||
INSERT INTO t1 SELECT * FROM t2; |
|||
DROP TEMPORARY TABLE t2; |
|||
--save_master_pos |
|||
|
|||
--connection slave |
|||
START SLAVE; |
|||
--let $slave_sql_errno=1062 |
|||
--source include/wait_for_slave_sql_error.inc |
|||
|
|||
# Restart the slave. |
|||
# The bug was that the IO thread would receive again the restart |
|||
# format_description event at the start of the master's binlog, and this |
|||
# event would cause the SQL thread to discard all active temporary tables. |
|||
|
|||
STOP SLAVE IO_THREAD; |
|||
|
|||
SET sql_log_bin= 0; |
|||
DELETE FROM t1 WHERE a=1; |
|||
SET sql_log_bin= 1; |
|||
|
|||
--source include/start_slave.inc |
|||
--sync_with_master |
|||
SELECT * FROM t1 ORDER BY a; |
|||
|
|||
--connection master |
|||
DROP TABLE t1; |
|||
|
|||
--source include/rpl_end.inc |
|||
@ -0,0 +1,132 @@ |
|||
--source include/have_innodb.inc |
|||
--source include/have_debug.inc |
|||
--source include/have_debug_sync.inc |
|||
--source include/master-slave.inc |
|||
|
|||
--connection server_2 |
|||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; |
|||
--source include/stop_slave.inc |
|||
SET GLOBAL slave_parallel_threads=10; |
|||
CHANGE MASTER TO master_use_gtid=current_pos; |
|||
--source include/start_slave.inc |
|||
|
|||
|
|||
--echo *** MDEV-6589: Incorrect relay log start position when restarting SQL thread after error in parallel replication *** |
|||
|
|||
--connection server_1 |
|||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; |
|||
CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=MyISAM; |
|||
CREATE TABLE t2 (a int PRIMARY KEY) ENGINE=InnoDB; |
|||
INSERT INTO t1 VALUES (1); |
|||
INSERT INTO t2 VALUES (1); |
|||
--save_master_pos |
|||
|
|||
--connection server_2 |
|||
--sync_with_master |
|||
SELECT * FROM t1; |
|||
SELECT * FROM t2; |
|||
|
|||
# Block one domain, which we will later cause to give an error. And let some |
|||
# other domains proceed so we can check that after restart, the slave is able |
|||
# to correctly restart each domain in a separate position. |
|||
|
|||
--connect (con_temp1,127.0.0.1,root,,test,$SERVER_MYPORT_2,) |
|||
SET sql_log_bin=0; |
|||
BEGIN; |
|||
INSERT INTO t2 VALUES (5); |
|||
|
|||
--connection server_1 |
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t1 VALUES (2); |
|||
INSERT INTO t2 VALUES (3); |
|||
FLUSH LOGS; |
|||
INSERT INTO t1 VALUES (4); |
|||
|
|||
SET gtid_domain_id=1; |
|||
# This query will be blocked on the slave, and later give a duplicate key error. |
|||
INSERT INTO t2 VALUES (5); |
|||
|
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t1 VALUES (6); |
|||
INSERT INTO t1 VALUES (7); |
|||
|
|||
SET gtid_domain_id=2; |
|||
INSERT INTO t2 VALUES (8); |
|||
INSERT INTO t1 VALUES (9); |
|||
FLUSH LOGS; |
|||
|
|||
SET gtid_domain_id=3; |
|||
INSERT INTO t2 VALUES (10); |
|||
INSERT INTO t1 VALUES (11); |
|||
|
|||
# These cannot be replicated before the error, as a prior commit is blocked. |
|||
SET gtid_domain_id=1; |
|||
INSERT INTO t1 VALUES (12); |
|||
INSERT INTO t2 VALUES (13); |
|||
|
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t2 VALUES (14); |
|||
FLUSH LOGS; |
|||
|
|||
SET gtid_domain_id=3; |
|||
INSERT INTO t2 VALUES (15); |
|||
|
|||
SET gtid_domain_id=2; |
|||
INSERT INTO t2 VALUES (16); |
|||
|
|||
SET gtid_domain_id=0; |
|||
INSERT INTO t1 VALUES (17); |
|||
SET @gtid0 = @@last_gtid; |
|||
SET gtid_domain_id=2; |
|||
INSERT INTO t1 VALUES (18); |
|||
SET @gtid2 = @@last_gtid; |
|||
SET gtid_domain_id=3; |
|||
INSERT INTO t1 VALUES (19); |
|||
SET @gtid3 = @@last_gtid; |
|||
--let $wait_pos= `SELECT CONCAT(@gtid0, ",", @gtid2, ",", @gtid3)` |
|||
|
|||
SELECT * FROM t1 ORDER BY a; |
|||
SELECT * FROM t2 ORDER BY a; |
|||
--source include/save_master_gtid.inc |
|||
|
|||
|
|||
--connection server_2 |
|||
# First wait for domains 0, 2, and 3 to complete. |
|||
--replace_result $wait_pos WAIT_POS |
|||
eval SELECT MASTER_GTID_WAIT('$wait_pos'); |
|||
|
|||
# Then release the row lock, and wait for the domain 1 to fail with |
|||
# duplicate key error. |
|||
--connection con_temp1 |
|||
COMMIT; |
|||
SET sql_log_bin=1; |
|||
|
|||
--connection server_2 |
|||
--let $slave_sql_errno= 1062 |
|||
--source include/wait_for_slave_sql_error.inc |
|||
|
|||
SELECT * FROM t1 ORDER BY a; |
|||
SELECT * FROM t2 ORDER BY a; |
|||
|
|||
SET sql_log_bin=0; |
|||
DELETE FROM t2 WHERE a=5; |
|||
SET sql_log_bin=1; |
|||
--source include/start_slave.inc |
|||
--source include/sync_with_master_gtid.inc |
|||
|
|||
SELECT * FROM t1 ORDER BY a; |
|||
SELECT * FROM t2 ORDER BY a; |
|||
|
|||
|
|||
# Clean up. |
|||
--connection server_2 |
|||
--source include/stop_slave.inc |
|||
SET GLOBAL slave_parallel_threads=@old_parallel_threads; |
|||
--source include/start_slave.inc |
|||
SET DEBUG_SYNC= 'RESET'; |
|||
|
|||
--connection server_1 |
|||
DROP TABLE t1,t2; |
|||
SET DEBUG_SYNC= 'RESET'; |
|||
|
|||
--source include/rpl_end.inc |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue