Current Path : /home/usr.opt/mysql57/mysql-test/suite/rpl/t/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //home/usr.opt/mysql57/mysql-test/suite/rpl/t/rpl_semi_sync.test |
# Usage: # # [--let $rpl_test_optimize_for_static_plugin_config = 1|0] # --source suite/rpl/t/rpl_semi_sync.test # # Parameters: # # $rpl_test_optimize_for_static_plugin_config # When set to `1`, will run the contained test-cases with # `replication_optimize_for_static_plugin_config` option enabled. # # Want to skip this test from daily Valgrind execution --source include/no_valgrind_without_big.inc # Adding big test option for this test. --source include/big_test.inc source include/have_semisync_plugin.inc; source include/not_embedded.inc; source include/have_innodb.inc; source include/not_gtid_enabled.inc; source include/master-slave.inc; let $engine_type= InnoDB; # Suppress warnings that might be generated during the test connection master; disable_query_log; 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("Semi-sync master failed on net_flush.. before waiting for slave reply"); call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); call mtr.add_suppression(".*Got an error reading communication packets.*"); enable_query_log; --source include/sync_slave_sql_with_master.inc # After fix of BUG#45848, semi-sync slave should not create any extra # connections on master, save the count of connections before start # semi-sync slave for comparison below. connection master; let $_connections_normal_slave= query_get_value(SHOW STATUS LIKE 'Threads_connected', Value, 1); --echo # --echo # Uninstall semi-sync plugins on master and slave --echo # connection slave; source include/stop_slave.inc; disable_warnings; error 0,1305; UNINSTALL PLUGIN rpl_semi_sync_slave; error 0,1305; UNINSTALL PLUGIN rpl_semi_sync_master; enable_warnings; connection master; disable_warnings; error 0,1305; UNINSTALL PLUGIN rpl_semi_sync_slave; error 0,1305; UNINSTALL PLUGIN rpl_semi_sync_master; enable_warnings; --let $rpl_only_running_threads= 1 --let $rpl_no_start_slave= 1 --source include/rpl_reset.inc --let $rpl_only_running_threads= 0 --echo # --echo # Main test of semi-sync replication starts here --echo # source include/rpl_connection_master.inc; let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled', Value, 1); if ($value == No such row) { disable_query_log; eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_PLUGIN'; set global rpl_semi_sync_master_timeout= 60000 /* 60s */; set global rpl_semi_sync_master_wait_point= AFTER_COMMIT; 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 ON even 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 Semisync 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'; if ($rpl_test_optimize_for_static_plugin_config == 1) { SET GLOBAL replication_optimize_for_static_plugin_config = 1; } # reset master and slave so the following test starts in a clean environment --let $rpl_only_running_threads= 1 --let $rpl_no_start_slave= 1 --source include/rpl_reset.inc --let $rpl_only_running_threads= 0 --echo # --echo # INSTALL PLUGIN semi-sync on slave --echo # source include/rpl_connection_slave.inc; let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', Value, 1); if ($value == No such row) { disable_query_log; eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_PLUGIN'; 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; source include/rpl_connection_master.inc; # 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'; --let $yes_tx_before= query_get_value(SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx', Value, 1) replace_result $engine_type ENGINE_TYPE; eval create table t1(a int) engine = $engine_type; # wait for the ack to arrive --let $yes_tx_after= `SELECT $yes_tx_before + 1` --let $status_var= Rpl_semi_sync_master_yes_tx --let $status_var_value= $yes_tx_after --source include/wait_for_status_var.inc 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'; # After fix of BUG#45848, semi-sync slave should not create any extra # connections on master. let $_connections_semisync_slave= query_get_value(SHOW STATUS LIKE 'Threads_connected', Value, 1); replace_result $_connections_semisync_slave CONNECTIONS_SEMISYNC_SLAVE; replace_result $_connections_normal_slave CONNECTIONS_NORMAL_SLAVE; eval select $_connections_semisync_slave - $_connections_normal_slave as 'Should be 0'; --let $yes_tx_before= query_get_value(SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx', Value, 1) let $i=10; --let $acks_to_wait= 0 echo [ insert records to table ]; disable_query_log; while ($i) { eval insert into t1 values ($i); dec $i; inc $acks_to_wait; } enable_query_log; # Wait for acks from slave to avoid test failures on slow platforms. --let $yes_tx_after= `SELECT $yes_tx_before + $acks_to_wait` let $status_var= Rpl_semi_sync_master_yes_tx; let $status_var_value= $yes_tx_after; let $status_timeout= 2400; let $status_fail_query= SHOW STATUS LIKE 'Rpl_semi_sync%'; source include/wait_for_status_var.inc; 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'; --source include/sync_slave_sql_with_master.inc echo [ on slave ]; echo [ slave status after replicated inserts ]; show status like 'Rpl_semi_sync_slave_status'; select count(distinct a) from t1; select min(a) from t1; select max(a) from t1; --echo --echo # BUG#50157 --echo # semi-sync replication crashes when replicating a transaction which --echo # include 'CREATE TEMPORARY TABLE `MyISAM_t` SELECT * FROM `Innodb_t` ; source include/rpl_connection_master.inc; SET SESSION AUTOCOMMIT= 0; CREATE TABLE t2(c1 INT) ENGINE=innodb; --source include/sync_slave_sql_with_master.inc connection master; BEGIN; --echo --echo # Even though it is in a transaction, this statement is binlogged into binlog --echo # file immediately. --disable_warnings CREATE TEMPORARY TABLE t3 SELECT c1 FROM t2 where 1=1; --enable_warnings --echo --echo # These statements will not be binlogged until the transaction is committed INSERT INTO t2 VALUES(11); INSERT INTO t2 VALUES(22); COMMIT; DROP TABLE t2, t3; SET SESSION AUTOCOMMIT= 1; --source include/sync_slave_sql_with_master.inc --echo # --echo # Test semi-sync master will switch OFF after one transaction --echo # timeout waiting for slave reply. --echo # connection slave; source include/stop_slave.inc; source include/rpl_connection_master.inc; # Kill the dump thread(s) on master for previous slave connection source include/stop_dump_threads.inc; # Rpl_semi_sync_master_clients should be 0, once the dump thread(s) have exited. let $status_var= Rpl_semi_sync_master_clients; let $status_var_value= 0; source include/wait_for_status_var.inc; # 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); # Wait for the semi-sync replication of this transaction to timeout let $status_var= Rpl_semi_sync_master_status; let $status_var_value= OFF; source include/wait_for_status_var.inc; # 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'; # Semi-sync status on master is now OFF, so all these transactions # will be replicated asynchronously. let $i=10; disable_query_log; while ($i) { eval delete from t1 where a=$i; dec $i; } enable_query_log; insert into t1 values (100); 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'; --echo # --echo # Test semi-sync status on master will be ON again when slave catches up --echo # # Save the master position for later use. save_master_pos; source include/rpl_connection_slave.inc; 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 a) from t1; select min(a) from t1; select max(a) from t1; source include/rpl_connection_master.inc; # Wait until master semi-sync status is on again after slave catches up # to avoid test failures on slow platforms. let $status_var= Rpl_semi_sync_master_status; let $status_var_value= ON; source include/wait_for_status_var.inc; echo [ master status should be ON again after slave catches up ]; 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 # --echo # Test disable/enable master semi-sync on the fly. --echo # drop table t1; --source include/sync_slave_sql_with_master.inc echo [ on slave ]; source include/stop_slave.inc; --echo # --echo # Flush status --echo # connection master; echo [ Semi-sync master status variables before FLUSH STATUS ]; SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx'; SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx'; # Do not write the FLUSH STATUS to binlog, to make sure we'll get a # clean status after this. FLUSH NO_WRITE_TO_BINLOG STATUS; echo [ Semi-sync master status variables after FLUSH STATUS ]; SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx'; SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx'; source include/rpl_connection_master.inc; 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'; --echo # --echo # Test RESET MASTER/SLAVE --echo # source include/rpl_connection_slave.inc; source include/start_slave.inc; source include/rpl_connection_master.inc; replace_result $engine_type ENGINE_TYPE; eval create table t1 (a int) engine = $engine_type; drop table t1; --source include/sync_slave_sql_with_master.inc --replace_column 2 # show status like 'Rpl_relay%'; echo [ test reset master ]; source include/rpl_connection_master.inc; 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'; source include/rpl_connection_slave.inc; source include/stop_slave.inc; reset slave; reset master; source include/rpl_connection_master.inc; # Kill the dump thread(s) on master for previous slave connection source include/stop_dump_threads.inc; # Rpl_semi_sync_master_clients should be 0, once the dump thread(s) have exited. 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; source include/rpl_connection_master.inc; # Wait for dump thread to start, Rpl_semi_sync_master_clients should 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); --source include/sync_slave_sql_with_master.inc echo [ on slave ]; select * from t1; source include/rpl_connection_master.inc; # Wait until master semi-sync status is on again after slave catches up # to avoid test failures on slow platforms. let $status_var= Rpl_semi_sync_master_status; let $status_var_value= ON; source include/wait_for_status_var.inc; 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 # --source include/rpl_reset.inc source include/rpl_connection_master.inc; # Kill the dump thread on master for previous slave connection source include/stop_dump_threads.inc; # Rpl_semi_sync_master_clients should be 0, once dump thread(s) have exited 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; create user rpl@127.0.0.1 identified by 'rpl'; grant replication slave on *.* to rpl@127.0.0.1; flush privileges; set sql_log_bin=1; # Prove of bug#77732 fixes: # Created user's privileges - REPLICATION and SLAVE - # alone must suffice to successful connecting even with show handler # not compatible to 5.6. SET @save_show_compatibility_56=@@global.show_compatibility_56; SET @@global.show_compatibility_56=OFF; source include/rpl_connection_slave.inc; create user rpl@127.0.0.1 identified by 'rpl'; grant replication slave on *.* to rpl@127.0.0.1; flush privileges; --replace_column 2 #### change master to master_user='rpl',master_password='rpl'; source include/start_slave.inc; show status like 'Rpl_semi_sync_slave_status'; source include/rpl_connection_master.inc; SET @@global.show_compatibility_56=ON; # bug#77732 related: reconnecting to the master while the show handler # is compatible with 5.6 --source include/rpl_connection_slave.inc source include/stop_slave.inc; --source include/rpl_connection_master.inc # Added for Bug#19372027: rpl_semi_sync fails sporadically on trunk # To ensure that master knows that the slave is stopped Insert into t1 values (4); # wait for semi sync binlog dump thread to stop let $status_var= Rpl_semi_sync_master_clients; let $status_var_value= 0; source include/wait_for_status_var.inc; show status like 'Rpl_semi_sync_master_status'; show status like 'Rpl_semi_sync_master_clients'; source include/rpl_connection_slave.inc; source include/start_slave.inc; show status like 'Rpl_semi_sync_slave_status'; --source include/rpl_connection_master.inc # bug#77732 cleanup SET @@global.show_compatibility_56=@save_show_compatibility_56; # Added for Bug#19372027:rpl_semi_sync fails sporadically on trunk let $status_var= Rpl_semi_sync_master_status; let $status_var_value= ON; source include/wait_for_status_var.inc; show status like 'Rpl_semi_sync_master_status'; # 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_no_tx'; show status like 'Rpl_semi_sync_master_yes_tx'; insert into t1 values (5); insert into t1 values (6); # Wait for acks from slave to avoid test failures on slow platforms. let $status_var= Rpl_semi_sync_master_yes_tx; let $status_var_value= 2; 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'; --echo # --echo # Test semi-sync slave connect to non-semi-sync master --echo # # Disable semi-sync on master --source include/sync_slave_sql_with_master.inc echo [ on slave ]; source include/stop_slave.inc; SHOW STATUS LIKE 'Rpl_semi_sync_slave_status'; source include/rpl_connection_master.inc; # Kill the dump thread(s) on master for previous slave connection source include/stop_dump_threads.inc; # Rpl_semi_sync_master_clients should be 0, once dump thread(s) have exited 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; source include/rpl_connection_slave.inc; SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled'; source include/start_slave.inc; source include/rpl_connection_master.inc; insert into t1 values (8); let $status_var= Rpl_semi_sync_master_clients; let $status_var_value= 1; source include/wait_for_status_var.inc; echo [ master semi-sync clients should be 1, status should be OFF ]; show status like 'Rpl_semi_sync_master_clients'; show status like 'Rpl_semi_sync_master_status'; --source include/sync_slave_sql_with_master.inc 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 ]; --source include/stop_dump_threads.inc if ($rpl_test_optimize_for_static_plugin_config == 1) { SET GLOBAL replication_optimize_for_static_plugin_config = 0; } UNINSTALL PLUGIN rpl_semi_sync_master; enable_query_log; SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled'; source include/rpl_connection_slave.inc; SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled'; source include/start_slave.inc; source include/rpl_connection_master.inc; insert into t1 values (10); --source include/sync_slave_sql_with_master.inc 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; replace_result $SEMISYNC_MASTER_PLUGIN SEMISYNC_MASTER_PLUGIN; eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_PLUGIN'; if ($rpl_test_optimize_for_static_plugin_config == 1) { SET GLOBAL replication_optimize_for_static_plugin_config = 1; } set global rpl_semi_sync_master_timeout= 60000; /* 60s */ set global rpl_semi_sync_master_enabled= 1; source include/rpl_connection_slave.inc; 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 ]; replace_result $SEMISYNC_SLAVE_PLUGIN SEMISYNC_SLAVE_PLUGIN; eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_PLUGIN'; 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 # if ($rpl_test_optimize_for_static_plugin_config == 1) { connection master; SET GLOBAL replication_optimize_for_static_plugin_config = 0; } --source include/uninstall_semisync.inc connection slave; --source include/stop_slave.inc --replace_column 2 #### change master to master_user='root',master_password=''; source include/start_slave.inc; connection master; drop table t1; --source include/sync_slave_sql_with_master.inc connection master; drop user rpl@127.0.0.1; flush privileges; --source include/rpl_end.inc