Commit 99524127 authored by Leonard Zhou's avatar Leonard Zhou

BUG#39858 rpl.rpl_rotate (rpl.rpl_rotate_logs) failed on pushbuild: result mismatch

The method to purge binary log files produces different results in some platforms.
The reason is that the purge time is calculated based on table modified time and
that can't guarantee to purge master-bin.000002 in all platforms.(eg. windows)

Use a new way that sets the time to purge binlog file 1 second after the last
modified time of master-bin.000002.
That can be sure that the file is always deleted in any platform.

mysql-test/suite/rpl/r/rpl_rotate_logs.result:
  Test result
mysql-test/suite/rpl/t/rpl_rotate_logs.test:
  Test file
parent 8cbd34f0
...@@ -87,9 +87,7 @@ show binary logs; ...@@ -87,9 +87,7 @@ show binary logs;
Log_name File_size Log_name File_size
master-bin.000002 # master-bin.000002 #
master-bin.000003 # master-bin.000003 #
select @time_for_purge:=DATE_ADD(UPDATE_TIME, INTERVAL 1 SECOND) SELECT @time_for_purge:=DATE_ADD('tmpval', INTERVAL 1 SECOND);
from information_schema.tables
where TABLE_SCHEMA="test" and TABLE_NAME="t2";
purge master logs before (@time_for_purge); purge master logs before (@time_for_purge);
show binary logs; show binary logs;
Log_name File_size Log_name File_size
......
...@@ -112,14 +112,24 @@ source include/show_master_logs.inc; ...@@ -112,14 +112,24 @@ source include/show_master_logs.inc;
purge binary logs to 'master-bin.000002'; purge binary logs to 'master-bin.000002';
source include/show_binary_logs.inc; source include/show_binary_logs.inc;
# Calculate time to use in "purge master logs before" by taking # Set the purge time 1 second after the last modify time of master-bin.000002.
# last modification time of t2 and adding 1 second perl;
# This is donw in order to handle the case where file system open F, ">>".$ENV{'MYSQLTEST_VARDIR'}.'/tmp/rpl_rotate_logs.tmp' or die "Tmp file rpl_rotate_logs.tmp not found";
# time differs from mysqld's time my $binlogpath = $ENV{'MYSQLTEST_VARDIR'}.'/mysqld.1/data/master-bin.000002';
my @array = stat($binlogpath);
my $filemodifytime = $array[9];
my @t = localtime $filemodifytime;
my $modifytime = sprintf "%04u-%02u-%02u %02u:%02u:%02u",$t[5]+1900,$t[4]+1,$t[3],$t[2],$t[1],$t[0];
printf F ("let \$tmpval = %s;",$modifytime);
close F;
EOF
--source $MYSQLTEST_VARDIR/tmp/rpl_rotate_logs.tmp
remove_file $MYSQLTEST_VARDIR/tmp/rpl_rotate_logs.tmp;
--disable_result_log --disable_result_log
select @time_for_purge:=DATE_ADD(UPDATE_TIME, INTERVAL 1 SECOND) --replace_result $tmpval tmpval
from information_schema.tables --eval SELECT @time_for_purge:=DATE_ADD('$tmpval', INTERVAL 1 SECOND)
where TABLE_SCHEMA="test" and TABLE_NAME="t2";
--enable_result_log --enable_result_log
purge master logs before (@time_for_purge); purge master logs before (@time_for_purge);
......
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