mirror of
https://github.com/MariaDB/server.git
synced 2025-12-01 17:39:21 +03:00
Merge tag 'mariadb-10.0.23' into 10.0-galera
This commit is contained in:
@@ -29,8 +29,104 @@ include/start_slave.inc
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
a b
|
||||
10 0
|
||||
*** MDEV-7818: Deadlock occurring with parallel replication and FTWRL ***
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1,0), (2,0), (3,0);
|
||||
include/stop_slave.inc
|
||||
SET @old_dbug= @@SESSION.debug_dbug;
|
||||
SET @commit_id= 4242;
|
||||
SET SESSION debug_dbug="+d,binlog_force_commit_id";
|
||||
BEGIN;
|
||||
UPDATE t2 SET b=b+1 WHERE a=2;
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
INSERT INTO t2 VALUES (4,10);
|
||||
COMMIT;
|
||||
SET SESSION debug_dbug= @old_dbug;
|
||||
INSERT INTO t2 VALUES (5,0);
|
||||
INSERT INTO t2 VALUES (6,0);
|
||||
INSERT INTO t2 VALUES (7,0);
|
||||
INSERT INTO t2 VALUES (8,0);
|
||||
INSERT INTO t2 VALUES (9,0);
|
||||
INSERT INTO t2 VALUES (10,0);
|
||||
INSERT INTO t2 VALUES (11,0);
|
||||
INSERT INTO t2 VALUES (12,0);
|
||||
INSERT INTO t2 VALUES (13,0);
|
||||
INSERT INTO t2 VALUES (14,0);
|
||||
INSERT INTO t2 VALUES (15,0);
|
||||
INSERT INTO t2 VALUES (16,0);
|
||||
INSERT INTO t2 VALUES (17,0);
|
||||
INSERT INTO t2 VALUES (18,0);
|
||||
INSERT INTO t2 VALUES (19,0);
|
||||
BEGIN;
|
||||
SELECT * FROM t2 WHERE a=2 FOR UPDATE;
|
||||
a b
|
||||
2 0
|
||||
include/start_slave.inc
|
||||
FLUSH TABLES WITH READ LOCK;
|
||||
COMMIT;
|
||||
STOP SLAVE;
|
||||
SELECT * FROM t2 ORDER BY a;
|
||||
a b
|
||||
1 0
|
||||
2 1
|
||||
3 0
|
||||
4 10
|
||||
5 0
|
||||
6 0
|
||||
7 0
|
||||
8 0
|
||||
9 0
|
||||
10 0
|
||||
11 0
|
||||
12 0
|
||||
13 0
|
||||
14 0
|
||||
15 0
|
||||
16 0
|
||||
17 0
|
||||
18 0
|
||||
19 0
|
||||
UNLOCK TABLES;
|
||||
SELECT "after UNLOCK TABLES" as state;
|
||||
state
|
||||
after UNLOCK TABLES
|
||||
SELECT "after reap of STOP SLAVE" as state;
|
||||
state
|
||||
after reap of STOP SLAVE
|
||||
include/wait_for_slave_to_stop.inc
|
||||
include/start_slave.inc
|
||||
SELECT * FROM t2 ORDER BY a;
|
||||
a b
|
||||
1 0
|
||||
2 1
|
||||
3 0
|
||||
4 10
|
||||
5 0
|
||||
6 0
|
||||
7 0
|
||||
8 0
|
||||
9 0
|
||||
10 0
|
||||
11 0
|
||||
12 0
|
||||
13 0
|
||||
14 0
|
||||
15 0
|
||||
16 0
|
||||
17 0
|
||||
18 0
|
||||
19 0
|
||||
*** MDEV-8318: Assertion `!pool->busy' failed in pool_mark_busy(rpl_parallel_thread_pool*) on concurrent FTWRL ***
|
||||
LOCK TABLE t2 WRITE;
|
||||
FLUSH TABLES WITH READ LOCK;
|
||||
FLUSH TABLES WITH READ LOCK;
|
||||
KILL QUERY CID;
|
||||
ERROR 70100: Query execution was interrupted
|
||||
UNLOCK TABLES;
|
||||
UNLOCK TABLES;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
include/start_slave.inc
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t1, t2;
|
||||
include/rpl_end.inc
|
||||
|
||||
@@ -7,7 +7,8 @@ CREATE TABLE t1 (name varchar(64), age smallint(3))ENGINE=InnoDB;
|
||||
INSERT INTO t1 SET name='Andy', age=31;
|
||||
INSERT INTO t1 SET name='Jacob', age=2;
|
||||
INSERT INTO t1 SET name='Caleb', age=1;
|
||||
ALTER TABLE t1 ADD id int(8) ZEROFILL AUTO_INCREMENT PRIMARY KEY;
|
||||
ALTER TABLE t1 ADD id int(8) ZEROFILL AUTO_INCREMENT PRIMARY KEY,
|
||||
ALGORITHM=COPY;
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
name age id
|
||||
Andy 31 00000001
|
||||
|
||||
@@ -7,7 +7,8 @@ CREATE TABLE t1 (name varchar(64), age smallint(3))ENGINE=MyISAM;
|
||||
INSERT INTO t1 SET name='Andy', age=31;
|
||||
INSERT INTO t1 SET name='Jacob', age=2;
|
||||
INSERT INTO t1 SET name='Caleb', age=1;
|
||||
ALTER TABLE t1 ADD id int(8) ZEROFILL AUTO_INCREMENT PRIMARY KEY;
|
||||
ALTER TABLE t1 ADD id int(8) ZEROFILL AUTO_INCREMENT PRIMARY KEY,
|
||||
ALGORITHM=COPY;
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
name age id
|
||||
Andy 31 00000001
|
||||
|
||||
@@ -493,13 +493,13 @@ include/diff_tables.inc [master:t4, slave:t4]
|
||||
[expecting slave to stop]
|
||||
INSERT INTO t5 VALUES (1, "", 1);
|
||||
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
include/wait_for_slave_sql_error.inc [errno=1677 ]
|
||||
include/wait_for_slave_sql_error.inc [errno=1677]
|
||||
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(255)' to type 'char(16)''
|
||||
include/rpl_reset.inc
|
||||
[expecting slave to stop]
|
||||
INSERT INTO t6 VALUES (1, "", 1);
|
||||
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
include/wait_for_slave_sql_error.inc [errno=1677 ]
|
||||
include/wait_for_slave_sql_error.inc [errno=1677]
|
||||
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(255)' to type 'char(128)''
|
||||
include/rpl_reset.inc
|
||||
[expecting slave to replicate correctly]
|
||||
|
||||
@@ -496,13 +496,13 @@ include/diff_tables.inc [master:t4, slave:t4]
|
||||
[expecting slave to stop]
|
||||
INSERT INTO t5 VALUES (1, "", 1);
|
||||
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
include/wait_for_slave_sql_error.inc [errno=1677 ]
|
||||
include/wait_for_slave_sql_error.inc [errno=1677]
|
||||
Last_SQL_Error = 'Column 1 of table 'test.t5' cannot be converted from type 'char(255)' to type 'char(16)''
|
||||
include/rpl_reset.inc
|
||||
[expecting slave to stop]
|
||||
INSERT INTO t6 VALUES (1, "", 1);
|
||||
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
include/wait_for_slave_sql_error.inc [errno=1677 ]
|
||||
include/wait_for_slave_sql_error.inc [errno=1677]
|
||||
Last_SQL_Error = 'Column 1 of table 'test.t6' cannot be converted from type 'char(255)' to type 'char(128)''
|
||||
include/rpl_reset.inc
|
||||
[expecting slave to replicate correctly]
|
||||
|
||||
@@ -25,10 +25,4 @@ INSERT INTO t1(c1) VALUES (NULL);
|
||||
UPDATE t1 SET c1= 0;
|
||||
include/diff_tables.inc [master:t1, slave:t1]
|
||||
DROP TABLE t1;
|
||||
include/rpl_reset.inc
|
||||
CREATE TABLE t1 (c1 int(11) NOT NULL, c2 int(11) NOT NULL, c3 int(11) DEFAULT '-1') ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,2,NULL);
|
||||
UPDATE t1 SET c1=1, c2=2, c3=-1 WHERE c1=1 AND c2=2 AND ISNULL(c3);
|
||||
include/diff_tables.inc [master:test.t1, slave:test.t1]
|
||||
DROP TABLE t1;
|
||||
include/rpl_end.inc
|
||||
|
||||
@@ -34,10 +34,4 @@ INSERT INTO t1(c1) VALUES (NULL);
|
||||
UPDATE t1 SET c1= 0;
|
||||
include/diff_tables.inc [master:t1, slave:t1]
|
||||
DROP TABLE t1;
|
||||
include/rpl_reset.inc
|
||||
CREATE TABLE t1 (c1 int(11) NOT NULL, c2 int(11) NOT NULL, c3 int(11) DEFAULT '-1') ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,2,NULL);
|
||||
UPDATE t1 SET c1=1, c2=2, c3=-1 WHERE c1=1 AND c2=2 AND ISNULL(c3);
|
||||
include/diff_tables.inc [master:test.t1, slave:test.t1]
|
||||
DROP TABLE t1;
|
||||
include/rpl_end.inc
|
||||
|
||||
@@ -8,4 +8,6 @@ set @time_after_kill := (select CURRENT_TIMESTAMP);
|
||||
[Time after the query]
|
||||
[Killing of the slave IO thread was successful]
|
||||
START SLAVE IO_THREAD;
|
||||
create table t1 (a int primary key);
|
||||
drop table t1;
|
||||
include/rpl_end.inc
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# tables. Specifically when drop temporary tables and create temporary tables
|
||||
# are used.
|
||||
###################################################################################
|
||||
--source include/big_test.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
--source include/have_debug.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--let $rpl_topology=1->2
|
||||
--source include/rpl_init.inc
|
||||
@@ -78,13 +80,148 @@ SET GLOBAL sql_slave_skip_counter= 1;
|
||||
SELECT * FROM t1 WHERE a >= 10 ORDER BY a;
|
||||
|
||||
|
||||
# Clean up
|
||||
--echo *** MDEV-7818: Deadlock occurring with parallel replication and FTWRL ***
|
||||
|
||||
--connection server_1
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1,0), (2,0), (3,0);
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
--sync_with_master
|
||||
--source include/stop_slave.inc
|
||||
|
||||
--connection server_1
|
||||
# Create a group commit with two transactions, will be used to provoke the
|
||||
# problematic thread interaction with FTWRL on the slave.
|
||||
SET @old_dbug= @@SESSION.debug_dbug;
|
||||
SET @commit_id= 4242;
|
||||
SET SESSION debug_dbug="+d,binlog_force_commit_id";
|
||||
|
||||
BEGIN;
|
||||
UPDATE t2 SET b=b+1 WHERE a=2;
|
||||
COMMIT;
|
||||
|
||||
BEGIN;
|
||||
INSERT INTO t2 VALUES (4,10);
|
||||
COMMIT;
|
||||
|
||||
SET SESSION debug_dbug= @old_dbug;
|
||||
|
||||
INSERT INTO t2 VALUES (5,0);
|
||||
INSERT INTO t2 VALUES (6,0);
|
||||
INSERT INTO t2 VALUES (7,0);
|
||||
INSERT INTO t2 VALUES (8,0);
|
||||
INSERT INTO t2 VALUES (9,0);
|
||||
INSERT INTO t2 VALUES (10,0);
|
||||
INSERT INTO t2 VALUES (11,0);
|
||||
INSERT INTO t2 VALUES (12,0);
|
||||
INSERT INTO t2 VALUES (13,0);
|
||||
INSERT INTO t2 VALUES (14,0);
|
||||
INSERT INTO t2 VALUES (15,0);
|
||||
INSERT INTO t2 VALUES (16,0);
|
||||
INSERT INTO t2 VALUES (17,0);
|
||||
INSERT INTO t2 VALUES (18,0);
|
||||
INSERT INTO t2 VALUES (19,0);
|
||||
--save_master_pos
|
||||
|
||||
--connection server_2
|
||||
|
||||
--connect (s1, 127.0.0.1, root,, test, $SLAVE_MYPORT,)
|
||||
# Block one transaction on a row lock.
|
||||
BEGIN;
|
||||
SELECT * FROM t2 WHERE a=2 FOR UPDATE;
|
||||
|
||||
--connection server_2
|
||||
|
||||
# Wait for slave thread of the other transaction to have the commit lock.
|
||||
--source include/start_slave.inc
|
||||
--let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE state = "Waiting for prior transaction to commit"
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connect (s2, 127.0.0.1, root,, test, $SLAVE_MYPORT,)
|
||||
send FLUSH TABLES WITH READ LOCK;
|
||||
# The bug was that at this point we were deadlocked.
|
||||
# The FTWRL command would wait forever for T2 to commit.
|
||||
# T2 would wait for T1 to commit first, but T1 is waiting for
|
||||
# the global read lock to be released.
|
||||
|
||||
--connection s1
|
||||
# Release the lock that blocs T1 from replicating.
|
||||
COMMIT;
|
||||
|
||||
--connection s1
|
||||
send STOP SLAVE;
|
||||
|
||||
--connection s2
|
||||
reap;
|
||||
|
||||
--connection server_1
|
||||
SELECT * FROM t2 ORDER BY a;
|
||||
|
||||
--connection s2
|
||||
UNLOCK TABLES;
|
||||
|
||||
SELECT "after UNLOCK TABLES" as state;
|
||||
|
||||
--connection s1
|
||||
reap;
|
||||
|
||||
SELECT "after reap of STOP SLAVE" as state;
|
||||
|
||||
--connection server_2
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
--source include/start_slave.inc
|
||||
--sync_with_master
|
||||
|
||||
SELECT * FROM t2 ORDER BY a;
|
||||
|
||||
|
||||
|
||||
--echo *** MDEV-8318: Assertion `!pool->busy' failed in pool_mark_busy(rpl_parallel_thread_pool*) on concurrent FTWRL ***
|
||||
|
||||
--connection server_1
|
||||
LOCK TABLE t2 WRITE;
|
||||
|
||||
|
||||
--connect (m1,localhost,root,,test)
|
||||
--connection m1
|
||||
--let $cid=`SELECT CONNECTION_ID()`
|
||||
send FLUSH TABLES WITH READ LOCK;
|
||||
|
||||
--connect (m2,localhost,root,,test)
|
||||
# We cannot force the race with DEBUG_SYNC, because the race does not
|
||||
# exist after fixing the bug. At best we could force a debug sync to
|
||||
# time out, which is effectively just a sleep.
|
||||
# So just put a small sleep here; it is enough to trigger the bug in
|
||||
# most run before the bug fix, and the code should work correctly
|
||||
# however the thread scheduling happens.
|
||||
--sleep 0.1
|
||||
send FLUSH TABLES WITH READ LOCK;
|
||||
|
||||
--connection server_1
|
||||
--replace_result $cid CID
|
||||
eval KILL QUERY $cid;
|
||||
|
||||
--connection m1
|
||||
--error ER_QUERY_INTERRUPTED
|
||||
reap;
|
||||
|
||||
--connection server_1
|
||||
UNLOCK TABLES;
|
||||
|
||||
--connection m2
|
||||
reap;
|
||||
UNLOCK TABLES;
|
||||
|
||||
|
||||
# Clean up.
|
||||
--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;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--source include/rpl_end.inc
|
||||
|
||||
@@ -53,5 +53,12 @@ if(`select TIMESTAMPDIFF(SECOND,@time_after_kill, @time_before_kill) > 60`)
|
||||
|
||||
START SLAVE IO_THREAD;
|
||||
|
||||
# Ensure that the slave io thread started properly
|
||||
connection master;
|
||||
create table t1 (a int primary key);
|
||||
sync_slave_with_master;
|
||||
connection master;
|
||||
drop table t1;
|
||||
|
||||
# End of test
|
||||
--source include/rpl_end.inc
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# tables. Specifically when drop temporary tables and create temporary tables
|
||||
# are used.
|
||||
###################################################################################
|
||||
--source include/big_test.inc
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/master-slave.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
@@ -27,5 +27,7 @@ reset slave;
|
||||
set global rpl_semi_sync_slave_enabled = OFF;
|
||||
--connection master
|
||||
drop table t1;
|
||||
--sync_slave_with_master
|
||||
--connection master
|
||||
set global rpl_semi_sync_master_enabled = OFF;
|
||||
--source include/rpl_end.inc
|
||||
|
||||
Reference in New Issue
Block a user