MDEV-532: Fix some race conditions in test cases.

With MDEV-532, the binlog_checkpoint event is logged asynchronously
from a binlog background thread. This causes some sporadic failures
in some test cases whose output depends on order of events in
binlog.

Fix using an include file that waits until the binlog checkpoint
event has been logged before proceeding with the test case.
This commit is contained in:
unknown 2012-12-17 12:49:11 +01:00
parent 7760efad74
commit cd0970c480
6 changed files with 60 additions and 0 deletions

View file

@ -94,8 +94,10 @@ if (`SELECT @@global.binlog_format = 'STATEMENT'`)
#flush the logs before the test
connection slave;
FLUSH LOGS;
source include/wait_for_binlog_checkpoint.inc;
connection master;
FLUSH LOGS;
source include/wait_for_binlog_checkpoint.inc;
}
CREATE TABLE t1(a int, UNIQUE(a));

View file

@ -43,6 +43,7 @@ let $binlog_limit= 1,4;
source include/show_binlog_events.inc;
let $binlog_limit=;
flush logs;
--source include/wait_for_binlog_checkpoint.inc
# We need an extra update before doing save_master_pos.
# Otherwise, an unlikely scenario may occur:

View file

@ -41,8 +41,10 @@ INSERT INTO t1 VALUES (3);
#
FLUSH LOGS;
--source include/wait_for_binlog_checkpoint.inc
-- connection master
FLUSH LOGS;
--source include/wait_for_binlog_checkpoint.inc
DROP TABLE t1;
--let $is_relay_log= 0

View file

@ -0,0 +1,53 @@
# include/wait_for_binlog_checkpoint.inc
#
# SUMMARY
#
# Wait until binlog checkpoint has been logged for current binlog file.
# This is useful to avoid races with output difference for binlog
# checkpoints, as these are logged asynchronously from the binlog
# background thread.
#
# USAGE:
#
# --source include/wait_for_binlog_checkpoint.inc
let $_wait_count= 300;
let $_found= 0;
while ($_wait_count)
{
dec $_wait_count;
let $_cur_binlog= query_get_value(SHOW MASTER STATUS, File, 1);
let $_more= 1;
let $_row= 1;
while ($_more)
{
let $_event= query_get_value(SHOW BINLOG EVENTS IN "$_cur_binlog", Event_type, $_row);
if ($_event == "No such row")
{
let $_more= 0;
}
if ($_event == "Binlog_checkpoint")
{
let $_info= query_get_value(SHOW BINLOG EVENTS IN "$_cur_binlog", Info, $_row);
if (`SELECT INSTR("$_info", "$_cur_binlog") != 0`)
{
let $_more= 0;
let $_wait_count= 0;
let $_found= 1;
}
}
inc $_row;
}
if ($_wait_count)
{
real_sleep 0.1;
}
}
if (!$_found)
{
eval SHOW BINLOG EVENTS IN "$_cur_binlog";
--die ERROR: failed while waiting for binlog checkpoint $_cur_binlog
}

View file

@ -72,6 +72,7 @@ connection con3;
--echo # Connection con3
COMMIT;
FLUSH LOGS;
--source include/wait_for_binlog_checkpoint.inc
connection default;
--echo # Connection default

View file

@ -169,6 +169,7 @@ select * from db2.t1;
--connection master1
flush logs;
--source include/wait_for_binlog_checkpoint.inc
--save_master_pos
--connection slave
--sync_with_master 0, 'master1'