summaryrefslogtreecommitdiff
path: root/mysql-test/mysql-test-run.pl
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/mysql-test-run.pl')
-rwxr-xr-xmysql-test/mysql-test-run.pl186
1 files changed, 118 insertions, 68 deletions
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 5bb60d1c9a4..04a79a5fcf6 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -48,6 +48,7 @@ use File::Copy;
use File::Temp qw / tempdir /;
use My::SafeProcess;
use My::ConfigFactory;
+use My::Options;
use mtr_cases;
our $is_win32_perl= ($^O eq "MSWin32"); # ActiveState Win32 Perl
@@ -123,7 +124,6 @@ sub using_extern { return (keys %opts_extern > 0);};
our $opt_fast= 0;
our $opt_force;
-our $opt_reorder= 0;
our $opt_mem= $ENV{'MTR_MEM'};
our $opt_gcov;
@@ -161,6 +161,9 @@ my $opt_start_timeout = 30; # 30 seconds
my $opt_start;
my $opt_start_dirty;
+my $opt_repeat= 1;
+my $opt_retry= 1;
+my $opt_retry_failure= 2;
my $opt_strace_client;
@@ -230,7 +233,7 @@ sub main {
# Figure out which tests we are going to run
mtr_report("Collecting tests...");
- my $tests= collect_test_cases($opt_suites);
+ my $tests= collect_test_cases($opt_suites, \@opt_cases);
initialize_servers();
@@ -367,15 +370,16 @@ sub command_line_setup {
'report-features' => \$opt_report_features,
'comment=s' => \$opt_comment,
'fast' => \$opt_fast,
- 'reorder' => \$opt_reorder,
+ 'reorder' => \&collect_option,
'enable-disabled' => \&collect_option,
'verbose+' => \$opt_verbose,
'sleep=i' => \$opt_sleep,
'start-dirty' => \$opt_start_dirty,
'start' => \$opt_start,
'print-testcases' => \&collect_option,
-# TODO 'repeat'
-# TODO 'retry'
+ 'repeat=i' => \$opt_repeat,
+ 'retry=i' => \$opt_retry,
+ 'retry-failure=i' => \$opt_retry_failure,
'timer!' => \$opt_timer,
'user=s' => \$opt_user,
'testcase-timeout=i' => \$opt_testcase_timeout,
@@ -543,7 +547,7 @@ sub command_line_setup {
if $opt_tmpdir;
# Search through list of locations that are known
- # to be "fast disks" to list to find a suitable location
+ # to be "fast disks" to find a suitable location
# Use --mem=<dir> as first location to look.
my @tmpfs_locations= ($opt_mem, "/dev/shm", "/tmp");
@@ -551,8 +555,8 @@ sub command_line_setup {
{
if ( -d $fs )
{
- $opt_mem= "$fs/var";
- $opt_mem .= $opt_mtr_build_thread if $opt_mtr_build_thread;
+ my $template= "var_${opt_mtr_build_thread}_XXXX";
+ $opt_mem= tempdir( $template, DIR => $fs, CLEANUP => 0);
last;
}
}
@@ -776,7 +780,6 @@ sub set_mtr_build_thread_ports($) {
mtr_require_unique_id_and_wait("/tmp/mysql-test-ports", 200, 299);
print "got ".$mtr_build_thread."\n";
}
- $opt_mtr_build_thread= $mtr_build_thread;
$ENV{MTR_BUILD_THREAD}= $mtr_build_thread;
# Calculate baseport
@@ -788,7 +791,7 @@ sub set_mtr_build_thread_ports($) {
"($opt_baseport - $opt_baseport + 9)");
}
- mtr_report("Using MR_BUILD_THREAD $opt_mtr_build_thread,",
+ mtr_report("Using MR_BUILD_THREAD $mtr_build_thread,",
"with reserved ports $opt_baseport..".($opt_baseport+9));
}
@@ -1276,7 +1279,7 @@ sub remove_stale_vardir () {
{
# var is a symlink
- if ( $opt_mem and readlink($opt_vardir) eq $opt_mem )
+ if ( $opt_mem )
{
# Remove the directory which the link points at
mtr_verbose("Removing " . readlink($opt_vardir));
@@ -1286,14 +1289,6 @@ sub remove_stale_vardir () {
mtr_verbose("unlink($opt_vardir)");
unlink($opt_vardir);
}
- elsif ( $opt_mem )
- {
- # Just remove the "var" symlink
- mtr_report(" - WARNING: Removing '$opt_vardir' symlink it's wrong");
-
- mtr_verbose("unlink($opt_vardir)");
- unlink($opt_vardir);
- }
else
{
# Some users creates a soft link in mysql-test/var to another area
@@ -1756,7 +1751,39 @@ sub run_tests {
next;
}
- run_testcase($tinfo);
+ for my $repeat (1..$opt_repeat){
+
+ if (run_testcase($tinfo))
+ {
+ # Testcase failed, enter retry mode
+ my $retries= 1;
+ while ($retries <= $opt_retry){
+ mtr_report("\nRetrying, attempt($retries/$opt_retry)...\n");
+
+ if (run_testcase($tinfo) <= 0)
+ {
+ # Testcase suceeded
+
+ my $test_has_failed= $tinfo->{failures} || 0;
+ if (!$test_has_failed){
+ last;
+ }
+ }
+ else
+ {
+ # Testcase failed
+
+ # Limit number of test failures
+ my $failures= $tinfo->{failures};
+ if ($opt_retry > 1 and $failures >= $opt_retry_failure){
+ mtr_report("Test has failed $failures times, no more retries!\n");
+ last;
+ }
+ }
+ $retries++;
+ }
+ }
+ }
}
# Kill the test suite timer
$suite_timeout_proc->kill();
@@ -2080,28 +2107,29 @@ sub run_testcase_check_skip_test($)
}
-sub dynamic_binlog_format_switch {
- my ($tinfo, $mysqld)= @_;
+sub run_query {
+ my ($tinfo, $mysqld, $query)= @_;
- my $sql= "include/set_binlog_format_".$tinfo->{binlog_format_switch}.".sql";
my $args;
mtr_init_args(\$args);
mtr_add_arg($args, "--defaults-file=%s", $path_config_file);
mtr_add_arg($args, "--defaults-group-suffix=%s", $mysqld->after('mysqld'));
+
+ mtr_add_arg($args, "-e %s", $query);
+
my $res= My::SafeProcess->run
(
- name => "switch binlog format ".$mysqld->name(),
+ name => "run_query -> ".$mysqld->name(),
path => $exe_mysql,
args => \$args,
- input => $sql,
+ output => '/dev/null',
+ error => '/dev/null'
);
- if ($res != 0)
- {
- mtr_error("Failed to switch binlog format");
- }
+ return $res
}
+
sub do_before_run_mysqltest($)
{
my $tinfo= shift;
@@ -2197,6 +2225,11 @@ my %old_env;
#
# Run a single test case
#
+# RETURN VALUE
+# 0 OK
+# > 0 failure
+#
+
sub run_testcase ($) {
my $tinfo= shift;
@@ -2375,7 +2408,7 @@ sub run_testcase ($) {
# Remove the file that mysql-test-run writes info to
unlink($path_current_test_log);
- return;
+ return ($res == 62) ? 0 : $res;
}
@@ -2402,7 +2435,7 @@ sub run_testcase ($) {
"Server failed during test run";
report_failure_and_restart($tinfo);
- return;
+ return 1;
}
# ----------------------------------------------------
@@ -2413,7 +2446,7 @@ sub run_testcase ($) {
mtr_report("Test case timeout!");
$tinfo->{'timeout'}= 1; # Mark as timeout
report_failure_and_restart($tinfo);
- return;
+ return 1;
}
# ----------------------------------------------------
@@ -2427,6 +2460,7 @@ sub run_testcase ($) {
mtr_error("Unhandled process $proc exited");
}
+ mtr_error("Should never come here");
}
@@ -2575,7 +2609,7 @@ sub mysqld_stop {
sub mysqld_arguments ($$$) {
my $args= shift;
my $mysqld= shift;
- my $extra_opt= shift;
+ my $extra_opts= shift;
my $prefix= ""; # If mysqltest server arg
if ( $opt_embedded_server )
@@ -2590,7 +2624,7 @@ sub mysqld_arguments ($$$) {
# to start unless we specify what user to run as, see BUG#30630
my $euid= $>;
if (!$is_win32 and $euid == 0 and
- (grep(/^--user/, @$extra_opt, @opt_extra_mysqld_opt)) == 0) {
+ (grep(/^--user/, @$extra_opts)) == 0) {
mtr_add_arg($args, "%s--user=root", $prefix);
}
@@ -2611,8 +2645,7 @@ sub mysqld_arguments ($$$) {
}
# Check if "extra_opt" contains skip-log-bin
- my $skip_binlog= grep(/^(--|--loose-)skip-log-bin/,
- @$extra_opt, @opt_extra_mysqld_opt);
+ my $skip_binlog= grep(/^(--|--loose-)skip-log-bin/, @$extra_opts);
if ( $opt_debug )
{
@@ -2627,7 +2660,7 @@ sub mysqld_arguments ($$$) {
}
my $found_skip_core= 0;
- foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt )
+ foreach my $arg ( @$extra_opts )
{
# Allow --skip-core-file to be set in <testname>-[master|slave].opt file
if ($arg eq "--skip-core-file")
@@ -2656,9 +2689,12 @@ sub mysqld_arguments ($$$) {
}
+
sub mysqld_start ($$) {
my $mysqld= shift;
- my $extra_opt= shift;
+ my $extra_opts= shift;
+
+ mtr_verbose(My::Options::toStr("mysqld_start", @$extra_opts));
my $exe= $exe_mysqld;
my $wait_for_pid_file= 1;
@@ -2674,7 +2710,7 @@ sub mysqld_start ($$) {
valgrind_arguments($args, \$exe);
}
- mysqld_arguments($args,$mysqld,$extra_opt);
+ mysqld_arguments($args,$mysqld,$extra_opts);
if ( $opt_gdb || $opt_manual_gdb )
{
@@ -2743,7 +2779,7 @@ sub mysqld_start ($$) {
}
# Remember options used when starting
- $mysqld->{'started_opts'}= $extra_opt;
+ $mysqld->{'started_opts'}= $extra_opts;
return;
}
@@ -2757,13 +2793,19 @@ sub stop_all_servers () {
My::SafeProcess::shutdown(0, # shutdown timeout 0 => kill
started(all_servers()));
+ # Remove pidfiles
+ foreach my $server ( all_servers() )
+ {
+ my $pid_file= $server->if_exist('pid-file');
+ unlink($pid_file) if defined $pid_file;
+ }
+
# Mark servers as stopped
map($_->{proc}= undef, all_servers());
}
-
# Find out if server should be restarted for this test
sub server_need_restart {
my ($tinfo, $server)= @_;
@@ -2816,38 +2858,38 @@ sub server_need_restart {
}
}
- my $is_mysqld= grep ($server eq $_, mysqlds());
+ my $is_mysqld= grep ($server eq $_, mysqlds());
if ($is_mysqld)
{
# Check that running process was started with same options
# as the current test requires
- my $extra_opt= get_extra_opt($server, $tinfo);
+ my $extra_opts= get_extra_opts($server, $tinfo);
my $started_opts= $server->{'started_opts'};
- if (defined $started_opts and $extra_opt and
- ! mtr_same_opts($started_opts, $extra_opt) )
+
+ if (!My::Options::same($started_opts, $extra_opts) )
{
- # TODO Use a list to find all options that can be set dynamically
-
- # Check if diff is binlog format only
- # and the next test has $binlog_format_switch set
- my @diff_opts= mtr_diff_opts($started_opts, $extra_opt);
- if (@diff_opts == 2 and
- $diff_opts[0] =~/^--binlog-format=/ and
- $diff_opts[1] =~/^--binlog-format=/ and
- defined $tinfo->{binlog_format_switch})
- {
- mtr_verbose("Using dynamic switch of binlog format from ",
- $diff_opts[0],"to", $diff_opts[1]);
- dynamic_binlog_format_switch($tinfo, $server);
- }
- else
- {
+ my $use_dynamic_option_switch= 0;
+ return 1 if (!$use_dynamic_option_switch);
+
+ mtr_verbose(My::Options::toStr("started_opts", @$started_opts));
+ mtr_verbose(My::Options::toStr("extra_opts", @$extra_opts));
+
+ # Get diff and check if dynamic switch is possible
+ my @diff_opts= My::Options::diff($started_opts, $extra_opts);
+ mtr_verbose(My::Options::toStr("diff_opts", @diff_opts));
+
+ my $query= My::Options::toSQL(@diff_opts);
+ mtr_verbose("Attempting dynamic switch '$query'");
+ if (run_query($tinfo, $server, $query)){
mtr_verbose("Restart: running with different options '" .
- join(" ", @{$extra_opt}) . "' != '" .
+ join(" ", @{$extra_opts}) . "' != '" .
join(" ", @{$server->{'started_opts'}}) . "'" );
return 1;
}
+
+ # Remember the dynamically set options
+ $server->{'started_opts'}= $extra_opts;
}
}
@@ -2895,7 +2937,7 @@ sub started { return grep(defined $_, map($_->{proc}, @_)); }
sub stopped { return grep(!defined $_, map($_->{proc}, @_)); }
-sub get_extra_opt {
+sub get_extra_opts {
my ($mysqld, $tinfo)= @_;
return
@@ -2915,7 +2957,7 @@ sub stop_servers($$) {
# All servers are going down, use some kind of order to
# avoid too many warnings in the log files
- mtr_verbose("All servers are going down");
+ mtr_report("Restarting all servers");
# mysqld processes
My::SafeProcess::shutdown( $opt_shutdown_timeout, started(mysqlds()) );
@@ -2926,6 +2968,8 @@ sub stop_servers($$) {
}
else
{
+ mtr_report("Restarting ", started(@servers));
+
# Stop only some servers
My::SafeProcess::shutdown( $opt_shutdown_timeout,
started(@servers) );
@@ -3031,8 +3075,8 @@ sub start_servers($) {
return 1;
}
- my $extra_opt= get_extra_opt($mysqld, $tinfo);
- mysqld_start($mysqld,$extra_opt);
+ my $extra_opts= get_extra_opts($mysqld, $tinfo);
+ mysqld_start($mysqld,$extra_opts);
# Save this test case information, so next can examine it
$mysqld->{'started_tinfo'}= $tinfo;
@@ -3549,8 +3593,10 @@ Options to control what test suites or cases to run
skip-test=PREFIX or REGEX
Skip test cases which name are prefixed with PREFIX
or fulfills REGEX
- start-from=PREFIX Run test cases starting from test prefixed with PREFIX
- suite[s]=NAME1,..,NAMEN Collect tests in suites from the comma separated
+ start-from=PREFIX Run test cases starting test prefixed with PREFIX where
+ prefix may be suite.testname or just testname
+ suite[s]=NAME1,..,NAMEN
+ Collect tests in suites from the comma separated
list of suite names.
The default is: "$opt_suites"
skip-rpl Skip the replication test cases.
@@ -3634,6 +3680,10 @@ Misc options
the first specified test case
fast Run as fast as possible, dont't wait for servers
to shutdown etc.
+ repeat=N Run each test N number of times
+ retry=N Retry tests that fail N times, limit number of failures
+ to $opt_retry_failure
+ retry-failure=N Limit number of retries for a failed test
reorder Reorder tests to get fewer server restarts
help Get this help text