diff --git a/mysql-test/include/wait_for_purge.inc b/mysql-test/include/wait_for_purge.inc new file mode 100644 index 00000000000..8cd3c4394e1 --- /dev/null +++ b/mysql-test/include/wait_for_purge.inc @@ -0,0 +1,53 @@ +# include/wait_for_purge.inc +# +# SUMMARY +# +# Repeatedly attempt to purge binlogs up to a specific point, until +# SHOW BINARY LOGS shows it has succeeded. +# This can be useful to avoid races where slaves are stopped but the +# corresponding binlog dump thread on the master has not yet terminated. +# Async binlog checkpoints can also delay purge. +# +# Note that it may be necessary to inject at least one event in the binlog +# after stopping slaves, or master may not detect stop of slave for a long +# time (or forever), depending on details of test case, if replication +# heartbeat is enabled, etc. +# +# USAGE: +# +# --let $purge_binlogs_to=master-bin.000003 +# --source include/wait_for_purge.inc +# +# SIDE EFFECTS: +# +# Disables --query_log while running, enables it afterwards. + +--echo include/wait_for_purge.inc "$purge_binlogs_to" + +let $_wait_count= 300; +let $_done= 0; + +--disable_query_log +while ($_wait_count) +{ + dec $_wait_count; + eval PURGE BINARY LOGS TO "$purge_binlogs_to"; + let $_cur_binlog= query_get_value(SHOW BINARY LOGS, Log_name, 1); + if (`SELECT "$_cur_binlog" = "$purge_binlogs_to"`) + { + let $_done= 1; + let $_wait_count= 0; + } + if ($_wait_count) + { + real_sleep 0.1; + } +} + +if (!$_done) +{ + SHOW FULL PROCESSLIST; + eval SHOW BINARY LOGS; + --die ERROR: failed while waiting for binlog purge to $purge_binlogs_to +} +--enable_query_log diff --git a/mysql-test/suite/rpl/r/rpl_gtid_startpos.result b/mysql-test/suite/rpl/r/rpl_gtid_startpos.result index 2428897345e..1e18f4506c7 100644 --- a/mysql-test/suite/rpl/r/rpl_gtid_startpos.result +++ b/mysql-test/suite/rpl/r/rpl_gtid_startpos.result @@ -19,7 +19,7 @@ include/stop_slave.inc *** Test that master gives error when slave asks for empty gtid pos and binlog files have been purged. *** FLUSH LOGS; INSERT INTO t1 VALUES (2); -PURGE BINARY LOGS TO 'master-bin.000003'; +include/wait_for_purge.inc "master-bin.000003" show binary logs; Log_name File_size master-bin.000003 # @@ -135,7 +135,7 @@ INSERT INTO t1 VALUES (4); include/stop_slave.inc FLUSH LOGS; FLUSH LOGS; -PURGE BINARY LOGS TO 'master-bin.000004'; +include/wait_for_purge.inc "master-bin.000004" show binary logs; Log_name File_size master-bin.000004 # diff --git a/mysql-test/suite/rpl/t/rpl_gtid_startpos.test b/mysql-test/suite/rpl/t/rpl_gtid_startpos.test index 88f0faebcb3..e2624051b69 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_startpos.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_startpos.test @@ -35,10 +35,10 @@ SELECT * FROM t1; --echo *** Test that master gives error when slave asks for empty gtid pos and binlog files have been purged. *** --connection server_1 FLUSH LOGS; ---source include/wait_for_binlog_checkpoint.inc INSERT INTO t1 VALUES (2); --save_master_pos -PURGE BINARY LOGS TO 'master-bin.000003'; +--let $purge_binlogs_to=master-bin.000003 +--source include/wait_for_purge.inc --source include/show_binary_logs.inc --connection server_2 @@ -226,8 +226,8 @@ INSERT INTO t1 VALUES (4); --connection server_1 FLUSH LOGS; FLUSH LOGS; ---source include/wait_for_binlog_checkpoint.inc -PURGE BINARY LOGS TO 'master-bin.000004'; +--let $purge_binlogs_to=master-bin.000004 +--source include/wait_for_purge.inc --source include/show_binary_logs.inc INSERT INTO t1 VALUES (5);