Commit 9bc9855c authored by Sergei Golubchik's avatar Sergei Golubchik

mtr changes:

* expanding unknown env variable does not abort mtr
* have_archive, blackhole, innodb - preload the corresponding engine
* all options from .opt files get equal treatment, all are searched for special options,
  not only -{master,slave}.opt as before (which ignored suite.opt and --mysqld=...)
* --plugin-load gets special treatment too - all instances are merged into one
* federated test fixed to preload federated
parent 1aa3b02c
...@@ -20,11 +20,18 @@ subdirectories under the suitedir or directly in the suitedir ...@@ -20,11 +20,18 @@ subdirectories under the suitedir or directly in the suitedir
(that is suitedir/t/*.test or suitedir/*.test, same for *.result)) (that is suitedir/t/*.test or suitedir/*.test, same for *.result))
========================== ==========================
A suite can contain a suite.opt file - at the same location where .test A suite can contain a suite.opt file - at the same location where .test files
files are. As usual, the .opt file can use $-substitutions for the are or in the suite directory. As usual, the .opt file can use $-substitutions
environment variables. for the environment variables.
Usually, using my.cnf template (see below) is preferrable. Usually, using my.cnf template (see below) is preferrable.
But command line options (.opt files and combinations file) get special
treatment - they can have special options that affect mtr behavior. cnf
files cannot. Special options are
--timezone, --plugin-load, --result-file, --config-file-template,
--default-time-zone, --force-restart
========================== ==========================
A suite can have suite.pm file in the suitedir. It must declare a A suite can have suite.pm file in the suitedir. It must declare a
package that inherits from My::Suite. package that inherits from My::Suite.
...@@ -108,8 +115,8 @@ Most probably a suite my.cnf will need to start from ...@@ -108,8 +115,8 @@ Most probably a suite my.cnf will need to start from
!include include/default_my.cnf !include include/default_my.cnf
and then modify the configuration as necessary. and then modify the configuration as necessary.
==========================
==========================
A suite can have combinations file in the suitedir. It uses my.cnf syntax A suite can have combinations file in the suitedir. It uses my.cnf syntax
but it cannot use @-substitutions. Instead, it can use $-substitutions for but it cannot use @-substitutions. Instead, it can use $-substitutions for
the environment variables. Because the combination options will not be the environment variables. Because the combination options will not be
......
--disable_query_log if (!`SELECT count(*) FROM information_schema.engines WHERE
--require r/true.require (support = 'YES' OR support = 'DEFAULT') AND
select (support = 'YES' or support = 'DEFAULT') as `TRUE` from information_schema.engines where engine = 'archive'; engine = 'archive'`){
--enable_query_log skip Need archive engine;
}
--loose-archive
--plugin-load=$HA_ARCHIVE_SO
--loose-blackhole
--plugin-load=$HA_BLACKHOLE_SO
--loose-innodb --loose-innodb
--plugin-load=$HA_XTRADB_SO
disable_query_log; if (!`SELECT count(*) FROM information_schema.engines WHERE
--require r/true.require (support = 'YES' OR support = 'DEFAULT') AND
select (support = 'YES' or support = 'DEFAULT') as `TRUE` from information_schema.engines where engine = 'pbxt'; engine = 'pbxt'`){
enable_query_log; skip Need PBXT engine;
}
...@@ -325,12 +325,8 @@ sub collect_one_suite ...@@ -325,12 +325,8 @@ sub collect_one_suite
} }
# Read suite.opt file # Read suite.opt file
my $suite_opt_file= "$testdir/suite.opt"; my $suite_opts= [ opts_from_file("$testdir/suite.opt") ];
my $suite_opts= []; $suite_opts = [ opts_from_file("$suitedir/suite.opt") ] unless @$suite_opts;
if ( -f $suite_opt_file )
{
$suite_opts= opts_from_file($suite_opt_file);
}
if ( @$opt_cases ) if ( @$opt_cases )
{ {
...@@ -618,67 +614,78 @@ sub optimize_cases { ...@@ -618,67 +614,78 @@ sub optimize_cases {
# Read options from the given opt file and append them as an array # Read options from the given opt file and append them as an array
# to $tinfo->{$opt_name} # to $tinfo->{$opt_name}
# #
sub process_opts_file { sub process_opts {
my ($tinfo, $opt_file, $opt_name)= @_; my ($tinfo, $opt_name)= @_;
my @opts= @{$tinfo->{$opt_name}};
$tinfo->{$opt_name} = [];
my @plugins;
if ( -f $opt_file ) foreach my $opt (@opts)
{ {
my $opts= opts_from_file($opt_file); my $value;
foreach my $opt ( @$opts ) # The opt file is used both to send special options to the mysqld
# as well as pass special test case specific options to this
# script
$value= mtr_match_prefix($opt, "--timezone=");
if ( defined $value )
{ {
my $value; $tinfo->{'timezone'}= $value;
next;
}
# The opt file is used both to send special options to the mysqld $value= mtr_match_prefix($opt, "--plugin-load=");
# as well as pass special test case specific options to this if (defined $value)
# script {
push @plugins, $value;
next;
}
$value= mtr_match_prefix($opt, "--timezone="); $value= mtr_match_prefix($opt, "--result-file=");
if ( defined $value ) if ( defined $value )
{ {
$tinfo->{'timezone'}= $value; # Specifies the file mysqltest should compare
next; # output against
} $tinfo->{'result_file'}= "r/$value.result";
next;
}
$value= mtr_match_prefix($opt, "--result-file="); $value= mtr_match_prefix($opt, "--config-file-template=");
if ( defined $value ) if ( defined $value)
{ {
# Specifies the file mysqltest should compare # Specifies the configuration file to use for this test
# output against $tinfo->{'template_path'}= dirname($tinfo->{path})."/$value";
$tinfo->{'result_file'}= "r/$value.result"; next;
next; }
}
$value= mtr_match_prefix($opt, "--config-file-template="); # If we set default time zone, remove the one we have
if ( defined $value) $value= mtr_match_prefix($opt, "--default-time-zone=");
{ if ( defined $value )
# Specifies the configuration file to use for this test {
$tinfo->{'template_path'}= dirname($tinfo->{path})."/$value"; # Set timezone for this test case to something different
next; $tinfo->{'timezone'}= "GMT-8";
} # Fallthrough, add the --default-time-zone option
}
# If we set default time zone, remove the one we have # The --restart option forces a restart even if no special
$value= mtr_match_prefix($opt, "--default-time-zone="); # option is set. If the options are the same as next testcase
if ( defined $value ) # there is no need to restart after the testcase
{ # has completed
# Set timezone for this test case to something different if ( $opt eq "--force-restart" )
$tinfo->{'timezone'}= "GMT-8"; {
# Fallthrough, add the --default-time-zone option $tinfo->{'force_restart'}= 1;
} next;
}
# The --restart option forces a restart even if no special # Ok, this was a real option, add it
# option is set. If the options are the same as next testcase push(@{$tinfo->{$opt_name}}, $opt);
# there is no need to restart after the testcase }
# has completed
if ( $opt eq "--force-restart" )
{
$tinfo->{'force_restart'}= 1;
next;
}
# Ok, this was a real option, add it if (@plugins) {
push(@{$tinfo->{$opt_name}}, $opt); push @{$tinfo->{$opt_name}}, "--plugin-load=" . join(':', @plugins);
}
} }
} }
...@@ -1009,15 +1016,17 @@ sub collect_one_test_case { ...@@ -1009,15 +1016,17 @@ sub collect_one_test_case {
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
for (@source_files) { for (@source_files) {
s/\.\w+$//; s/\.\w+$//;
process_opts_file($tinfo, "$_.opt", 'master_opt'); push @{$tinfo->{master_opt}}, opts_from_file("$_.opt");
process_opts_file($tinfo, "$_.opt", 'slave_opt'); push @{$tinfo->{slave_opt}}, opts_from_file("$_.opt");
process_opts_file($tinfo, "$_-master.opt", 'master_opt'); push @{$tinfo->{master_opt}}, opts_from_file("$_-master.opt");
process_opts_file($tinfo, "$_-slave.opt", 'slave_opt'); push @{$tinfo->{slave_opt}}, opts_from_file("$_-slave.opt");
} }
push(@{$tinfo->{'master_opt'}}, @::opt_extra_mysqld_opt); push(@{$tinfo->{'master_opt'}}, @::opt_extra_mysqld_opt);
push(@{$tinfo->{'slave_opt'}}, @::opt_extra_mysqld_opt); push(@{$tinfo->{'slave_opt'}}, @::opt_extra_mysqld_opt);
process_opts($tinfo, 'master_opt');
process_opts($tinfo, 'slave_opt');
return $tinfo; return $tinfo;
} }
...@@ -1103,6 +1112,8 @@ sub opts_from_file ($) { ...@@ -1103,6 +1112,8 @@ sub opts_from_file ($) {
my $file= shift; my $file= shift;
local $_; local $_;
return () unless -f $file;
open(FILE,"<",$file) or mtr_error("can't open file \"$file\": $!"); open(FILE,"<",$file) or mtr_error("can't open file \"$file\": $!");
my @args; my @args;
while ( <FILE> ) while ( <FILE> )
...@@ -1143,7 +1154,7 @@ sub opts_from_file ($) { ...@@ -1143,7 +1154,7 @@ sub opts_from_file ($) {
} }
} }
close FILE; close FILE;
return \@args; return @args;
} }
sub print_testcases { sub print_testcases {
......
...@@ -3564,8 +3564,9 @@ sub timezone { ...@@ -3564,8 +3564,9 @@ sub timezone {
my ($tinfo)= @_; my ($tinfo)= @_;
local $_ = $tinfo->{timezone}; local $_ = $tinfo->{timezone};
return 'DEFAULT' unless defined $_; return 'DEFAULT' unless defined $_;
s/\$\{(\w+)\}/envsubst($1)/ge; no warnings 'uninitialized';
s/\$(\w+)/envsubst($1)/ge; s/\$\{(\w+)\}/$ENV{$1}/ge;
s/\$(\w+)/$ENV{$1}/ge;
$_; $_;
} }
...@@ -5071,18 +5072,6 @@ sub started { return grep(defined $_, map($_->{proc}, @_)); } ...@@ -5071,18 +5072,6 @@ sub started { return grep(defined $_, map($_->{proc}, @_)); }
sub stopped { return grep(!defined $_, map($_->{proc}, @_)); } sub stopped { return grep(!defined $_, map($_->{proc}, @_)); }
sub envsubst {
my $string= shift;
if ( ! defined $ENV{$string} )
{
mtr_error(".opt file references '$string' which is not set");
}
return $ENV{$string};
}
sub get_extra_opts { sub get_extra_opts {
my ($mysqld, $tinfo)= @_; my ($mysqld, $tinfo)= @_;
...@@ -5093,8 +5082,9 @@ sub get_extra_opts { ...@@ -5093,8 +5082,9 @@ sub get_extra_opts {
# Expand environment variables # Expand environment variables
foreach my $opt ( @$opts ) foreach my $opt ( @$opts )
{ {
$opt =~ s/\$\{(\w+)\}/envsubst($1)/ge; no warnings 'uninitialized';
$opt =~ s/\$(\w+)/envsubst($1)/ge; $opt =~ s/\$\{(\w+)\}/$ENV{$1}/ge;
$opt =~ s/\$(\w+)/$ENV{$1}/ge;
} }
return $opts; return $opts;
} }
......
...@@ -3,10 +3,8 @@ ...@@ -3,10 +3,8 @@
[mysqld.1] [mysqld.1]
log-bin= master-bin log-bin= master-bin
loose-federated
[mysqld.2] [mysqld.2]
loose-federated
[ENV] [ENV]
MASTER_MYPORT= @mysqld.1.port MASTER_MYPORT= @mysqld.1.port
......
--federated
--plugin-load=$HA_FEDERATEDX_SO
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
if (`SELECT $PS_PROTOCOL = 0`) if (`SELECT $PS_PROTOCOL = 0`)
{ {
--skip Need prepared statement protocol --skip Need ps-protocol
} }
# #
......
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