Browse Source
MDEV-6156: Parallel replication incorrectly caches charset between worker threads
MDEV-6156: Parallel replication incorrectly caches charset between worker threads
Replication caches the character sets used in a query, to be able to quickly reuse them for the next query in the common case of them not having changed. In parallel replication, this caching needs to be per-worker-thread. The code was not modified to handle this correctly, so the caching in one worker could cause another worker to run a query using the wrong character set, causing replication corruption.pull/3/head
7 changed files with 186 additions and 47 deletions
-
87mysql-test/suite/rpl/r/rpl_parallel_charset.result
-
56mysql-test/suite/rpl/t/rpl_parallel_charset.test
-
6sql/log_event.cc
-
48sql/rpl_rli.cc
-
21sql/rpl_rli.h
-
12sql/slave.cc
-
3sql/slave.h
@ -0,0 +1,87 @@ |
|||
include/rpl_init.inc [topology=1->2] |
|||
*** MDEV-6156: Parallel replication incorrectly caches charset between worker threads *** |
|||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; |
|||
include/stop_slave.inc |
|||
SET GLOBAL slave_parallel_threads=5; |
|||
include/start_slave.inc |
|||
CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(100) CHARACTER SET utf8); |
|||
SHOW CREATE TABLE t1; |
|||
Table Create Table |
|||
t1 CREATE TABLE `t1` ( |
|||
`a` int(11) NOT NULL, |
|||
`b` varchar(100) CHARACTER SET utf8 DEFAULT NULL, |
|||
PRIMARY KEY (`a`) |
|||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
|||
SET character_set_client=latin1; |
|||
INSERT INTO t1 VALUES (1, 'Rødgrød med fløde 1'); |
|||
INSERT INTO t1 VALUES (2, 'Rødgrød med fløde 2'); |
|||
INSERT INTO t1 VALUES (3, 'Rødgrød med fløde 3'); |
|||
INSERT INTO t1 VALUES (4, 'Rødgrød med fløde 4'); |
|||
INSERT INTO t1 VALUES (5, 'Rødgrød med fløde 5'); |
|||
INSERT INTO t1 VALUES (6, 'Rødgrød med fløde 6'); |
|||
INSERT INTO t1 VALUES (7, 'Rødgrød med fløde 7'); |
|||
INSERT INTO t1 VALUES (8, 'Rødgrød med fløde 8'); |
|||
INSERT INTO t1 VALUES (9, 'Rødgrød med fløde 9'); |
|||
INSERT INTO t1 VALUES (10, 'Rødgrød med fløde 10'); |
|||
SET character_set_client=utf8; |
|||
INSERT INTO t1 VALUES (11, 'Rødgrød med fløde 1'); |
|||
INSERT INTO t1 VALUES (12, 'Rødgrød med fløde 2'); |
|||
INSERT INTO t1 VALUES (13, 'Rødgrød med fløde 3'); |
|||
INSERT INTO t1 VALUES (14, 'Rødgrød med fløde 4'); |
|||
INSERT INTO t1 VALUES (15, 'Rødgrød med fløde 5'); |
|||
INSERT INTO t1 VALUES (16, 'Rødgrød med fløde 6'); |
|||
INSERT INTO t1 VALUES (17, 'Rødgrød med fløde 7'); |
|||
INSERT INTO t1 VALUES (18, 'Rødgrød med fløde 8'); |
|||
INSERT INTO t1 VALUES (19, 'Rødgrød med fløde 9'); |
|||
INSERT INTO t1 VALUES (20, 'Rødgrød med fløde 10'); |
|||
SET character_set_results=utf8; |
|||
SELECT * FROM t1 ORDER BY a; |
|||
a b |
|||
1 Rødgrød med fløde 1 |
|||
2 Rødgrød med fløde 2 |
|||
3 Rødgrød med fløde 3 |
|||
4 Rødgrød med fløde 4 |
|||
5 Rødgrød med fløde 5 |
|||
6 Rødgrød med fløde 6 |
|||
7 Rødgrød med fløde 7 |
|||
8 Rødgrød med fløde 8 |
|||
9 Rødgrød med fløde 9 |
|||
10 Rødgrød med fløde 10 |
|||
11 Rødgrød med fløde 1 |
|||
12 Rødgrød med fløde 2 |
|||
13 Rødgrød med fløde 3 |
|||
14 Rødgrød med fløde 4 |
|||
15 Rødgrød med fløde 5 |
|||
16 Rødgrød med fløde 6 |
|||
17 Rødgrød med fløde 7 |
|||
18 Rødgrød med fløde 8 |
|||
19 Rødgrød med fløde 9 |
|||
20 Rødgrød med fløde 10 |
|||
SET character_set_results=utf8; |
|||
SELECT * FROM t1 ORDER BY a; |
|||
a b |
|||
1 Rødgrød med fløde 1 |
|||
2 Rødgrød med fløde 2 |
|||
3 Rødgrød med fløde 3 |
|||
4 Rødgrød med fløde 4 |
|||
5 Rødgrød med fløde 5 |
|||
6 Rødgrød med fløde 6 |
|||
7 Rødgrød med fløde 7 |
|||
8 Rødgrød med fløde 8 |
|||
9 Rødgrød med fløde 9 |
|||
10 Rødgrød med fløde 10 |
|||
11 Rødgrød med fløde 1 |
|||
12 Rødgrød med fløde 2 |
|||
13 Rødgrød med fløde 3 |
|||
14 Rødgrød med fløde 4 |
|||
15 Rødgrød med fløde 5 |
|||
16 Rødgrød med fløde 6 |
|||
17 Rødgrød med fløde 7 |
|||
18 Rødgrød med fløde 8 |
|||
19 Rødgrød med fløde 9 |
|||
20 Rødgrød med fløde 10 |
|||
include/stop_slave.inc |
|||
SET GLOBAL slave_parallel_threads=@old_parallel_threads; |
|||
include/start_slave.inc |
|||
DROP TABLE t1; |
|||
include/rpl_end.inc |
|||
@ -0,0 +1,56 @@ |
|||
--source include/have_binlog_format_statement.inc |
|||
--let $rpl_topology=1->2 |
|||
--source include/rpl_init.inc |
|||
|
|||
--echo *** MDEV-6156: Parallel replication incorrectly caches charset between worker threads *** |
|||
|
|||
--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 |
|||
|
|||
--connection server_1 |
|||
CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(100) CHARACTER SET utf8); |
|||
SHOW CREATE TABLE t1; |
|||
SET character_set_client=latin1; |
|||
INSERT INTO t1 VALUES (1, 'Rødgrød med fløde 1'); |
|||
INSERT INTO t1 VALUES (2, 'Rødgrød med fløde 2'); |
|||
INSERT INTO t1 VALUES (3, 'Rødgrød med fløde 3'); |
|||
INSERT INTO t1 VALUES (4, 'Rødgrød med fløde 4'); |
|||
INSERT INTO t1 VALUES (5, 'Rødgrød med fløde 5'); |
|||
INSERT INTO t1 VALUES (6, 'Rødgrød med fløde 6'); |
|||
INSERT INTO t1 VALUES (7, 'Rødgrød med fløde 7'); |
|||
INSERT INTO t1 VALUES (8, 'Rødgrød med fløde 8'); |
|||
INSERT INTO t1 VALUES (9, 'Rødgrød med fløde 9'); |
|||
INSERT INTO t1 VALUES (10, 'Rødgrød med fløde 10'); |
|||
SET character_set_client=utf8; |
|||
INSERT INTO t1 VALUES (11, 'Rødgrød med fløde 1'); |
|||
INSERT INTO t1 VALUES (12, 'Rødgrød med fløde 2'); |
|||
INSERT INTO t1 VALUES (13, 'Rødgrød med fløde 3'); |
|||
INSERT INTO t1 VALUES (14, 'Rødgrød med fløde 4'); |
|||
INSERT INTO t1 VALUES (15, 'Rødgrød med fløde 5'); |
|||
INSERT INTO t1 VALUES (16, 'Rødgrød med fløde 6'); |
|||
INSERT INTO t1 VALUES (17, 'Rødgrød med fløde 7'); |
|||
INSERT INTO t1 VALUES (18, 'Rødgrød med fløde 8'); |
|||
INSERT INTO t1 VALUES (19, 'Rødgrød med fløde 9'); |
|||
INSERT INTO t1 VALUES (20, 'Rødgrød med fløde 10'); |
|||
SET character_set_results=utf8; |
|||
SELECT * FROM t1 ORDER BY a; |
|||
--save_master_pos |
|||
|
|||
--connection server_2 |
|||
--sync_with_master |
|||
SET character_set_results=utf8; |
|||
SELECT * FROM t1 ORDER BY a; |
|||
|
|||
|
|||
--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; |
|||
|
|||
--source include/rpl_end.inc |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue