mirror of
https://github.com/MariaDB/server.git
synced 2025-08-26 01:44:06 +03:00
10.0-base merge
This commit is contained in:
@@ -7,6 +7,7 @@ SET GLOBAL slave_parallel_threads=10;
|
||||
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||
include/start_slave.inc
|
||||
*** Test long-running query in domain 1 can run in parallel with short queries in domain 0 ***
|
||||
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);
|
||||
@@ -259,6 +260,416 @@ SET GLOBAL binlog_format=@old_format;
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
include/start_slave.inc
|
||||
*** Test killing slave threads at various wait points ***
|
||||
*** 1. Test killing transaction waiting in commit for previous transaction to commit ***
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (31, foo(31,
|
||||
'commit_before_prepare_ordered WAIT_FOR t2_waiting',
|
||||
'commit_after_prepare_ordered SIGNAL t1_ready WAIT_FOR t1_cont'));
|
||||
SET debug_sync='now WAIT_FOR master_queued1';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2';
|
||||
SET binlog_format=statement;
|
||||
BEGIN;
|
||||
INSERT INTO t3 VALUES (32, foo(32,
|
||||
'ha_write_row_end SIGNAL t2_query WAIT_FOR t2_cont',
|
||||
''));
|
||||
INSERT INTO t3 VALUES (33, foo(33,
|
||||
'group_commit_waiting_for_prior SIGNAL t2_waiting',
|
||||
'group_commit_waiting_for_prior_killed SIGNAL t2_killed'));
|
||||
COMMIT;
|
||||
SET debug_sync='now WAIT_FOR master_queued2';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (34, foo(34,
|
||||
'',
|
||||
''));
|
||||
SET debug_sync='now WAIT_FOR master_queued3';
|
||||
SET debug_sync='now SIGNAL master_cont1';
|
||||
SELECT * FROM t3 WHERE a >= 30 ORDER BY a;
|
||||
a b
|
||||
31 31
|
||||
32 32
|
||||
33 33
|
||||
34 34
|
||||
SET sql_log_bin=0;
|
||||
CALL mtr.add_suppression("Query execution was interrupted");
|
||||
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||
CALL mtr.add_suppression("Slave: Connection was killed");
|
||||
SET sql_log_bin=1;
|
||||
SET debug_sync='now WAIT_FOR t2_query';
|
||||
SET debug_sync='now SIGNAL t2_cont';
|
||||
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,1963]
|
||||
STOP SLAVE IO_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 30 ORDER BY a;
|
||||
a b
|
||||
31 31
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
SET sql_log_bin=1;
|
||||
INSERT INTO t3 VALUES (39,0);
|
||||
include/start_slave.inc
|
||||
SELECT * FROM t3 WHERE a >= 30 ORDER BY a;
|
||||
a b
|
||||
31 31
|
||||
32 32
|
||||
33 33
|
||||
34 34
|
||||
39 0
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
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 GLOBAL binlog_format=@old_format;
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
include/start_slave.inc
|
||||
*** 2. Same as (1), but without restarting IO thread after kill of SQL threads ***
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (41, foo(41,
|
||||
'commit_before_prepare_ordered WAIT_FOR t2_waiting',
|
||||
'commit_after_prepare_ordered SIGNAL t1_ready WAIT_FOR t1_cont'));
|
||||
SET debug_sync='now WAIT_FOR master_queued1';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2';
|
||||
SET binlog_format=statement;
|
||||
BEGIN;
|
||||
INSERT INTO t3 VALUES (42, foo(42,
|
||||
'ha_write_row_end SIGNAL t2_query WAIT_FOR t2_cont',
|
||||
''));
|
||||
INSERT INTO t3 VALUES (43, foo(43,
|
||||
'group_commit_waiting_for_prior SIGNAL t2_waiting',
|
||||
'group_commit_waiting_for_prior_killed SIGNAL t2_killed'));
|
||||
COMMIT;
|
||||
SET debug_sync='now WAIT_FOR master_queued2';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (44, foo(44,
|
||||
'',
|
||||
''));
|
||||
SET debug_sync='now WAIT_FOR master_queued3';
|
||||
SET debug_sync='now SIGNAL master_cont1';
|
||||
SELECT * FROM t3 WHERE a >= 40 ORDER BY a;
|
||||
a b
|
||||
41 41
|
||||
42 42
|
||||
43 43
|
||||
44 44
|
||||
SET debug_sync='now WAIT_FOR t2_query';
|
||||
SET debug_sync='now SIGNAL t2_cont';
|
||||
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,1963]
|
||||
SELECT * FROM t3 WHERE a >= 40 ORDER BY a;
|
||||
a b
|
||||
41 41
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
SET sql_log_bin=1;
|
||||
INSERT INTO t3 VALUES (49,0);
|
||||
START SLAVE SQL_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 40 ORDER BY a;
|
||||
a b
|
||||
41 41
|
||||
42 42
|
||||
43 43
|
||||
44 44
|
||||
49 0
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
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 GLOBAL binlog_format=@old_format;
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
include/start_slave.inc
|
||||
*** 3. Same as (2), but not using gtid mode ***
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO master_use_gtid=no;
|
||||
include/start_slave.inc
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (51, foo(51,
|
||||
'commit_before_prepare_ordered WAIT_FOR t2_waiting',
|
||||
'commit_after_prepare_ordered SIGNAL t1_ready WAIT_FOR t1_cont'));
|
||||
SET debug_sync='now WAIT_FOR master_queued1';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2';
|
||||
SET binlog_format=statement;
|
||||
BEGIN;
|
||||
INSERT INTO t3 VALUES (52, foo(52,
|
||||
'ha_write_row_end SIGNAL t2_query WAIT_FOR t2_cont',
|
||||
''));
|
||||
INSERT INTO t3 VALUES (53, foo(53,
|
||||
'group_commit_waiting_for_prior SIGNAL t2_waiting',
|
||||
'group_commit_waiting_for_prior_killed SIGNAL t2_killed'));
|
||||
COMMIT;
|
||||
SET debug_sync='now WAIT_FOR master_queued2';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (54, foo(54,
|
||||
'',
|
||||
''));
|
||||
SET debug_sync='now WAIT_FOR master_queued3';
|
||||
SET debug_sync='now SIGNAL master_cont1';
|
||||
SELECT * FROM t3 WHERE a >= 50 ORDER BY a;
|
||||
a b
|
||||
51 51
|
||||
52 52
|
||||
53 53
|
||||
54 54
|
||||
SET debug_sync='now WAIT_FOR t2_query';
|
||||
SET debug_sync='now SIGNAL t2_cont';
|
||||
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,1963]
|
||||
SELECT * FROM t3 WHERE a >= 50 ORDER BY a;
|
||||
a b
|
||||
51 51
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
SET sql_log_bin=1;
|
||||
INSERT INTO t3 VALUES (59,0);
|
||||
START SLAVE SQL_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 50 ORDER BY a;
|
||||
a b
|
||||
51 51
|
||||
52 52
|
||||
53 53
|
||||
54 54
|
||||
59 0
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
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
|
||||
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||
include/start_slave.inc
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL binlog_format=@old_format;
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=3;
|
||||
include/start_slave.inc
|
||||
*** 4. Test killing thread that is waiting to start transaction until previous transaction commits ***
|
||||
SET binlog_format=statement;
|
||||
SET gtid_domain_id=2;
|
||||
INSERT INTO t3 VALUES (60, foo(60,
|
||||
'ha_write_row_end SIGNAL d2_query WAIT_FOR d2_cont2',
|
||||
'rpl_parallel_end_of_group SIGNAL d2_done WAIT_FOR d2_cont'));
|
||||
SET gtid_domain_id=0;
|
||||
SET debug_sync='now WAIT_FOR d2_query';
|
||||
SET gtid_domain_id=1;
|
||||
BEGIN;
|
||||
INSERT INTO t3 VALUES (61, foo(61,
|
||||
'rpl_parallel_start_waiting_for_prior SIGNAL t3_waiting',
|
||||
'rpl_parallel_start_waiting_for_prior_killed SIGNAL t3_killed'));
|
||||
INSERT INTO t3 VALUES (62, foo(62,
|
||||
'ha_write_row_end SIGNAL d1_query WAIT_FOR d1_cont2',
|
||||
'rpl_parallel_end_of_group SIGNAL d1_done WAIT_FOR d1_cont'));
|
||||
COMMIT;
|
||||
SET gtid_domain_id=0;
|
||||
SET debug_sync='now WAIT_FOR d1_query';
|
||||
SET gtid_domain_id=0;
|
||||
INSERT INTO t3 VALUES (63, foo(63,
|
||||
'ha_write_row_end SIGNAL d0_query WAIT_FOR d0_cont2',
|
||||
'rpl_parallel_end_of_group SIGNAL d0_done WAIT_FOR d0_cont'));
|
||||
SET debug_sync='now WAIT_FOR d0_query';
|
||||
SET debug_sync='now SIGNAL d2_cont2';
|
||||
SET debug_sync='now WAIT_FOR d2_done';
|
||||
SET debug_sync='now SIGNAL d1_cont2';
|
||||
SET debug_sync='now WAIT_FOR d1_done';
|
||||
SET debug_sync='now SIGNAL d0_cont2';
|
||||
SET debug_sync='now WAIT_FOR d0_done';
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (64, foo(64,
|
||||
'commit_before_prepare_ordered SIGNAL t1_waiting WAIT_FOR t1_cont', ''));
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued2 WAIT_FOR master_cont2';
|
||||
INSERT INTO t3 VALUES (65, foo(65, '', ''));
|
||||
SET debug_sync='now WAIT_FOR master_queued2';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued3';
|
||||
INSERT INTO t3 VALUES (66, foo(66, '', ''));
|
||||
SET debug_sync='now WAIT_FOR master_queued3';
|
||||
SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued4';
|
||||
INSERT INTO t3 VALUES (67, foo(67, '', ''));
|
||||
SET debug_sync='now WAIT_FOR master_queued4';
|
||||
SET debug_sync='now SIGNAL master_cont2';
|
||||
SELECT * FROM t3 WHERE a >= 60 ORDER BY a;
|
||||
a b
|
||||
60 60
|
||||
61 61
|
||||
62 62
|
||||
63 63
|
||||
64 64
|
||||
65 65
|
||||
66 66
|
||||
67 67
|
||||
SET debug_sync='now SIGNAL d0_cont';
|
||||
SET debug_sync='now WAIT_FOR t1_waiting';
|
||||
SET debug_sync='now SIGNAL d1_cont';
|
||||
SET debug_sync='now WAIT_FOR t3_waiting';
|
||||
SET debug_sync='now SIGNAL d2_cont';
|
||||
KILL THD_ID;
|
||||
SET debug_sync='now WAIT_FOR t3_killed';
|
||||
SET debug_sync='now SIGNAL t1_cont';
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1927,1963]
|
||||
STOP SLAVE IO_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 60 ORDER BY a;
|
||||
a b
|
||||
60 60
|
||||
61 61
|
||||
62 62
|
||||
63 63
|
||||
64 64
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
CREATE FUNCTION foo(x INT, d1 VARCHAR(500), d2 VARCHAR(500))
|
||||
RETURNS INT DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN x;
|
||||
END
|
||||
||
|
||||
SET sql_log_bin=1;
|
||||
INSERT INTO t3 VALUES (69,0);
|
||||
include/start_slave.inc
|
||||
SELECT * FROM t3 WHERE a >= 60 ORDER BY a;
|
||||
a b
|
||||
60 60
|
||||
61 61
|
||||
62 62
|
||||
63 63
|
||||
64 64
|
||||
65 65
|
||||
66 66
|
||||
67 67
|
||||
69 0
|
||||
SET sql_log_bin=0;
|
||||
DROP FUNCTION foo;
|
||||
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 GLOBAL binlog_format=@old_format;
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
include/start_slave.inc
|
||||
*** 5. Test killing thread that is waiting for queue of max length to shorten ***
|
||||
SET @old_max_queued= @@GLOBAL.slave_parallel_max_queued;
|
||||
SET GLOBAL slave_parallel_max_queued=9000;
|
||||
SET binlog_format=statement;
|
||||
INSERT INTO t3 VALUES (70, foo(0,
|
||||
'ha_write_row_end SIGNAL query_waiting WAIT_FOR query_cont', ''));
|
||||
SET debug_sync='now WAIT_FOR query_waiting';
|
||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||
SET GLOBAL debug_dbug="+d,rpl_parallel_wait_queue_max";
|
||||
INSERT INTO t3 VALUES (72, 0);
|
||||
SELECT * FROM t3 WHERE a >= 70 ORDER BY a;
|
||||
a b
|
||||
70 0
|
||||
71 10000
|
||||
72 0
|
||||
SET debug_sync='now WAIT_FOR wait_queue_ready';
|
||||
KILL THD_ID;
|
||||
SET debug_sync='now WAIT_FOR wait_queue_killed';
|
||||
SET debug_sync='now SIGNAL query_cont';
|
||||
include/wait_for_slave_sql_error.inc [errno=1317,1927,1963]
|
||||
STOP SLAVE IO_THREAD;
|
||||
SELECT * FROM t3 WHERE a >= 70 ORDER BY a;
|
||||
a b
|
||||
70 0
|
||||
71 10000
|
||||
SET GLOBAL debug_dbug=@old_dbug;
|
||||
SET GLOBAL slave_parallel_max_queued= @old_max_queued;
|
||||
INSERT INTO t3 VALUES (73,0);
|
||||
include/start_slave.inc
|
||||
SELECT * FROM t3 WHERE a >= 70 ORDER BY a;
|
||||
a b
|
||||
70 0
|
||||
71 10000
|
||||
72 0
|
||||
73 0
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL binlog_format=@old_format;
|
||||
SET GLOBAL slave_parallel_threads=0;
|
||||
SET GLOBAL slave_parallel_threads=10;
|
||||
include/start_slave.inc
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL slave_parallel_threads=@old_parallel_threads;
|
||||
include/start_slave.inc
|
||||
|
Reference in New Issue
Block a user