mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 21:42:35 +01:00
Back porting the test case for semi-sync
This commit is contained in:
parent
06442da289
commit
7771b90295
5 changed files with 932 additions and 0 deletions
15
mysql-test/include/have_semisync_plugin.inc
Normal file
15
mysql-test/include/have_semisync_plugin.inc
Normal file
|
@ -0,0 +1,15 @@
|
|||
#
|
||||
# Check if dynamic loading is supported
|
||||
#
|
||||
--require r/have_dynamic_loading.require
|
||||
disable_query_log;
|
||||
show variables like 'have_dynamic_loading';
|
||||
enable_query_log;
|
||||
|
||||
#
|
||||
# Check if the variable SEMISYNC_MASTER_PLUGIN is set
|
||||
#
|
||||
if (`select LENGTH('$SEMISYNC_MASTER_PLUGIN') = 0`)
|
||||
{
|
||||
skip Need semisync plugins;
|
||||
}
|
398
mysql-test/suite/rpl/r/rpl_semi_sync.result
Normal file
398
mysql-test/suite/rpl/r/rpl_semi_sync.result
Normal file
|
@ -0,0 +1,398 @@
|
|||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
#
|
||||
# Uninstall semi-sync plugins on master and slave
|
||||
#
|
||||
include/stop_slave.inc
|
||||
reset slave;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
reset master;
|
||||
set sql_log_bin=0;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
set sql_log_bin=1;
|
||||
#
|
||||
# Main test of semi-sync replication start here
|
||||
#
|
||||
[ on master ]
|
||||
[ default state of semi-sync on master should be OFF ]
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_master_enabled OFF
|
||||
[ 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
|
||||
[ status of semi-sync on master should be OFF without any semi-sync slaves ]
|
||||
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
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 0
|
||||
#
|
||||
# BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
|
||||
# BUG#45673 Semisynch reports correct operation even if no slave is connected
|
||||
#
|
||||
[ status of semi-sync on master should be OFF ]
|
||||
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
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 0
|
||||
#
|
||||
# INSTALL PLUGIN semi-sync on slave
|
||||
#
|
||||
[ on slave ]
|
||||
[ default state of semi-sync on slave should be OFF ]
|
||||
show variables like 'rpl_semi_sync_slave_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_slave_enabled OFF
|
||||
[ enable semi-sync on slave ]
|
||||
set global rpl_semi_sync_slave_enabled = 1;
|
||||
show variables like 'rpl_semi_sync_slave_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_slave_enabled ON
|
||||
include/start_slave.inc
|
||||
[ on master ]
|
||||
[ initial master state after the semi-sync slave connected ]
|
||||
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
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 0
|
||||
create table t1(n int) engine = ENGINE_TYPE;
|
||||
[ master state after CREATE TABLE statement ]
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 1
|
||||
[ insert records to table ]
|
||||
[ master status after inserts ]
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 301
|
||||
[ on slave ]
|
||||
[ slave status after replicated inserts ]
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status ON
|
||||
select count(distinct n) from t1;
|
||||
count(distinct n)
|
||||
300
|
||||
select min(n) from t1;
|
||||
min(n)
|
||||
1
|
||||
select max(n) from t1;
|
||||
max(n)
|
||||
300
|
||||
include/stop_slave.inc
|
||||
[ on master ]
|
||||
[ master status should be ON ]
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 301
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_clients 1
|
||||
[ semi-sync replication of these transactions will fail ]
|
||||
insert into t1 values (500);
|
||||
delete from t1 where n < 500;
|
||||
insert into t1 values (100);
|
||||
[ master status should be OFF ]
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status OFF
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 3
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 301
|
||||
[ on slave ]
|
||||
[ slave status should be OFF ]
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
include/start_slave.inc
|
||||
[ slave status should be ON ]
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status ON
|
||||
select count(distinct n) from t1;
|
||||
count(distinct n)
|
||||
2
|
||||
select min(n) from t1;
|
||||
min(n)
|
||||
100
|
||||
select max(n) from t1;
|
||||
max(n)
|
||||
500
|
||||
[ on master ]
|
||||
[ do something to activate semi-sync ]
|
||||
drop table t1;
|
||||
[ master status should be ON again ]
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 3
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 302
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_clients 1
|
||||
[ on slave ]
|
||||
include/stop_slave.inc
|
||||
[ on master ]
|
||||
show master logs;
|
||||
Log_name master-bin.000001
|
||||
File_size #
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_master_enabled ON
|
||||
[ disable semi-sync on the fly ]
|
||||
set global rpl_semi_sync_master_enabled=0;
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_master_enabled OFF
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status OFF
|
||||
[ enable semi-sync on the fly ]
|
||||
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
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
[ on slave ]
|
||||
include/start_slave.inc
|
||||
[ on master ]
|
||||
create table t1 (a int) engine = ENGINE_TYPE;
|
||||
drop table t1;
|
||||
show status like 'Rpl_relay%';
|
||||
Variable_name Value
|
||||
[ test reset master ]
|
||||
[ on master]
|
||||
reset master;
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 0
|
||||
[ on slave ]
|
||||
include/stop_slave.inc
|
||||
reset slave;
|
||||
include/start_slave.inc
|
||||
[ on master ]
|
||||
create table t1 (a int) engine = ENGINE_TYPE;
|
||||
insert into t1 values (1);
|
||||
insert into t1 values (2), (3);
|
||||
[ on slave ]
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
[ on master ]
|
||||
[ master semi-sync status should be ON ]
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_status ON
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 3
|
||||
#
|
||||
# Start semi-sync replication without SUPER privilege
|
||||
#
|
||||
include/stop_slave.inc
|
||||
reset slave;
|
||||
[ on master ]
|
||||
reset master;
|
||||
set sql_log_bin=0;
|
||||
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl';
|
||||
flush privileges;
|
||||
set sql_log_bin=1;
|
||||
[ on slave ]
|
||||
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl';
|
||||
flush privileges;
|
||||
change master to master_user='rpl',master_password='rpl';
|
||||
include/start_slave.inc
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status ON
|
||||
[ on master ]
|
||||
[ master semi-sync should be ON ]
|
||||
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
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 0
|
||||
insert into t1 values (4);
|
||||
insert into t1 values (5);
|
||||
[ master semi-sync should be ON ]
|
||||
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
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_no_tx 0
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_master_yes_tx 2
|
||||
#
|
||||
# Test semi-sync slave connect to non-semi-sync master
|
||||
#
|
||||
[ on slave ]
|
||||
include/stop_slave.inc
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
[ on master ]
|
||||
[ Semi-sync status on master should be ON ]
|
||||
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
|
||||
set global rpl_semi_sync_master_enabled= 0;
|
||||
[ on slave ]
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_slave_enabled ON
|
||||
include/start_slave.inc
|
||||
[ on master ]
|
||||
insert into t1 values (8);
|
||||
[ master semi-sync clients should be 0, status should be OFF ]
|
||||
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
|
||||
[ on slave ]
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
include/stop_slave.inc
|
||||
[ on master ]
|
||||
set sql_log_bin=0;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
set sql_log_bin=1;
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';
|
||||
Variable_name Value
|
||||
[ on slave ]
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_slave_enabled ON
|
||||
include/start_slave.inc
|
||||
[ on master ]
|
||||
insert into t1 values (10);
|
||||
[ on slave ]
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
#
|
||||
# Test non-semi-sync slave connect to semi-sync master
|
||||
#
|
||||
set sql_log_bin=0;
|
||||
INSTALL PLUGIN rpl_semi_sync_master SONAME 'libsemisync_master.so';
|
||||
set global rpl_semi_sync_master_timeout= 5000;
|
||||
/* 5s */
|
||||
set sql_log_bin=1;
|
||||
set global rpl_semi_sync_master_enabled= 1;
|
||||
[ on slave ]
|
||||
include/stop_slave.inc
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
[ uninstall semi-sync slave plugin ]
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
Variable_name Value
|
||||
include/start_slave.inc
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
include/stop_slave.inc
|
||||
[ reinstall semi-sync slave plugin and disable semi-sync ]
|
||||
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'libsemisync_slave.so';
|
||||
set global rpl_semi_sync_slave_enabled= 0;
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
Variable_name Value
|
||||
rpl_semi_sync_slave_enabled OFF
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
include/start_slave.inc
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
Variable_name Value
|
||||
Rpl_semi_sync_slave_status OFF
|
||||
#
|
||||
# Clean up
|
||||
#
|
||||
include/stop_slave.inc
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
include/start_slave.inc
|
||||
drop table t1;
|
||||
drop user rpl@127.0.0.1;
|
||||
flush privileges;
|
1
mysql-test/suite/rpl/t/rpl_semi_sync-master.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_semi_sync-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
$SEMISYNC_PLUGIN_OPT
|
1
mysql-test/suite/rpl/t/rpl_semi_sync-slave.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_semi_sync-slave.opt
Normal file
|
@ -0,0 +1 @@
|
|||
$SEMISYNC_PLUGIN_OPT
|
517
mysql-test/suite/rpl/t/rpl_semi_sync.test
Normal file
517
mysql-test/suite/rpl/t/rpl_semi_sync.test
Normal file
|
@ -0,0 +1,517 @@
|
|||
source include/have_semisync_plugin.inc;
|
||||
source include/not_embedded.inc;
|
||||
source include/not_windows.inc;
|
||||
source include/have_innodb.inc;
|
||||
source include/master-slave.inc;
|
||||
|
||||
let $engine_type= InnoDB;
|
||||
#let $engine_type= MyISAM;
|
||||
|
||||
# Suppress warnings that might be generated during the test
|
||||
disable_query_log;
|
||||
connection master;
|
||||
call mtr.add_suppression("Timeout waiting for reply of binlog");
|
||||
connection slave;
|
||||
call mtr.add_suppression("Master server does not support");
|
||||
# These will be removed after fix bug#45852
|
||||
call mtr.add_suppression("Set 'rpl_semi_sync_master_reply_log_file_pos' on master failed");
|
||||
call mtr.add_suppression("Slave I/O: Fatal error: Failed to run 'after_queue_event' hook, Error_code: 1593");
|
||||
enable_query_log;
|
||||
|
||||
--echo #
|
||||
--echo # Uninstall semi-sync plugins on master and slave
|
||||
--echo #
|
||||
connection slave;
|
||||
disable_query_log;
|
||||
source include/stop_slave.inc;
|
||||
reset slave;
|
||||
disable_warnings;
|
||||
error 0,1305;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
error 0,1305;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
enable_warnings;
|
||||
|
||||
connection master;
|
||||
reset master;
|
||||
set sql_log_bin=0;
|
||||
disable_warnings;
|
||||
error 0,1305;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
error 0,1305;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
enable_warnings;
|
||||
set sql_log_bin=1;
|
||||
enable_query_log;
|
||||
|
||||
--echo #
|
||||
--echo # Main test of semi-sync replication start here
|
||||
--echo #
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
disable_query_log;
|
||||
let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled', Value, 1);
|
||||
if (`select '$value' = 'No such row'`)
|
||||
{
|
||||
set sql_log_bin=0;
|
||||
INSTALL PLUGIN rpl_semi_sync_master SONAME 'libsemisync_master.so';
|
||||
set global rpl_semi_sync_master_timeout= 5000; /* 5s */
|
||||
set sql_log_bin=1;
|
||||
}
|
||||
enable_query_log;
|
||||
|
||||
echo [ default state of semi-sync on master should be OFF ];
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
|
||||
echo [ enable semi-sync on master ];
|
||||
set global rpl_semi_sync_master_enabled = 1;
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
|
||||
echo [ status of semi-sync on master should be OFF without any semi-sync slaves ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
--echo #
|
||||
--echo # BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
|
||||
--echo # BUG#45673 Semisynch reports correct operation even if no slave is connected
|
||||
--echo #
|
||||
|
||||
# BUG#45672 When semi-sync is enabled on master, it would allocate
|
||||
# transaction node even without semi-sync slave connected, and would
|
||||
# finally result in transaction node allocation error.
|
||||
#
|
||||
# Semi-sync master will pre-allocate 'max_connections' transaction
|
||||
# nodes, so here we do more than that much transactions to check if it
|
||||
# will fail or not.
|
||||
# select @@global.max_connections + 1;
|
||||
let $i= `select @@global.max_connections + 1`;
|
||||
disable_query_log;
|
||||
eval create table t1 (a int) engine=$engine_type;
|
||||
while ($i)
|
||||
{
|
||||
eval insert into t1 values ($i);
|
||||
dec $i;
|
||||
}
|
||||
drop table t1;
|
||||
enable_query_log;
|
||||
|
||||
# BUG#45673
|
||||
echo [ status of semi-sync on master should be OFF ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
disable_query_log;
|
||||
# reset master to make sure the following test will start with a clean environment
|
||||
reset master;
|
||||
enable_query_log;
|
||||
|
||||
--echo #
|
||||
--echo # INSTALL PLUGIN semi-sync on slave
|
||||
--echo #
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
|
||||
disable_query_log;
|
||||
let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', Value, 1);
|
||||
if (`select '$value' = 'No such row'`)
|
||||
{
|
||||
set sql_log_bin=0;
|
||||
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'libsemisync_slave.so';
|
||||
set sql_log_bin=1;
|
||||
}
|
||||
enable_query_log;
|
||||
|
||||
echo [ default state of semi-sync on slave should be OFF ];
|
||||
show variables like 'rpl_semi_sync_slave_enabled';
|
||||
|
||||
echo [ enable semi-sync on slave ];
|
||||
set global rpl_semi_sync_slave_enabled = 1;
|
||||
show variables like 'rpl_semi_sync_slave_enabled';
|
||||
source include/start_slave.inc;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
# NOTE: Rpl_semi_sync_master_client will only be updated when
|
||||
# semi-sync slave has started binlog dump request
|
||||
let $status_var= Rpl_semi_sync_master_clients;
|
||||
let $status_var_value= 1;
|
||||
source include/wait_for_status_var.inc;
|
||||
|
||||
echo [ initial master state after the semi-sync slave connected ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
replace_result $engine_type ENGINE_TYPE;
|
||||
eval create table t1(n int) engine = $engine_type;
|
||||
|
||||
echo [ master state after CREATE TABLE statement ];
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
let $i=300;
|
||||
echo [ insert records to table ];
|
||||
disable_query_log;
|
||||
while ($i)
|
||||
{
|
||||
eval insert into t1 values ($i);
|
||||
dec $i;
|
||||
}
|
||||
enable_query_log;
|
||||
|
||||
echo [ master status after inserts ];
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
sync_slave_with_master;
|
||||
echo [ on slave ];
|
||||
|
||||
echo [ slave status after replicated inserts ];
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
|
||||
select count(distinct n) from t1;
|
||||
select min(n) from t1;
|
||||
select max(n) from t1;
|
||||
|
||||
source include/stop_slave.inc;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
# The first semi-sync check should be on because after slave stop,
|
||||
# there are no transactions on the master.
|
||||
echo [ master status should be ON ];
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
|
||||
echo [ semi-sync replication of these transactions will fail ];
|
||||
insert into t1 values (500);
|
||||
delete from t1 where n < 500;
|
||||
insert into t1 values (100);
|
||||
|
||||
# The second semi-sync check should be off because one transaction
|
||||
# times out during waiting.
|
||||
echo [ master status should be OFF ];
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
# Save the master position for later use.
|
||||
save_master_pos;
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
|
||||
echo [ slave status should be OFF ];
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
source include/start_slave.inc;
|
||||
sync_with_master;
|
||||
|
||||
echo [ slave status should be ON ];
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
|
||||
select count(distinct n) from t1;
|
||||
select min(n) from t1;
|
||||
select max(n) from t1;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
echo [ do something to activate semi-sync ];
|
||||
drop table t1;
|
||||
|
||||
# The third semi-sync check should be on again.
|
||||
echo [ master status should be ON again ];
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
|
||||
sync_slave_with_master;
|
||||
echo [ on slave ];
|
||||
|
||||
source include/stop_slave.inc;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
source include/show_master_logs.inc;
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
|
||||
echo [ disable semi-sync on the fly ];
|
||||
set global rpl_semi_sync_master_enabled=0;
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
|
||||
echo [ enable semi-sync on the fly ];
|
||||
set global rpl_semi_sync_master_enabled=1;
|
||||
show variables like 'rpl_semi_sync_master_enabled';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
|
||||
source include/start_slave.inc;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
replace_result $engine_type ENGINE_TYPE;
|
||||
eval create table t1 (a int) engine = $engine_type;
|
||||
drop table t1;
|
||||
|
||||
##show status like 'Rpl_semi_sync_master_status';
|
||||
|
||||
sync_slave_with_master;
|
||||
--replace_column 2 #
|
||||
show status like 'Rpl_relay%';
|
||||
|
||||
echo [ test reset master ];
|
||||
connection master;
|
||||
echo [ on master];
|
||||
|
||||
reset master;
|
||||
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
|
||||
source include/stop_slave.inc;
|
||||
reset slave;
|
||||
|
||||
# Kill the dump thread on master for previous slave connection and
|
||||
# wait for it to exit
|
||||
connection master;
|
||||
let $_tid= `select id from information_schema.processlist where command = 'Binlog Dump' limit 1`;
|
||||
if ($_tid)
|
||||
{
|
||||
disable_query_log;
|
||||
eval kill query $_tid;
|
||||
enable_query_log;
|
||||
|
||||
# After dump thread exit, Rpl_semi_sync_master_clients will be 0
|
||||
let $status_var= Rpl_semi_sync_master_clients;
|
||||
let $status_var_value= 0;
|
||||
source include/wait_for_status_var.inc;
|
||||
}
|
||||
|
||||
connection slave;
|
||||
source include/start_slave.inc;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
# Wait for dump thread to start, Rpl_semi_sync_master_clients will be
|
||||
# 1 after dump thread started.
|
||||
let $status_var= Rpl_semi_sync_master_clients;
|
||||
let $status_var_value= 1;
|
||||
source include/wait_for_status_var.inc;
|
||||
|
||||
replace_result $engine_type ENGINE_TYPE;
|
||||
eval create table t1 (a int) engine = $engine_type;
|
||||
insert into t1 values (1);
|
||||
insert into t1 values (2), (3);
|
||||
|
||||
sync_slave_with_master;
|
||||
echo [ on slave ];
|
||||
|
||||
select * from t1;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
echo [ master semi-sync status should be ON ];
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
--echo #
|
||||
--echo # Start semi-sync replication without SUPER privilege
|
||||
--echo #
|
||||
connection slave;
|
||||
source include/stop_slave.inc;
|
||||
reset slave;
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
reset master;
|
||||
|
||||
# Kill the dump thread on master for previous slave connection and wait for it to exit
|
||||
let $_tid= `select id from information_schema.processlist where command = 'Binlog Dump' limit 1`;
|
||||
if ($_tid)
|
||||
{
|
||||
disable_query_log;
|
||||
eval kill query $_tid;
|
||||
enable_query_log;
|
||||
|
||||
# After dump thread exit, Rpl_semi_sync_master_clients will be 0
|
||||
let $status_var= Rpl_semi_sync_master_clients;
|
||||
let $status_var_value= 0;
|
||||
source include/wait_for_status_var.inc;
|
||||
}
|
||||
|
||||
# Do not binlog the following statement because it will generate
|
||||
# different events for ROW and STATEMENT format
|
||||
set sql_log_bin=0;
|
||||
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl';
|
||||
flush privileges;
|
||||
set sql_log_bin=1;
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl';
|
||||
flush privileges;
|
||||
change master to master_user='rpl',master_password='rpl';
|
||||
source include/start_slave.inc;
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
# Wait for the semi-sync binlog dump thread to start
|
||||
let $status_var= Rpl_semi_sync_master_clients;
|
||||
let $status_var_value= 1;
|
||||
source include/wait_for_status_var.inc;
|
||||
echo [ master semi-sync should be ON ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
insert into t1 values (4);
|
||||
insert into t1 values (5);
|
||||
echo [ master semi-sync should be ON ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
show status like 'Rpl_semi_sync_master_no_tx';
|
||||
show status like 'Rpl_semi_sync_master_yes_tx';
|
||||
|
||||
--echo #
|
||||
--echo # Test semi-sync slave connect to non-semi-sync master
|
||||
--echo #
|
||||
|
||||
# Disable semi-sync on master
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
source include/stop_slave.inc;
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
|
||||
# Kill the dump thread on master for previous slave connection and wait for it to exit
|
||||
let $_tid= `select id from information_schema.processlist where command = 'Binlog Dump' limit 1`;
|
||||
if ($_tid)
|
||||
{
|
||||
disable_query_log;
|
||||
eval kill query $_tid;
|
||||
enable_query_log;
|
||||
|
||||
# After dump thread exit, Rpl_semi_sync_master_clients will be 0
|
||||
let $status_var= Rpl_semi_sync_master_clients;
|
||||
let $status_var_value= 0;
|
||||
source include/wait_for_status_var.inc;
|
||||
}
|
||||
|
||||
echo [ Semi-sync status on master should be ON ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
set global rpl_semi_sync_master_enabled= 0;
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
source include/start_slave.inc;
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
insert into t1 values (8);
|
||||
echo [ master semi-sync clients should be 0, status should be OFF ];
|
||||
show status like 'Rpl_semi_sync_master_clients';
|
||||
show status like 'Rpl_semi_sync_master_status';
|
||||
sync_slave_with_master;
|
||||
echo [ on slave ];
|
||||
show status like 'Rpl_semi_sync_slave_status';
|
||||
|
||||
# Uninstall semi-sync plugin on master
|
||||
connection slave;
|
||||
source include/stop_slave.inc;
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
set sql_log_bin=0;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
set sql_log_bin=1;
|
||||
enable_query_log;
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
source include/start_slave.inc;
|
||||
|
||||
connection master;
|
||||
echo [ on master ];
|
||||
insert into t1 values (10);
|
||||
sync_slave_with_master;
|
||||
echo [ on slave ];
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
|
||||
--echo #
|
||||
--echo # Test non-semi-sync slave connect to semi-sync master
|
||||
--echo #
|
||||
|
||||
connection master;
|
||||
set sql_log_bin=0;
|
||||
INSTALL PLUGIN rpl_semi_sync_master SONAME 'libsemisync_master.so';
|
||||
set global rpl_semi_sync_master_timeout= 5000; /* 5s */
|
||||
set sql_log_bin=1;
|
||||
set global rpl_semi_sync_master_enabled= 1;
|
||||
|
||||
connection slave;
|
||||
echo [ on slave ];
|
||||
source include/stop_slave.inc;
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
|
||||
echo [ uninstall semi-sync slave plugin ];
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
source include/start_slave.inc;
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
source include/stop_slave.inc;
|
||||
|
||||
echo [ reinstall semi-sync slave plugin and disable semi-sync ];
|
||||
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'libsemisync_slave.so';
|
||||
set global rpl_semi_sync_slave_enabled= 0;
|
||||
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
source include/start_slave.inc;
|
||||
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
||||
|
||||
--echo #
|
||||
--echo # Clean up
|
||||
--echo #
|
||||
|
||||
connection slave;
|
||||
source include/stop_slave.inc;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
||||
|
||||
connection master;
|
||||
UNINSTALL PLUGIN rpl_semi_sync_master;
|
||||
|
||||
connection slave;
|
||||
source include/start_slave.inc;
|
||||
|
||||
connection master;
|
||||
drop table t1;
|
||||
drop user rpl@127.0.0.1;
|
||||
flush privileges;
|
||||
sync_slave_with_master;
|
Loading…
Reference in a new issue