mirror of
https://github.com/MariaDB/server.git
synced 2025-11-30 05:23:50 +03:00
Use include/sync_with_master_gtid.inc instead of --sync_with_master to avoid a race in the test case. In parallel replication, the old-style slave position (which is used by --sync_with_master) is updated out-of-order between parallel threads. This makes it possible for the position to be updated past DROP TEMPORARY TABLE t2 just before the commit of INSERT INTO t1 SELECT * FROM t2 becomes visible. In this case, there is a small window where a SELECT just after --sync_with_master may not see the changes from the INSERT.
72 lines
2.0 KiB
Plaintext
72 lines
2.0 KiB
Plaintext
--source include/have_innodb.inc
|
|
--source include/master-slave.inc
|
|
|
|
--connection master
|
|
# ToDo: Remove this FLUSH LOGS when MDEV-6403 is fixed.
|
|
ALTER TABLE mysql.gtid_slave_pos ENGINE = InnoDB;
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) Engine=InnoDB;
|
|
--sync_slave_with_master
|
|
|
|
--connection slave
|
|
--source include/stop_slave.inc
|
|
# Provoke a duplicate key error on replication.
|
|
SET sql_log_bin= 0;
|
|
INSERT INTO t1 VALUES (1, 2);
|
|
SET sql_log_bin= 1;
|
|
CHANGE MASTER TO master_use_gtid= current_pos;
|
|
--echo Contents on slave before:
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
SET @old_parallel= @@GLOBAL.slave_parallel_threads;
|
|
SET GLOBAL slave_parallel_threads=8;
|
|
|
|
--connection master
|
|
|
|
CREATE TEMPORARY TABLE t2 LIKE t1;
|
|
INSERT INTO t2 VALUE (1, 1);
|
|
INSERT INTO t2 VALUE (2, 1);
|
|
INSERT INTO t2 VALUE (3, 1);
|
|
INSERT INTO t2 VALUE (4, 1);
|
|
INSERT INTO t2 VALUE (5, 1);
|
|
INSERT INTO t1 SELECT * FROM t2;
|
|
DROP TEMPORARY TABLE t2;
|
|
--source include/save_master_gtid.inc
|
|
--echo Contents on master:
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
--connection slave
|
|
START SLAVE;
|
|
# The slave will stop with a duplicate key error.
|
|
# The bug was 1) that the next DROP TEMPORARY TABLE would be allowed to run
|
|
# anyway, and 2) that then record_gtid() would get an error during commit
|
|
# (since the prior commit failed), and this error was not correctly handled,
|
|
# which caused an assertion about closing tables while a statement was still
|
|
# active.
|
|
--let $slave_sql_errno=1062
|
|
--source include/wait_for_slave_sql_error.inc
|
|
|
|
STOP SLAVE IO_THREAD;
|
|
--echo Contents on slave on slave error:
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
# Resolve the duplicate key error so replication can be resumed.
|
|
SET sql_log_bin= 0;
|
|
DELETE FROM t1 WHERE a=1;
|
|
SET sql_log_bin= 1;
|
|
|
|
--source include/start_slave.inc
|
|
--source include/sync_with_master_gtid.inc
|
|
--echo Contents on slave after:
|
|
SELECT * FROM t1 ORDER BY a;
|
|
|
|
--connection master
|
|
DROP TABLE t1;
|
|
|
|
--connection slave
|
|
--source include/stop_slave.inc
|
|
SET GLOBAL slave_parallel_threads= @old_parallel;
|
|
--source include/start_slave.inc
|
|
|
|
--source include/rpl_end.inc
|