Commit c0ea3056 authored by Andrei Elkin's avatar Andrei Elkin Committed by Monty

MDEV-13073. This is a part with a new test (refined Ali's

one) and affected result files.

Specifically to rpl_semi_sync_after_sync*, the changed results reflect
a fact that thanks to fixes in the dump thread functionality
there's no longer zombie thread to kill neither such thread represent
a semisync client (so the counter drops).
parent 74b35b68
......@@ -1014,9 +1014,15 @@ The following options may be given as the first argument:
Should transaction wait for semi-sync ack after having
synced binlog, or after having committed in storage
engine.. One of: AFTER_SYNC, AFTER_COMMIT
--rpl-semi-sync-slave-delay-master
Only write master info file when ack is needed.
--rpl-semi-sync-slave-enabled
Enable semi-synchronous replication slave (disabled by
default).
--rpl-semi-sync-slave-kill-conn-timeout[=#]
Timeout for the mysql connection used to kill the slave
io_thread's connection on master. This timeout comes into
play when stop slave is executed.
--rpl-semi-sync-slave-trace-level=#
The tracing level for semi-sync replication.
--safe-mode Skip some optimize stages (for testing). Deprecated.
......@@ -1595,7 +1601,9 @@ rpl-semi-sync-master-timeout 10000
rpl-semi-sync-master-trace-level 32
rpl-semi-sync-master-wait-no-slave TRUE
rpl-semi-sync-master-wait-point AFTER_COMMIT
rpl-semi-sync-slave-delay-master FALSE
rpl-semi-sync-slave-enabled FALSE
rpl-semi-sync-slave-kill-conn-timeout 5
rpl-semi-sync-slave-trace-level 32
safe-user-create FALSE
secure-auth TRUE
......
include/master-slave.inc
[connection master]
CALL mtr.add_suppression("Failed to start semi-sync ACK receiver thread.*");
CALL mtr.add_suppression("Failed to register slave to semi-sync ACK receiver thread.*");
CALL mtr.add_suppression("Failed to stop ack receiver thread on pthread_join.*");
CALL mtr.add_suppression("Got an error reading communication packets:*");
CALL mtr.add_suppression("Timeout waiting for reply of binlog*");
CALL mtr.add_suppression("slaveReadSyncHeader*");
CALL mtr.add_suppression("Missing magic number for semi-sync*");
CALL mtr.add_suppression("Got timeout reading communication packets*");
CALL mtr.add_suppression("Failed to call*");
CALL mtr.add_suppression("Execution failed on master*");
CALL mtr.add_suppression("Failed on request_dump()*");
CALL mtr.add_suppression("Semi-sync master failed on*");
CALL mtr.add_suppression("Master command COM_BINLOG_DUMP failed*");
CALL mtr.add_suppression("on master failed*");
CALL mtr.add_suppression("Master server does not support semi-sync*");
CALL mtr.add_suppression("Semi-sync slave net_flush*");
CALL mtr.add_suppression("Failed to flush master info*");
CALL mtr.add_suppression("Request to stop slave SQL Thread received while apply*");
connection master;
[ enable semi-sync on master ]
set global rpl_semi_sync_master_enabled = 1;
show variables like 'rpl_semi_sync_master_enabled';
Variable_name Value
rpl_semi_sync_master_enabled ON
connection slave;
[ enable semi-sync on slave ]
stop slave;
set global rpl_semi_sync_slave_enabled = 1;
start slave;
show status like 'rpl_semi_sync_slave%';
Variable_name Value
Rpl_semi_sync_slave_send_ack 0
Rpl_semi_sync_slave_status ON
connection master;
CREATE TABLE t1(a INT) ENGINE=InnoDB;
connection slave;
connection master;
connect con1,localhost,root,,;
connect con2,localhost,root,,;
connect con3,localhost,root,,;
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
show status like "rpl_semi_sync_master_yes_tx";
Variable_name Value
Rpl_semi_sync_master_yes_tx 1
#########################################
# Test rpl_semi_sync_master_wait_point #
#########################################
# Test after_sync and after_commit first.
#Test after_sync
connection con1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000000;
SET GLOBAL rpl_semi_sync_master_wait_point= 'AFTER_SYNC';
SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL after_sync_done WAIT_FOR end";
INSERT into t1 values (1);;
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR after_sync_done";
connection slave;
#slave can see record (1) after sync slave with master
select * from t1;
a
1
connection con2;
#con2 shouldn't see record (1)
select * from t1;
a
SET DEBUG_SYNC= "now SIGNAL end";
connection con1;
connection con1;
select * from t1;
a
1
truncate table t1;
connection slave;
connection con1;
SET DEBUG_SYNC= 'reset';
SET DEBUG_SYNC= "commit_before_get_LOCK_log SIGNAL before_fetch_done WAIT_FOR more_queue";
INSERT into t1 VALUES (1);;
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR before_fetch_done";
SET DEBUG_SYNC= "after_semisync_queue SIGNAL more_queue";
INSERT INTO t1 VALUES (2);
connection con1;
connection con1;
SET DEBUG_SYNC= 'reset';
SET DEBUG_SYNC= "commit_before_get_LOCK_log SIGNAL before_fetch_done WAIT_FOR disable_semisync";
INSERT into t1 VALUES (3);;
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR before_fetch_done";
SET GLOBAL rpl_semi_sync_master_enabled= 0;
SET DEBUG_SYNC= "now SIGNAL disable_semisync";
connection con1;
SET GLOBAL rpl_semi_sync_master_enabled = 1;
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
#Test after_commit
connection con1;
SET GLOBAL rpl_semi_sync_master_wait_point= 'AFTER_COMMIT';
SET DEBUG_SYNC= "after_group_after_commit SIGNAL after_commit_done WAIT_FOR end";
INSERT into t1 values (4);;
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR after_commit_done";
connection slave;
select * from t1;
a
1
2
3
4
connection con2;
select * from t1;
a
1
2
3
4
SET DEBUG_SYNC= "now SIGNAL end";
connection con1;
connection con1;
select * from t1;
a
1
2
3
4
truncate table t1;
#######################################################
# Test some other options in order to cover the patch #
#######################################################
connection slave;
# Test rpl_semi_sync_slave_trace_level
SET GLOBAL rpl_semi_sync_slave_trace_level= 1;
SET GLOBAL rpl_semi_sync_slave_trace_level= 16;
SET GLOBAL rpl_semi_sync_slave_trace_level= 64;
SET GLOBAL rpl_semi_sync_slave_trace_level= 128;
SET GLOBAL rpl_semi_sync_slave_trace_level= 32;
connection master;
# Test rpl_semi_sync_master_trace_level
SET GLOBAL rpl_semi_sync_master_trace_level= 1;
SET GLOBAL rpl_semi_sync_master_trace_level= 16;
SET GLOBAL rpl_semi_sync_master_trace_level= 64;
SET GLOBAL rpl_semi_sync_master_trace_level= 128;
SET GLOBAL rpl_semi_sync_master_trace_level= 32;
# Test rpl_semi_sync_master_timeout
SET GLOBAL rpl_semi_sync_master_timeout= 1000;
SET GLOBAL rpl_semi_sync_master_timeout= 10000;
SET GLOBAL rpl_semi_sync_master_timeout = 1000000;
# Test rpl_semi_sync_slave_kill_conn_timeout
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 10;
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 20;
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 60;
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 5;
############################################
# Test rpl_semi_sync_master_wait_no_slave #
############################################
SET GLOBAL rpl_semi_sync_master_wait_no_slave = 1;
connection slave;
STOP SLAVE IO_THREAD;
include/wait_for_slave_io_to_stop.inc
connection con1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000;
INSERT INTO t1 values (1);;
connection con1;
# Rpl_semi_sync_master_no_tx should be non-zero
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx'
connection slave;
START SLAVE IO_THREAD;
include/wait_for_slave_io_to_start.inc
connection con1;
INSERT INTO t1 values (2);
connection slave;
connection con1;
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
show status like 'Rpl_semi_sync_master_status';
Variable_name Value
Rpl_semi_sync_master_status ON
connection slave;
STOP SLAVE IO_THREAD;
include/wait_for_slave_io_to_stop.inc
connection con1;
SET GLOBAL rpl_semi_sync_master_wait_no_slave= 0;
SET GLOBAL rpl_semi_sync_master_timeout= 1000000000;
INSERT INTO t1 values (3);
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 0
show status like 'Rpl_semi_sync_master_status';
Variable_name Value
Rpl_semi_sync_master_status OFF
connection slave;
START SLAVE IO_THREAD;
include/wait_for_slave_io_to_start.inc
connection con1;
SET GLOBAL rpl_semi_sync_master_timeout= 10000000;
SET GLOBAL rpl_semi_sync_master_wait_no_slave= 1;
INSERT INTO t1 values (4);
connection slave;
connection con1;
show status like 'Rpl_semi_sync_master_status';
Variable_name Value
Rpl_semi_sync_master_status ON
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
##########################################
# Test rpl_semi_sync_slave_delay_master #
##########################################
connection slave;
SET GLOBAL rpl_semi_sync_slave_delay_master= 1;
START SLAVE IO_THREAD;
Warnings:
Note 1254 Slave is already running
include/wait_for_slave_io_to_start.inc
connection con1;
INSERT INTO t1 values (3);
include/sync_slave_io_with_master.inc
connection con1;
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
show status like 'Rpl_semi_sync_master_status';
Variable_name Value
Rpl_semi_sync_master_status ON
connection slave;
connection slave;
select * from t1 order by a;
a
1
2
3
3
4
connection con1;
select * from t1 order by a;
a
1
2
3
3
4
connection slave;
SET GLOBAL rpl_semi_sync_slave_delay_master = 0;
STOP SLAVE IO_THREAD;
include/wait_for_slave_io_to_stop.inc
START SLAVE IO_THREAD;
include/wait_for_slave_io_to_start.inc
##########################################################
# Test rpl_semi_sync_master_enabled and new ACK thread #
#########################################################
connection con1;
SET GLOBAL rpl_semi_sync_master_enabled = 0;
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
INSERT INTO t1 VALUES (1);
SET GLOBAL rpl_semi_sync_master_enabled = 1;
INSERT INTO t1 VALUES (2);
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
# Test failure of select error .
SET GLOBAL debug = 'd,rpl_semisync_simulate_select_error';
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
INSERT INTO t1 VALUES(3);
connection slave;
connection con1;
# Test failure of pthread_create
SET GLOBAL rpl_semi_sync_master_enabled = 0;
SET GLOBAL debug = 'd,rpl_semisync_simulate_create_thread_failure';
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
SET GLOBAL rpl_semi_sync_master_enabled= ON;
SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';
Variable_name Value
rpl_semi_sync_master_enabled OFF
# Test failure of pthread_join
SET GLOBAL DEBUG = 'd,rpl_semisync_simulate_thread_join_failure';
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
SET GLOBAL rpl_semi_sync_master_enabled= ON;
SET GLOBAL rpl_semi_sync_master_enabled= OFF;
#
# Failure on registering semisync slave
#
SET GLOBAL debug= 'd,rpl_semisync_simulate_add_slave_failure';
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
SET GLOBAL rpl_semi_sync_master_enabled= ON;
connection slave;
STOP SLAVE IO_THREAD;
include/wait_for_slave_io_to_stop.inc
START SLAVE IO_THREAD;
include/wait_for_slave_io_to_start.inc
connection con1;
# Should be Zero.
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 0
SET GLOBAL debug='';
Warnings:
Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead
connection slave;
START SLAVE IO_THREAD;
include/wait_for_slave_io_to_start.inc
connection con1;
connection slave;
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 0
##################################################################
# Test fixing of BUG#70669 #
#SLAVE CAN'T CONTINUE REPLICATION AFTER MASTER'S CRASH RECOVERY #
#################################################################
connection con1;
SET GLOBAL sync_binlog = 1;
CREATE TABLE t2 (c1 INT);
connection slave;
connection con1;
INSERT INTO t2 values (1);
connection slave;
SELECT * FROM t2;
c1
1
connection con2;
connection con1;
connection slave;
show tables like 't2';
Tables_in_test (t2)
t2
select * from t2;
c1
1
connection con1;
INSERT INTO t2 VALUES (2);
connection con2;
INSERT INTO t2 VALUES (3);
connection con1;
connection con2;
connection con1;
SET GLOBAL sync_binlog = 0;
DROP TABLE t2;
connection con2;
connection slave;
show tables like 't2';
Tables_in_test (t2)
connection con2;
#cleanup
connection master;
SET DEBUG_SYNC= 'reset';
disconnect con1;
disconnect con2;
disconnect con3;
SET GLOBAL rpl_semi_sync_master_timeout= 10000;
SET GLOBAL rpl_semi_sync_master_enabled = 0;
DROP TABLE t1;
connection slave;
SET GLOBAL rpl_semi_sync_slave_enabled = 0;
stop slave;
start slave;
include/rpl_end.inc
......@@ -5,6 +5,7 @@ connection master;
call mtr.add_suppression("Timeout waiting for reply of binlog");
call mtr.add_suppression("Read semi-sync reply");
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.");
call mtr.add_suppression("mysqld: Got an error reading communication packets");
connection slave;
call mtr.add_suppression("Master server does not support semi-sync");
call mtr.add_suppression("Semi-sync slave .* reply");
......@@ -177,7 +178,7 @@ Variable_name Value
Rpl_semi_sync_master_yes_tx 16
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
Rpl_semi_sync_master_clients 0
[ semi-sync replication of these transactions will fail ]
insert into t1 values (500);
[ master status should be OFF ]
......@@ -322,7 +323,6 @@ connection slave;
include/stop_slave.inc
reset slave;
connection master;
kill query _tid;
connection slave;
include/start_slave.inc
connection master;
......@@ -354,7 +354,6 @@ include/stop_slave.inc
reset slave;
connection master;
reset master;
kill query _tid;
set sql_log_bin=0;
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl_password';
flush privileges;
......@@ -405,7 +404,6 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
Variable_name Value
Rpl_semi_sync_slave_status OFF
connection master;
kill query _tid;
[ Semi-sync status on master should be ON ]
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
......
......@@ -5,6 +5,7 @@ connection master;
call mtr.add_suppression("Timeout waiting for reply of binlog");
call mtr.add_suppression("Read semi-sync reply");
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.");
call mtr.add_suppression("mysqld: Got an error reading communication packets");
connection slave;
call mtr.add_suppression("Master server does not support semi-sync");
call mtr.add_suppression("Semi-sync slave .* reply");
......@@ -177,7 +178,7 @@ Variable_name Value
Rpl_semi_sync_master_yes_tx 14
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
Rpl_semi_sync_master_clients 1
Rpl_semi_sync_master_clients 0
[ semi-sync replication of these transactions will fail ]
insert into t1 values (500);
[ master status should be OFF ]
......@@ -322,7 +323,6 @@ connection slave;
include/stop_slave.inc
reset slave;
connection master;
kill query _tid;
connection slave;
include/start_slave.inc
connection master;
......@@ -354,7 +354,6 @@ include/stop_slave.inc
reset slave;
connection master;
reset master;
kill query _tid;
set sql_log_bin=0;
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl_password';
flush privileges;
......@@ -405,7 +404,6 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
Variable_name Value
Rpl_semi_sync_slave_status OFF
connection master;
kill query _tid;
[ Semi-sync status on master should be ON ]
show status like 'Rpl_semi_sync_master_clients';
Variable_name Value
......
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/master-slave.inc
CALL mtr.add_suppression("Failed to start semi-sync ACK receiver thread.*");
CALL mtr.add_suppression("Failed to register slave to semi-sync ACK receiver thread.*");
CALL mtr.add_suppression("Failed to stop ack receiver thread on pthread_join.*");
CALL mtr.add_suppression("Got an error reading communication packets:*");
CALL mtr.add_suppression("Timeout waiting for reply of binlog*");
CALL mtr.add_suppression("slaveReadSyncHeader*");
CALL mtr.add_suppression("Missing magic number for semi-sync*");
CALL mtr.add_suppression("Got timeout reading communication packets*");
CALL mtr.add_suppression("Failed to call*");
CALL mtr.add_suppression("Execution failed on master*");
CALL mtr.add_suppression("Failed on request_dump()*");
CALL mtr.add_suppression("Semi-sync master failed on*");
CALL mtr.add_suppression("Master command COM_BINLOG_DUMP failed*");
CALL mtr.add_suppression("on master failed*");
CALL mtr.add_suppression("Master server does not support semi-sync*");
CALL mtr.add_suppression("Semi-sync slave net_flush*");
CALL mtr.add_suppression("Failed to flush master info*");
CALL mtr.add_suppression("Request to stop slave SQL Thread received while apply*");
connection master;
echo [ enable semi-sync on master ];
set global rpl_semi_sync_master_enabled = 1;
show variables like 'rpl_semi_sync_master_enabled';
connection slave;
echo [ enable semi-sync on slave ];
stop slave;
set global rpl_semi_sync_slave_enabled = 1;
start slave;
show status like 'rpl_semi_sync_slave%';
connection master;
CREATE TABLE t1(a INT) ENGINE=InnoDB;
sync_slave_with_master;
connection master;
connect(con1,localhost,root,,);
connect(con2,localhost,root,,);
connect(con3,localhost,root,,);
show status like 'Rpl_semi_sync_master_clients';
show status like "rpl_semi_sync_master_yes_tx";
--echo #########################################
--echo # Test rpl_semi_sync_master_wait_point #
--echo #########################################
--echo # Test after_sync and after_commit first.
--echo #Test after_sync
connection con1;
# Let's set a very large timeout value for testing purpose.
SET GLOBAL rpl_semi_sync_master_timeout = 1000000;
SET GLOBAL rpl_semi_sync_master_wait_point= 'AFTER_SYNC';
SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL after_sync_done WAIT_FOR end";
--send INSERT into t1 values (1);
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR after_sync_done";
sync_slave_with_master;
--echo #slave can see record (1) after sync slave with master
select * from t1;
connection con2;
--echo #con2 shouldn't see record (1)
select * from t1;
SET DEBUG_SYNC= "now SIGNAL end";
connection con1;
reap;
connection con1;
select * from t1;
truncate table t1;
sync_slave_with_master;
# Test more threads in one semisync queue
connection con1;
SET DEBUG_SYNC= 'reset';
SET DEBUG_SYNC= "commit_before_get_LOCK_log SIGNAL before_fetch_done WAIT_FOR more_queue";
#SET DEBUG_SYNC= "before_semisync_fetch SIGNAL before_fetch_done WAIT_FOR more_queue";
--send INSERT into t1 VALUES (1);
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR before_fetch_done";
SET DEBUG_SYNC= "after_semisync_queue SIGNAL more_queue";
INSERT INTO t1 VALUES (2);
connection con1;
reap;
# Test more threads in one semisync queue, but disable semisync before
# waiting.
connection con1;
SET DEBUG_SYNC= 'reset';
SET DEBUG_SYNC= "commit_before_get_LOCK_log SIGNAL before_fetch_done WAIT_FOR disable_semisync";
#SET DEBUG_SYNC= "before_semisync_fetch SIGNAL before_fetch_done WAIT_FOR more_queue";
#SET DEBUG_SYNC= "before_semisync_fetch SIGNAL before_fetch_done WAIT_FOR disable_semisync";
--send INSERT into t1 VALUES (3);
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR before_fetch_done";
SET GLOBAL rpl_semi_sync_master_enabled= 0;
SET DEBUG_SYNC= "now SIGNAL disable_semisync";
connection con1;
reap;
SET GLOBAL rpl_semi_sync_master_enabled = 1;
show status like 'Rpl_semi_sync_master_clients';
--echo #Test after_commit
connection con1;
SET GLOBAL rpl_semi_sync_master_wait_point= 'AFTER_COMMIT';
SET DEBUG_SYNC= "after_group_after_commit SIGNAL after_commit_done WAIT_FOR end";
--send INSERT into t1 values (4);
connection con2;
SET DEBUG_SYNC= "now WAIT_FOR after_commit_done";
sync_slave_with_master;
select * from t1;
connection con2;
select * from t1;
SET DEBUG_SYNC= "now SIGNAL end";
connection con1;
reap;
connection con1;
select * from t1;
truncate table t1;
--echo #######################################################
--echo # Test some other options in order to cover the patch #
--echo #######################################################
connection slave;
--echo # Test rpl_semi_sync_slave_trace_level
SET GLOBAL rpl_semi_sync_slave_trace_level= 1;
SET GLOBAL rpl_semi_sync_slave_trace_level= 16;
SET GLOBAL rpl_semi_sync_slave_trace_level= 64;
SET GLOBAL rpl_semi_sync_slave_trace_level= 128;
SET GLOBAL rpl_semi_sync_slave_trace_level= 32;
connection master;
--echo # Test rpl_semi_sync_master_trace_level
SET GLOBAL rpl_semi_sync_master_trace_level= 1;
SET GLOBAL rpl_semi_sync_master_trace_level= 16;
SET GLOBAL rpl_semi_sync_master_trace_level= 64;
SET GLOBAL rpl_semi_sync_master_trace_level= 128;
SET GLOBAL rpl_semi_sync_master_trace_level= 32;
--echo # Test rpl_semi_sync_master_timeout
SET GLOBAL rpl_semi_sync_master_timeout= 1000;
SET GLOBAL rpl_semi_sync_master_timeout= 10000;
SET GLOBAL rpl_semi_sync_master_timeout = 1000000;
--echo # Test rpl_semi_sync_slave_kill_conn_timeout
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 10;
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 20;
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 60;
SET GLOBAL rpl_semi_sync_slave_kill_conn_timeout= 5;
--echo ############################################
--echo # Test rpl_semi_sync_master_wait_no_slave #
--echo ############################################
SET GLOBAL rpl_semi_sync_master_wait_no_slave = 1;
connection slave;
STOP SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_stop.inc
connection con1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000;
--send INSERT INTO t1 values (1);
connection con1;
reap;
echo # Rpl_semi_sync_master_no_tx should be non-zero
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';
# test rpl_semi_sync_master_wait_no_slave = 0
connection slave;
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc
connection con1;
INSERT INTO t1 values (2);
sync_slave_with_master;
connection con1;
show status like 'Rpl_semi_sync_master_clients';
show status like 'Rpl_semi_sync_master_status';
connection slave;
STOP SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_stop.inc
connection con1;
SET GLOBAL rpl_semi_sync_master_wait_no_slave= 0;
SET GLOBAL rpl_semi_sync_master_timeout= 1000000000;
INSERT INTO t1 values (3);
show status like 'Rpl_semi_sync_master_clients';
show status like 'Rpl_semi_sync_master_status';
connection slave;
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc
connection con1;
SET GLOBAL rpl_semi_sync_master_timeout= 10000000;
SET GLOBAL rpl_semi_sync_master_wait_no_slave= 1;
INSERT INTO t1 values (4);
sync_slave_with_master;
connection con1;
show status like 'Rpl_semi_sync_master_status';
show status like 'Rpl_semi_sync_master_clients';
--echo ##########################################
--echo # Test rpl_semi_sync_slave_delay_master #
--echo ##########################################
connection slave;
SET GLOBAL rpl_semi_sync_slave_delay_master= 1;
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc
connection con1;
INSERT INTO t1 values (3);
--source include/sync_slave_io_with_master.inc
connection con1;
show status like 'Rpl_semi_sync_master_clients';
show status like 'Rpl_semi_sync_master_status';
sync_slave_with_master;
connection slave;
select * from t1 order by a;
connection con1;
select * from t1 order by a;
connection slave;
SET GLOBAL rpl_semi_sync_slave_delay_master = 0;
STOP SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_stop.inc
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc
--echo ##########################################################
--echo # Test rpl_semi_sync_master_enabled and new ACK thread #
--echo #########################################################
connection con1;
SET GLOBAL rpl_semi_sync_master_enabled = 0;
show status like 'Rpl_semi_sync_master_clients';
INSERT INTO t1 VALUES (1);
SET GLOBAL rpl_semi_sync_master_enabled = 1;
INSERT INTO t1 VALUES (2);
show status like 'Rpl_semi_sync_master_clients';
--echo # Test failure of select error .
SET GLOBAL debug = 'd,rpl_semisync_simulate_select_error';
# It can still receive ACK from semi-sync slave
INSERT INTO t1 VALUES(3);
sync_slave_with_master;
connection con1;
--echo # Test failure of pthread_create
SET GLOBAL rpl_semi_sync_master_enabled = 0;
SET GLOBAL debug = 'd,rpl_semisync_simulate_create_thread_failure';
SET GLOBAL rpl_semi_sync_master_enabled= ON;
--sleep 3
SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';
--echo # Test failure of pthread_join
SET GLOBAL DEBUG = 'd,rpl_semisync_simulate_thread_join_failure';
SET GLOBAL rpl_semi_sync_master_enabled= ON;
--sleep 3
SET GLOBAL rpl_semi_sync_master_enabled= OFF;
--sleep 3
--echo #
--echo # Failure on registering semisync slave
--echo #
SET GLOBAL debug= 'd,rpl_semisync_simulate_add_slave_failure';
SET GLOBAL rpl_semi_sync_master_enabled= ON;
connection slave;
STOP SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_stop.inc
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc
connection con1;
--echo # Should be Zero.
show status like 'Rpl_semi_sync_master_clients';
SET GLOBAL debug='';
connection slave;
--disable_warnings
START SLAVE IO_THREAD;
--source include/wait_for_slave_io_to_start.inc
--enable_warnings
connection con1;
sync_slave_with_master;
show status like 'Rpl_semi_sync_master_clients';
--echo ##################################################################
--echo # Test fixing of BUG#70669 #
--echo #SLAVE CAN'T CONTINUE REPLICATION AFTER MASTER'S CRASH RECOVERY #
--echo #################################################################
connection con1;
SET GLOBAL sync_binlog = 1;
CREATE TABLE t2 (c1 INT);
sync_slave_with_master;
connection con1;
# Block the session before its events are synced to disk
#SET DEBUG_SYNC = 'before_sync_binlog_file SIGNAL before_sync_done WAIT_FOR continue';
send INSERT INTO t2 values (1);
--sleep 3
connection slave;
SELECT * FROM t2;
connection con2;
#SET DEBUG_SYNC= "now WAIT_FOR before_sync_done";
#SET DEBUG_SYNC = "now SIGNAL continue";
connection con1;
reap;
sync_slave_with_master;
show tables like 't2';
select * from t2;
connection con1;
#SET DEBUG_SYNC= "before_update_pos SIGNAL leader_ready WAIT_FOR follower_ready";
send INSERT INTO t2 VALUES (2);
connection con2;
#SET DEBUG_SYNC= "now WAIT_FOR leader_ready";
#SET DEBUG_SYNC= "after_sync_queue SIGNAL follower_ready";
send INSERT INTO t2 VALUES (3);
connection con1;
reap;
connection con2;
reap;
connection con1;
#SET DEBUG_SYNC = 'before_sync_binlog_file SIGNAL before_sync_done WAIT_FOR continue';
SET GLOBAL sync_binlog = 0;
# Todo: fix this simulation and implement the intended sync protocol.
# As a workaround the DROP sender explicitly okays
# which naturally increments the binlog position.
#send DROP TABLE t2;
DROP TABLE t2;
connection con2;
#SET DEBUG_SYNC= "now WAIT_FOR before_sync_done";
sync_slave_with_master;
# t2 should be dropped
show tables like 't2';
connection con2;
#SET DEBUG_SYNC = "now SIGNAL continue";
# This block is commented out on purpose. See the todo/workaround above.
#connection con1;
#reap;
--echo #cleanup
connection master;
SET DEBUG_SYNC= 'reset';
disconnect con1;
disconnect con2;
disconnect con3;
SET GLOBAL rpl_semi_sync_master_timeout= 10000;
SET GLOBAL rpl_semi_sync_master_enabled = 0;
DROP TABLE t1;
connection slave;
SET GLOBAL rpl_semi_sync_slave_enabled = 0;
stop slave;start slave;
--source include/rpl_end.inc
......@@ -4071,6 +4071,20 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST AFTER_SYNC,AFTER_COMMIT
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_DELAY_MASTER
SESSION_VALUE NULL
GLOBAL_VALUE OFF
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE OFF
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BOOLEAN
VARIABLE_COMMENT Only write master info file when ack is needed.
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_ENABLED
SESSION_VALUE NULL
GLOBAL_VALUE OFF
......@@ -4085,6 +4099,20 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_KILL_CONN_TIMEOUT
SESSION_VALUE NULL
GLOBAL_VALUE 5
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 5
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Timeout for the mysql connection used to kill the slave io_thread's connection on master. This timeout comes into play when stop slave is executed.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_TRACE_LEVEL
SESSION_VALUE NULL
GLOBAL_VALUE 32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment