Commit 190ed5a2 authored by Michael Widenius's avatar Michael Widenius

Automatic merge with main 5.1

parents ecf95c6e ced63539
...@@ -91,8 +91,8 @@ path=`dirname $0` ...@@ -91,8 +91,8 @@ path=`dirname $0`
get_make_parallel_flag get_make_parallel_flag
# SSL library to use.--with-ssl will select our bundled yaSSL # SSL library to use.--with-ssl will select our bundled yaSSL
# implementation of SSL. To use openSSl you will nee too point out # implementation of SSL. To use OpenSSL you will need to specify
# the location of openSSL headers and lbs on your system. # the location of OpenSSL headers and libs on your system.
# Ex --with-ssl=/usr # Ex --with-ssl=/usr
SSL_LIBRARY=--with-ssl SSL_LIBRARY=--with-ssl
...@@ -182,8 +182,7 @@ max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max" ...@@ -182,8 +182,7 @@ max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max"
max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache" max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache"
max_no_ndb_configs="$SSL_LIBRARY --with-plugins=max-no-ndb --with-embedded-server --with-libevent" max_no_ndb_configs="$SSL_LIBRARY --with-plugins=max-no-ndb --with-embedded-server --with-libevent"
max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent" max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent"
# Disable NDB in maria max builds all_configs="$SSL_LIBRARY --with-plugins=max --with-plugin-ndbcluster --with-embedded-server --with-libevent"
max_configs=$max_no_ndb_configs
# #
# CPU and platform specific compilation flags. # CPU and platform specific compilation flags.
......
#! /bin/sh
path=`dirname $0`
. "$path/SETUP.sh"
extra_flags="$amd64_cflags $debug_cflags"
extra_configs="$amd64_configs $debug_configs $all_configs"
. "$path/FINISH.sh"
#! /bin/sh
path=`dirname $0`
set -- "$@" --with-debug=full
. "$path/SETUP.sh"
extra_flags="$pentium_cflags $debug_cflags"
extra_configs="$pentium_configs $debug_configs $all_configs $error_inject --with-experimental-collations"
. "$path/FINISH.sh"
#! /bin/sh
path=`dirname $0`
set -- "$@" --with-debug=full
. "$path/SETUP.sh"
extra_flags="$pentium64_cflags $debug_cflags"
extra_configs="$pentium_configs $debug_configs $all_configs"
extra_configs="$extra_configs "
CC="$CC --pipe"
. "$path/FINISH.sh"
...@@ -63,13 +63,14 @@ nobase_test_DATA = \ ...@@ -63,13 +63,14 @@ nobase_test_DATA = \
lib/My/SafeProcess.pm \ lib/My/SafeProcess.pm \
lib/My/File/Path.pm \ lib/My/File/Path.pm \
lib/My/SysInfo.pm \ lib/My/SysInfo.pm \
lib/My/Suite.pm \
lib/My/CoreDump.pm \ lib/My/CoreDump.pm \
lib/My/SafeProcess/Base.pm \ lib/My/SafeProcess/Base.pm \
lib/My/SafeProcess/safe_process.pl lib/My/SafeProcess/safe_process.pl
SUBDIRS = lib/My/SafeProcess SUBDIRS = lib/My/SafeProcess
EXTRA_DIST = README \ EXTRA_DIST = README README.suites \
$(test_SCRIPTS) \ $(test_SCRIPTS) \
$(nobase_test_DATA) $(nobase_test_DATA)
...@@ -101,7 +102,7 @@ TEST_DIRS = t r include std_data std_data/parts collections \ ...@@ -101,7 +102,7 @@ TEST_DIRS = t r include std_data std_data/parts collections \
suite/ndb suite/ndb/t suite/ndb/r \ suite/ndb suite/ndb/t suite/ndb/r \
suite/rpl_ndb suite/rpl_ndb/t suite/rpl_ndb/r \ suite/rpl_ndb suite/rpl_ndb/t suite/rpl_ndb/r \
suite/parts suite/parts/t suite/parts/r suite/parts/inc \ suite/parts suite/parts/t suite/parts/r suite/parts/inc \
suite/pbxt/t suite/pbxt/r \ suite/pbxt/t suite/pbxt/r suite/pbxt \
suite/innodb suite/innodb/t suite/innodb/r suite/innodb/include \ suite/innodb suite/innodb/t suite/innodb/r suite/innodb/include \
suite/innodb_plugin suite/innodb_plugin/t suite/innodb_plugin/r suite/innodb_plugin/include \ suite/innodb_plugin suite/innodb_plugin/t suite/innodb_plugin/r suite/innodb_plugin/include \
suite/percona \ suite/percona \
......
These are the assorted notes that will be turned into a manual eventually.
==========================
Tests are organized in suites.
A "suite" is a subdirectory inside, one of,
<basedir>/mysql-test/suite
<basedir>/mysql-test
<basedir>/share/mysql-test/suite
<basedir>/share/mysql-test
<basedir>/share/mysql/mysql-test/suite
<basedir>/share/mysql/mysql-test
<basedir>/storage/*/mysql-test-suites
This is supposed to cover running mtr from a source directory and installed.
==========================
A suite contains *.test and *.result files. They can be in the t/ and r/
subdirectories under the suitedir or directly in the suitedir
(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
files are. As usual, the .opt file can use $-substitutions for the
environment variables.
Usually, using my.cnf template (see below) is preferrable.
==========================
A suite can have suite.pm file in the suitedir. It must declare a
package that inherits from My::Suite.
The suite.pm needs to have @ISA=qw(My::Suite) and it must end
with bless {}; - that is it must return an object of that class.
It can also return a string - in this case all tests in the suite
will be skipped, with this string being printed as a reason.
A suite class can define config_files() and servers() methods.
A config_files method returns a list of additional config files (besides
my.cnf), that this suite needs to be created. For every file it specifies
a function that will create it, when given a My::Config object. For example:
sub config_files { ( 'config.ini' => \&write_ini,
'new.conf' => \&do_new_conf ) }
A servers method returns a list of processes that needs to be started for
this suite. A process is specified as a pair (regex, hash). A regex must
match a section in the my.cnf template (for example, qr/mysqld\./ corresponds
to all mysqld processes), a hash contains these options:
SORT => a number, processes are started in the order of increasing SORT
values (and stopped in the reverse order). mysqld has number 300.
START => a function to start a process. It takes two arguments,
My::Config::Group and My::Test. If START is undefined the process
will not be started.
WAIT => a function waits for the process to be started. It takes
My::Config::Group as an argument. Internallys mtr first invokes
START for all processes, then WAIT for all started processes.
example: sub servers { ( qr/^foo$/ => { SORT => 200,
START => \&start_foo,
WAIT => \&wait_foo } ) }
See sphinx suite for an example.
==========================
A suite can have my.cnf template file in the suitedir.
A my.cnf template uses a normal my.cnf syntax - groups, options,
and values - with templating extensions. They are
* There can be groups with non-standard names, not used by mysqld.
These groups may be used by the suite.pm file somehow.
For example, they can be written to the additional config files.
See sphinx suite for an example.
* There can be ENV group. It sets values for the environment variables.
* Values can refer to each other - they will be expanded as needed.
A reference to a value of an option looks like @groupname.optionname.
For example
[mysqld.2]
master-port= @mysqld.1.port
it sets the master-port in the mysqld.2 group to the value of
port in the mysqld.1 group.
* An option name may start from '#'. In the resulting my.cnf it will look
like a comment, but it still can be referred to. For example:
[example]
#foo = localhost:@mysqld.1.port
bar = http://@example.#foo/index.html
* There are two special - in this regard - groups.
Via the ENV group one can refer to any environment variable, not only
to values in the [ENV] group of my.cnf file.
Via the OPT group one can refer to special values:
@OPT.vardir - a path to vardir
@OPT.port - a new port number is reserved out of the pool. It will not
match any other port number used by this test run.
See sphinx suite for an example.
Most probably a suite my.cnf will need to start from
!include include/default_my.cnf
and then modify the configuration as necessary.
==========================
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
the environment variables. Because the combination options will not be
merged to a my.cnf, but will be added to the command line. Example:
[conf1]
opt1=val1
[conf2]
opt1=val2
opt2=$HAVE_SOMETHING
Such a file will cause every test from the suite to be run twice - once
with mysqld using --opt1=val1 and the other one with mysqld using
--opt1=val2 --opt2=$HAVE_SOMETHING
One can limit mtr run to a subset of combinations by setting environment
variable SUITENAME_COMBINATIONS to the ':'-separated set of combination
names. E.g.
RPL_COMBINATIONS=mix:row ./mtr --suite rpl
See innodb_plugin suite for an example of how suite.pm may set this variable
to exclude unsupported configurations.
==========================
...@@ -6,9 +6,6 @@ ...@@ -6,9 +6,6 @@
# Run the master.sh script before starting this process # Run the master.sh script before starting this process
#!run-master-sh #!run-master-sh
log-bin= master-bin
[mysqlbinlog] [mysqlbinlog]
disable-force-if-open disable-force-if-open
......
...@@ -13,9 +13,10 @@ key_buffer_size= 1M ...@@ -13,9 +13,10 @@ key_buffer_size= 1M
sort_buffer= 256K sort_buffer= 256K
max_heap_table_size= 1M max_heap_table_size= 1M
loose-skip-innodb
loose-skip-pbxt
loose-innodb_data_file_path= ibdata1:10M:autoextend loose-innodb_data_file_path= ibdata1:10M:autoextend
slave-net-timeout=120 slave-net-timeout=120
log-bin=mysqld-bin
disable_query_log;
--require r/true.require
select (support = 'YES' or support = 'DEFAULT') as `TRUE` from information_schema.engines where engine = 'example';
enable_query_log;
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' or support = 'ENABLED') as `TRUE` from information_schema.engines where engine = 'innodb'; engine = 'innodb'`){
enable_query_log; skip Needs innodb engine;
}
disable_query_log; if (!`SELECT COUNT(*) FROM INFORMATION_SCHEMA.PLUGINS
--require r/true.require WHERE PLUGIN_NAME = 'innodb' AND PLUGIN_STATUS = 'active' AND
SELECT (plugin_library LIKE 'ha_innodb_plugin%' OR plugin_description LIKE '%xtradb%') AS `TRUE` FROM information_schema.plugins WHERE LOWER(plugin_name) = 'innodb' AND LOWER(plugin_status) = 'active'; (PLUGIN_LIBRARY LIKE 'ha_innodb_plugin%' OR PLUGIN_DESCRIPTION LIKE '%xtradb%')`) {
enable_query_log; skip Need InnoDB plugin or XtraDB;
}
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
# #
# source include/have_log_bin.inc; # source include/have_log_bin.inc;
source include/not_embedded.inc;
-- require r/have_log_bin.require -- require r/have_log_bin.require
disable_query_log; disable_query_log;
show variables like 'log_bin'; show variables like 'log_bin';
......
...@@ -6,7 +6,6 @@ use strict; ...@@ -6,7 +6,6 @@ use strict;
use warnings; use warnings;
use Carp; use Carp;
sub new { sub new {
my ($class, $option_name, $option_value)= @_; my ($class, $option_name, $option_value)= @_;
my $self= bless { name => $option_name, my $self= bless { name => $option_name,
...@@ -61,7 +60,7 @@ sub insert { ...@@ -61,7 +60,7 @@ sub insert {
$option->{value}= $value; $option->{value}= $value;
} }
else { else {
my $option= My::Config::Option->new($option_name, $value); $option= My::Config::Option->new($option_name, $value);
# Insert option in list # Insert option in list
push(@{$self->{options}}, $option); push(@{$self->{options}}, $option);
# Insert option in hash # Insert option in hash
...@@ -163,6 +162,62 @@ sub if_exist { ...@@ -163,6 +162,62 @@ sub if_exist {
return $option->value(); return $option->value();
} }
package My::Config::Group::ENV;
our @ISA=qw(My::Config::Group);
use strict;
use warnings;
use Carp;
sub new {
my ($class, $group_name)= @_;
bless My::Config::Group->new($group_name), $class;
}
#
# Return value for an option in the group, fail if it does not exist
#
sub value {
my ($self, $option_name)= @_;
my $option= $self->option($option_name);
if (! defined($option) and defined $ENV{$option_name}) {
my $value= $ENV{$option_name};
$option= My::Config::Option->new($option_name, $value);
}
croak "No option named '$option_name' in group '$self->{name}'"
if ! defined($option);
return $option->value();
}
package My::Config::Group::OPT;
our @ISA=qw(My::Config::Group);
use strict;
use warnings;
use Carp;
sub new {
my ($class, $group_name)= @_;
bless My::Config::Group->new($group_name), $class;
}
sub options {
my ($self)= @_;
()
}
sub value {
my ($self, $option_name)= @_;
my $option= $self->option($option_name);
croak "No option named '$option_name' in group '$self->{name}'"
if ! defined($option);
return $option->value()->();
}
package My::Config; package My::Config;
...@@ -182,7 +237,10 @@ sub new { ...@@ -182,7 +237,10 @@ sub new {
my ($class, $path)= @_; my ($class, $path)= @_;
my $group_name= undef; my $group_name= undef;
my $self= bless { groups => [] }, $class; my $self= bless { groups => [
My::Config::Group::ENV->new('ENV'),
My::Config::Group::OPT->new('OPT'),
] }, $class;
my $F= IO::File->new($path, "<") my $F= IO::File->new($path, "<")
or croak "Could not open '$path': $!"; or croak "Could not open '$path': $!";
...@@ -199,19 +257,13 @@ sub new { ...@@ -199,19 +257,13 @@ sub new {
} }
# Magic #! comments # Magic #! comments
elsif ( $line =~ /^#\!/) { elsif ( $line =~ /^(#\!\S+)(?:\s*(.*?)\s*)?$/) {
my $magic= $line; my ($magic, $arg)= ($1, $2);
croak "Found magic comment '$magic' outside of group" croak "Found magic comment '$magic' outside of group"
unless $group_name; unless $group_name;
#print "$magic\n"; #print "$magic\n";
$self->insert($group_name, $magic, undef); $self->insert($group_name, $magic, $arg);
}
# Comments
elsif ( $line =~ /^#/ || $line =~ /^;/) {
# Skip comment
next;
} }
# Empty lines # Empty lines
...@@ -236,7 +288,7 @@ sub new { ...@@ -236,7 +288,7 @@ sub new {
} }
# <option> # <option>
elsif ( $line =~ /^([\@\w-]+)\s*$/ ) { elsif ( $line =~ /^(#?[\w-]+)\s*$/ ) {
my $option= $1; my $option= $1;
croak "Found option '$option' outside of group" croak "Found option '$option' outside of group"
...@@ -247,7 +299,7 @@ sub new { ...@@ -247,7 +299,7 @@ sub new {
} }
# <option>=<value> # <option>=<value>
elsif ( $line =~ /^([\@\w-]+)\s*=\s*(.*?)\s*$/ ) { elsif ( $line =~ /^(#?[\w-]+)\s*=\s*(.*?)\s*$/ ) {
my $option= $1; my $option= $1;
my $value= $2; my $value= $2;
...@@ -256,10 +308,17 @@ sub new { ...@@ -256,10 +308,17 @@ sub new {
#print "$option=$value\n"; #print "$option=$value\n";
$self->insert($group_name, $option, $value); $self->insert($group_name, $option, $value);
} else {
croak "Unexpected line '$line' found in '$path'";
} }
# Comments
elsif ( $line =~ /^#/ || $line =~ /^;/) {
# Skip comment
next;
}
else {
croak "Unexpected line '$line' found in '$path'";
}
} }
undef $F; # Close the file undef $F; # Close the file
...@@ -437,44 +496,4 @@ sub exists { ...@@ -437,44 +496,4 @@ sub exists {
return defined($option); return defined($option);
} }
# Overload "to string"-operator with 'stringify'
use overload
'""' => \&stringify;
#
# Return the config as a string in my.cnf file format
#
sub stringify {
my ($self)= @_;
my $res;
foreach my $group ($self->groups()) {
$res .= "[$group->{name}]\n";
foreach my $option ($group->options()) {
$res .= $option->name();
my $value= $option->value();
if (defined $value) {
$res .= "=$value";
}
$res .= "\n";
}
$res .= "\n";
}
return $res;
}
#
# Save the config to named file
#
sub save {
my ($self, $path)= @_;
my $F= IO::File->new($path, ">")
or croak "Could not open '$path': $!";
print $F $self;
undef $F; # Close the file
}
1; 1;
...@@ -57,16 +57,12 @@ sub fix_pidfile { ...@@ -57,16 +57,12 @@ sub fix_pidfile {
sub fix_port { sub fix_port {
my ($self, $config, $group_name, $group)= @_; my ($self, $config, $group_name, $group)= @_;
my $hostname= $group->value('#host'); return $self->{PORT}++;
return $self->{HOSTS}->{$hostname}++;
} }
sub fix_host { sub fix_host {
my ($self)= @_; my ($self)= @_;
# Get next host from HOSTS array 'localhost'
my @hosts= keys(%{$self->{HOSTS}});;
my $host_no= $self->{NEXT_HOST}++ % @hosts;
return $hosts[$host_no];
} }
sub is_unique { sub is_unique {
...@@ -229,7 +225,7 @@ if (IS_WINDOWS) ...@@ -229,7 +225,7 @@ if (IS_WINDOWS)
sub fix_ndb_mgmd_port { sub fix_ndb_mgmd_port {
my ($self, $config, $group_name, $group)= @_; my ($self, $config, $group_name, $group)= @_;
my $hostname= $group->value('HostName'); my $hostname= $group->value('HostName');
return $self->{HOSTS}->{$hostname}++; return $self->{PORT}++;
} }
...@@ -428,20 +424,24 @@ sub post_check_embedded_group { ...@@ -428,20 +424,24 @@ sub post_check_embedded_group {
sub resolve_at_variable { sub resolve_at_variable {
my ($self, $config, $group, $option)= @_; my ($self, $config, $group, $option)= @_;
local $_ = $option->value();
my ($res, $after);
# Split the options value on last . while (m/(.*?)\@((?:\w+\.)+)(#?[-\w]+)/g) {
my @parts= split(/\./, $option->value()); my ($before, $group_name, $option_name)= ($1, $2, $3);
my $option_name= pop(@parts); $after = $';
my $group_name= join('.', @parts); chop($group_name);
$group_name =~ s/^\@//; # Remove at
my $from_group= $config->group($group_name) my $from_group= $config->group($group_name)
or croak "There is no group named '$group_name' that ", or croak "There is no group named '$group_name' that ",
"can be used to resolve '$option_name'"; "can be used to resolve '$option_name'";
my $from= $from_group->value($option_name); my $value= $from_group->value($option_name);
$config->insert($group->name(), $option->name(), $from) $res .= $before.$value;
}
$res .= $after;
$config->insert($group->name(), $option->name(), $res)
} }
...@@ -453,7 +453,7 @@ sub post_fix_resolve_at_variables { ...@@ -453,7 +453,7 @@ sub post_fix_resolve_at_variables {
next unless defined $option->value(); next unless defined $option->value();
$self->resolve_at_variable($config, $group, $option) $self->resolve_at_variable($config, $group, $option)
if ($option->value() =~ /^\@/); if ($option->value() =~ /\@/);
} }
} }
} }
...@@ -595,28 +595,18 @@ sub new_config { ...@@ -595,28 +595,18 @@ sub new_config {
croak "you must pass '$required'" unless defined $args->{$required}; croak "you must pass '$required'" unless defined $args->{$required};
} }
# Fill in hosts/port hash
my $hosts= {};
my $baseport= $args->{baseport};
$args->{hosts}= [ 'localhost' ] unless exists($args->{hosts});
foreach my $host ( @{$args->{hosts}} ) {
$hosts->{$host}= $baseport;
}
# Open the config template # Open the config template
my $config= My::Config->new($args->{'template_path'}); my $config= My::Config->new($args->{'template_path'});
my $extra_template_path= $args->{'extra_template_path'};
if ($extra_template_path){
$config->append(My::Config->new($extra_template_path));
}
my $self= bless { my $self= bless {
CONFIG => $config, CONFIG => $config,
ARGS => $args, ARGS => $args,
HOSTS => $hosts, PORT => $args->{baseport},
NEXT_HOST => 0,
SERVER_ID => 1, SERVER_ID => 1,
}, $class; }, $class;
# add auto-options
$config->insert('OPT', 'port' => sub { fix_port($self, $config) });
$config->insert('OPT', 'vardir' => sub { shift->{ARGS}->{vardir} });
{ {
# Run pre rules # Run pre rules
......
File mode changed from 100755 to 100644
...@@ -120,7 +120,7 @@ sub new { ...@@ -120,7 +120,7 @@ sub new {
my $input = delete($opts{'input'}); my $input = delete($opts{'input'});
my $output = delete($opts{'output'}); my $output = delete($opts{'output'});
my $error = delete($opts{'error'}); my $error = delete($opts{'error'});
my $verbose = delete($opts{'verbose'}); my $verbose = delete($opts{'verbose'}) || $::opt_verbose;
my $nocore = delete($opts{'nocore'}); my $nocore = delete($opts{'nocore'});
my $host = delete($opts{'host'}); my $host = delete($opts{'host'});
my $shutdown = delete($opts{'shutdown'}); my $shutdown = delete($opts{'shutdown'});
......
# A default suite class that is used for all suites without their owns suite.pm
# see README.suites for a description
package My::Suite;
sub config_files { () }
sub servers { () }
bless { };
...@@ -20,6 +20,12 @@ sub new { ...@@ -20,6 +20,12 @@ sub new {
return $self; return $self;
} }
sub fullname {
my ($self)= @_;
$self->{name} . (defined $self->{combination}
? " '$self->{combination}'"
: "")
}
# #
# Return a unique key that can be used to # Return a unique key that can be used to
......
...@@ -39,7 +39,6 @@ our $enable_disabled; ...@@ -39,7 +39,6 @@ our $enable_disabled;
our $default_storage_engine; our $default_storage_engine;
our $opt_with_ndbcluster_only; our $opt_with_ndbcluster_only;
our $defaults_file; our $defaults_file;
our $defaults_extra_file;
our $quick_collect; our $quick_collect;
sub collect_option { sub collect_option {
...@@ -68,21 +67,10 @@ require "mtr_misc.pl"; ...@@ -68,21 +67,10 @@ require "mtr_misc.pl";
my $do_test_reg; my $do_test_reg;
my $skip_test_reg; my $skip_test_reg;
# Related to adding InnoDB plugin combinations
my $lib_innodb_plugin;
# If "Quick collect", set to 1 once a test to run has been found. # If "Quick collect", set to 1 once a test to run has been found.
my $some_test_found; my $some_test_found;
sub find_innodb_plugin { my $default_suite_object = do 'My/Suite.pm';
$lib_innodb_plugin=
my_find_file($::basedir,
["storage/innodb_plugin", "storage/innodb_plugin/.libs",
"lib/mysql/plugin", "lib/plugin"],
["ha_innodb_plugin.dll", "ha_innodb_plugin.so",
"ha_innodb_plugin.sl"],
NOT_REQUIRED);
}
sub init_pattern { sub init_pattern {
my ($from, $what)= @_; my ($from, $what)= @_;
...@@ -116,8 +104,6 @@ sub collect_test_cases ($$$) { ...@@ -116,8 +104,6 @@ sub collect_test_cases ($$$) {
$do_test_reg= init_pattern($do_test, "--do-test"); $do_test_reg= init_pattern($do_test, "--do-test");
$skip_test_reg= init_pattern($skip_test, "--skip-test"); $skip_test_reg= init_pattern($skip_test, "--skip-test");
&find_innodb_plugin;
# If not reordering, we also shouldn't group by suites, unless # If not reordering, we also shouldn't group by suites, unless
# no test cases were named. # no test cases were named.
# This also effects some logic in the loop following this. # This also effects some logic in the loop following this.
...@@ -188,17 +174,17 @@ sub collect_test_cases ($$$) { ...@@ -188,17 +174,17 @@ sub collect_test_cases ($$$) {
my $opts= $tinfo->{'master_opt'} ? $tinfo->{'master_opt'} : []; my $opts= $tinfo->{'master_opt'} ? $tinfo->{'master_opt'} : [];
push(@criteria, join("!", sort @{$opts}) . "~"); push(@criteria, join("!", sort @{$opts}) . "~");
$sort_criteria{$tinfo->{name}} = join(" ", @criteria); $sort_criteria{$tinfo->fullname()} = join(" ", @criteria);
} }
@$cases = sort { @$cases = sort {
$sort_criteria{$a->{'name'}} . $a->{'name'} cmp $sort_criteria{$a->fullname()} . $a->fullname() cmp
$sort_criteria{$b->{'name'}} . $b->{'name'}; } @$cases; $sort_criteria{$b->fullname()} . $b->fullname() } @$cases;
# For debugging the sort-order # For debugging the sort-order
# foreach my $tinfo (@$cases) # foreach my $tinfo (@$cases)
# { # {
# print("$sort_criteria{$tinfo->{'name'}} -> \t$tinfo->{'name'}\n"); # print $sort_criteria{$tinfo->fullname()}," -> \t",$tinfo->fullname(),"\n";
# } # }
} }
...@@ -310,6 +296,17 @@ sub collect_one_suite ...@@ -310,6 +296,17 @@ sub collect_one_suite
mtr_verbose("testdir: $testdir"); mtr_verbose("testdir: $testdir");
mtr_verbose("resdir: $resdir"); mtr_verbose("resdir: $resdir");
#
# Load the Suite object
#
unless ($::suites{$suite}) {
if (-f "$suitedir/suite.pm") {
$::suites{$suite} = do "$suitedir/suite.pm";
} else {
$::suites{$suite} = $default_suite_object;
}
}
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Build a hash of disabled testcases for this suite # Build a hash of disabled testcases for this suite
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
...@@ -438,14 +435,16 @@ sub collect_one_suite ...@@ -438,14 +435,16 @@ sub collect_one_suite
{ {
# Read combinations file in my.cnf format # Read combinations file in my.cnf format
mtr_verbose("Read combinations file"); mtr_verbose("Read combinations file");
my %env_filter = map { $_ => 1 } split /:/, $ENV{"\U${suite}_COMBINATIONS"};
my $config= My::Config->new($combination_file); my $config= My::Config->new($combination_file);
foreach my $group ($config->groups()) { foreach my $group ($config->groups()) {
my $comb= {}; my $comb= {};
$comb->{name}= $group->name(); $comb->{name}= $group->name();
next if %env_filter and not $env_filter{$comb->{name}};
foreach my $option ( $group->options() ) { foreach my $option ( $group->options() ) {
push(@{$comb->{comb_opt}}, $option->option()); push(@{$comb->{comb_opt}}, $option->option());
} }
push(@combinations, $comb); push(@combinations, $comb) if $comb->{comb_opt};
} }
} }
...@@ -539,28 +538,7 @@ sub optimize_cases { ...@@ -539,28 +538,7 @@ sub optimize_cases {
# support it # support it
# ======================================================= # =======================================================
#print "binlog_format: $binlog_format\n"; #print "binlog_format: $binlog_format\n";
if (defined $binlog_format ) if (not defined $binlog_format )
{
# =======================================================
# Fixed --binlog-format=x specified on command line
# =======================================================
if ( defined $tinfo->{'binlog_formats'} )
{
#print "binlog_formats: ". join(", ", @{$tinfo->{binlog_formats}})."\n";
# The test supports different binlog formats
# check if the selected one is ok
my $supported=
grep { $_ eq $binlog_format } @{$tinfo->{'binlog_formats'}};
if ( !$supported )
{
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}=
"Doesn't support --binlog-format='$binlog_format'";
}
}
}
else
{ {
# ======================================================= # =======================================================
# Use dynamic switching of binlog format # Use dynamic switching of binlog format
...@@ -623,10 +601,6 @@ sub optimize_cases { ...@@ -623,10 +601,6 @@ sub optimize_cases {
$tinfo->{'ndb_test'}= 1 $tinfo->{'ndb_test'}= 1
if ( $default_engine =~ /^ndb/i ); if ( $default_engine =~ /^ndb/i );
$tinfo->{'innodb_test'}= 1
if ( $default_engine =~ /^innodb/i );
$tinfo->{'pbxt_test'}= 1
if ( $default_engine =~ /^pbxt/i );
} }
} }
...@@ -758,7 +732,7 @@ sub collect_one_test_case { ...@@ -758,7 +732,7 @@ sub collect_one_test_case {
name => "$suitename.$tname", name => "$suitename.$tname",
shortname => $tname, shortname => $tname,
path => "$testdir/$filename", path => "$testdir/$filename",
suite => $suitename,
); );
my $result_file= "$resdir/$tname.result"; my $result_file= "$resdir/$tname.result";
...@@ -880,7 +854,7 @@ sub collect_one_test_case { ...@@ -880,7 +854,7 @@ sub collect_one_test_case {
if ( -f "$testdir/$tname.slave-mi"); if ( -f "$testdir/$tname.slave-mi");
tags_from_test_file($tinfo,"$testdir/${tname}.test"); my @source_files = tags_from_test_file($tinfo,"$testdir/${tname}.test");
# Get default storage engine from suite.opt file # Get default storage engine from suite.opt file
...@@ -897,12 +871,6 @@ sub collect_one_test_case { ...@@ -897,12 +871,6 @@ sub collect_one_test_case {
$tinfo->{'ndb_test'}= 1 $tinfo->{'ndb_test'}= 1
if ( $local_default_storage_engine =~ /^ndb/i ); if ( $local_default_storage_engine =~ /^ndb/i );
$tinfo->{'innodb_test'}= 1
if ( $local_default_storage_engine =~ /^innodb/i );
$tinfo->{'pbxt_test'}= 1
if ( $local_default_storage_engine =~ /^pbxt/i );
} }
if ( $tinfo->{'big_test'} and ! $::opt_big_test ) if ( $tinfo->{'big_test'} and ! $::opt_big_test )
...@@ -949,72 +917,6 @@ sub collect_one_test_case { ...@@ -949,72 +917,6 @@ sub collect_one_test_case {
} }
} }
if ($tinfo->{'federated_test'})
{
# This is a test that needs federated, enable it
push(@{$tinfo->{'master_opt'}}, "--loose-federated");
push(@{$tinfo->{'slave_opt'}}, "--loose-federated");
}
if ( $tinfo->{'innodb_test'} )
{
# This is a test that needs innodb
if ( $::mysqld_variables{'innodb'} eq "OFF" ||
! exists $::mysqld_variables{'innodb'} )
{
# innodb is not supported, skip it
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "No innodb support";
return $tinfo;
}
}
elsif ( $tinfo->{'innodb_plugin_test'} )
{
# This is a test that needs the innodb plugin
if (&find_innodb_plugin)
{
my $sep= (IS_WINDOWS) ? ';' : ':';
my $plugin_filename= basename($lib_innodb_plugin);
my $plugin_list=
"innodb=$plugin_filename$sep" .
"innodb_trx=$plugin_filename$sep" .
"innodb_locks=$plugin_filename$sep" .
"innodb_lock_waits=$plugin_filename$sep" .
"innodb_cmp=$plugin_filename$sep" .
"innodb_cmp_reset=$plugin_filename$sep" .
"innodb_cmpmem=$plugin_filename$sep" .
"innodb_cmpmem_reset=$plugin_filename";
foreach my $k ('master_opt', 'slave_opt') {
push(@{$tinfo->{$k}}, '--ignore-builtin-innodb');
push(@{$tinfo->{$k}}, '--plugin-dir=' . dirname($lib_innodb_plugin));
push(@{$tinfo->{$k}}, "--plugin-load=$plugin_list");
}
}
}
else
{
push(@{$tinfo->{'master_opt'}}, "--loose-skip-innodb");
push(@{$tinfo->{'slave_opt'}}, "--loose-skip-innodb");
}
if ( $tinfo->{'need_binlog'} )
{
if (grep(/^--skip-log-bin/, @::opt_extra_mysqld_opt) )
{
$tinfo->{'skip'}= 1;
$tinfo->{'comment'}= "Test needs binlog";
return $tinfo;
}
}
else
{
# Test does not need binlog, add --skip-binlog to
# the options used when starting
push(@{$tinfo->{'master_opt'}}, "--loose-skip-log-bin");
push(@{$tinfo->{'slave_opt'}}, "--loose-skip-log-bin");
}
if ( $tinfo->{'rpl_test'} ) if ( $tinfo->{'rpl_test'} )
{ {
if ( $skip_rpl ) if ( $skip_rpl )
...@@ -1085,28 +987,6 @@ sub collect_one_test_case { ...@@ -1085,28 +987,6 @@ sub collect_one_test_case {
$tinfo->{template_path}= $config; $tinfo->{template_path}= $config;
} }
if ( $tinfo->{'pbxt_test'} )
{
# This is a test that needs pbxt
if ( $::mysqld_variables{'pbxt'} eq "OFF" ||
! exists $::mysqld_variables{'pbxt'} )
{
# Engine is not supported, skip it
$tinfo->{'skip'}= 1;
return $tinfo;
}
}
else
{
# Only disable engine if it's on by default (to avoid warnings about
# not existing loose options
if ( $::mysqld_variables{'pbxt'} eq "ON")
{
push(@{$tinfo->{'master_opt'}}, "--loose-skip-pbxt");
push(@{$tinfo->{'slave_opt'}}, "--loose-skip-pbxt");
}
}
if ( $tinfo->{'example_plugin_test'} ) if ( $tinfo->{'example_plugin_test'} )
{ {
if ( !$ENV{'HA_EXAMPLE_SO'} ) if ( !$ENV{'HA_EXAMPLE_SO'} )
...@@ -1117,27 +997,27 @@ sub collect_one_test_case { ...@@ -1117,27 +997,27 @@ sub collect_one_test_case {
} }
} }
if (not ref $::suites{$tinfo->{suite}})
# Set extra config file to use {
if (defined $defaults_extra_file) { $tinfo->{'skip'}= 1;
$tinfo->{extra_template_path}= $defaults_extra_file; $tinfo->{'comment'}= $::suites{$tinfo->{suite}};
return $tinfo;
} }
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Append mysqld extra options to both master and slave # Append mysqld extra options to master and slave, as appropriate
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
for (@source_files) {
s/\.\w+$//;
process_opts_file($tinfo, "$_.opt", 'master_opt');
process_opts_file($tinfo, "$_.opt", 'slave_opt');
process_opts_file($tinfo, "$_-master.opt", 'master_opt');
process_opts_file($tinfo, "$_-slave.opt", '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);
# ----------------------------------------------------------------------
# Add master opts, extra options only for master
# ----------------------------------------------------------------------
process_opts_file($tinfo, "$testdir/$tname-master.opt", 'master_opt');
# ----------------------------------------------------------------------
# Add slave opts, list of extra option only for slave
# ----------------------------------------------------------------------
process_opts_file($tinfo, "$testdir/$tname-slave.opt", 'slave_opt');
return $tinfo; return $tinfo;
} }
...@@ -1147,24 +1027,6 @@ sub collect_one_test_case { ...@@ -1147,24 +1027,6 @@ sub collect_one_test_case {
# the specified value in "tinfo" # the specified value in "tinfo"
my @tags= my @tags=
( (
["include/have_binlog_format_row.inc", "binlog_formats", ["row"]],
["include/have_binlog_format_statement.inc", "binlog_formats", ["statement"]],
["include/have_binlog_format_mixed.inc", "binlog_formats", ["mixed"]],
["include/have_binlog_format_mixed_or_row.inc",
"binlog_formats", ["mixed", "row"]],
["include/have_binlog_format_mixed_or_statement.inc",
"binlog_formats", ["mixed", "statement"]],
["include/have_binlog_format_row_or_statement.inc",
"binlog_formats", ["row", "statement"]],
["include/have_log_bin.inc", "need_binlog", 1],
["include/have_innodb.inc", "innodb_test", 1],
["include/have_innodb_plugin.inc", "innodb_plugin_test", 1],
["include/have_real.inc", "innodb_test", 1],
["include/have_real_innodb_plugin.inc", "innodb_plugin_test", 1],
["include/have_xtradb.inc", "innodb_test", 1],
["include/have_pbxt.inc", "pbxt_test", 1],
["include/big_test.inc", "big_test", 1], ["include/big_test.inc", "big_test", 1],
["include/have_debug.inc", "need_debug", 1], ["include/have_debug.inc", "need_debug", 1],
["include/have_ndb.inc", "ndb_test", 1], ["include/have_ndb.inc", "ndb_test", 1],
...@@ -1172,7 +1034,6 @@ my @tags= ...@@ -1172,7 +1034,6 @@ my @tags=
["include/master-slave.inc", "rpl_test", 1], ["include/master-slave.inc", "rpl_test", 1],
["include/ndb_master-slave.inc", "rpl_test", 1], ["include/ndb_master-slave.inc", "rpl_test", 1],
["include/ndb_master-slave.inc", "ndb_test", 1], ["include/ndb_master-slave.inc", "ndb_test", 1],
["federated.inc", "federated_test", 1],
["include/not_embedded.inc", "not_embedded", 1], ["include/not_embedded.inc", "not_embedded", 1],
["include/not_valgrind.inc", "not_valgrind", 1], ["include/not_valgrind.inc", "not_valgrind", 1],
["include/have_example_plugin.inc", "example_plugin_test", 1], ["include/have_example_plugin.inc", "example_plugin_test", 1],
...@@ -1185,6 +1046,7 @@ sub tags_from_test_file { ...@@ -1185,6 +1046,7 @@ sub tags_from_test_file {
my $file= shift; my $file= shift;
#mtr_verbose("$file"); #mtr_verbose("$file");
my $F= IO::File->new($file) or mtr_error("can't open file \"$file\": $!"); my $F= IO::File->new($file) or mtr_error("can't open file \"$file\": $!");
my @all_files=($file);
while ( my $line= <$F> ) while ( my $line= <$F> )
{ {
...@@ -1220,13 +1082,13 @@ sub tags_from_test_file { ...@@ -1220,13 +1082,13 @@ sub tags_from_test_file {
# Only source the file if it exists, we may get # Only source the file if it exists, we may get
# false positives in the regexes above if someone # false positives in the regexes above if someone
# writes "source nnnn;" in a test case(such as mysqltest.test) # writes "source nnnn;" in a test case(such as mysqltest.test)
tags_from_test_file($tinfo, $sourced_file); unshift @all_files, tags_from_test_file($tinfo, $sourced_file);
last; last;
} }
} }
} }
} }
@all_files;
} }
sub unspace { sub unspace {
...@@ -1239,6 +1101,7 @@ sub unspace { ...@@ -1239,6 +1101,7 @@ sub unspace {
sub opts_from_file ($) { sub opts_from_file ($) {
my $file= shift; my $file= shift;
local $_;
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;
......
...@@ -61,14 +61,10 @@ sub _name { ...@@ -61,14 +61,10 @@ sub _name {
sub _mtr_report_test_name ($) { sub _mtr_report_test_name ($) {
my $tinfo= shift; my $tinfo= shift;
my $tname= $tinfo->{name}; my $tname= $tinfo->fullname();
return unless defined $verbose; return unless defined $verbose;
# Add combination name if any
$tname.= " '$tinfo->{combination}'"
if defined $tinfo->{combination};
print _name(). _timestamp(); print _name(). _timestamp();
printf "%-40s ", $tname; printf "%-40s ", $tname;
my $worker = $tinfo->{worker}; my $worker = $tinfo->{worker};
......
...@@ -130,7 +130,7 @@ my $path_config_file; # The generated config file, var/my.cnf ...@@ -130,7 +130,7 @@ my $path_config_file; # The generated config file, var/my.cnf
# executables will be used by the test suite. # executables will be used by the test suite.
our $opt_vs_config = $ENV{'MTR_VS_CONFIG'}; our $opt_vs_config = $ENV{'MTR_VS_CONFIG'};
my $DEFAULT_SUITES= "main,binlog,federated,rpl,maria,parts,innodb,innodb_plugin,percona"; my $DEFAULT_SUITES= "main,binlog,federated,rpl,maria,parts,innodb,innodb_plugin,percona,ndb";
my $opt_suites; my $opt_suites;
our $opt_verbose= 0; # Verbose output, enable with --verbose our $opt_verbose= 0; # Verbose output, enable with --verbose
...@@ -257,6 +257,8 @@ our $debug_compiled_binaries; ...@@ -257,6 +257,8 @@ our $debug_compiled_binaries;
our %mysqld_variables; our %mysqld_variables;
our %suites;
my $source_dist= 0; my $source_dist= 0;
my $opt_max_save_core= env_or_val(MTR_MAX_SAVE_CORE => 5); my $opt_max_save_core= env_or_val(MTR_MAX_SAVE_CORE => 5);
...@@ -711,6 +713,8 @@ sub run_test_server ($$$) { ...@@ -711,6 +713,8 @@ sub run_test_server ($$$) {
$next= splice(@$tests, $second_best, 1); $next= splice(@$tests, $second_best, 1);
} }
xterm_stat(scalar(@$tests));
if ($next) { if ($next) {
#$next->print_test(); #$next->print_test();
$next->write_test($sock, 'TESTCASE'); $next->write_test($sock, 'TESTCASE');
...@@ -807,7 +811,7 @@ sub run_worker ($) { ...@@ -807,7 +811,7 @@ sub run_worker ($) {
# We need to gracefully shut down the servers to see any # We need to gracefully shut down the servers to see any
# Valgrind memory leak errors etc. since last server restart. # Valgrind memory leak errors etc. since last server restart.
if ($opt_warnings) { if ($opt_warnings) {
stop_servers(all_servers()); stop_servers(reverse all_servers());
if(check_warnings_post_shutdown($server)) { if(check_warnings_post_shutdown($server)) {
# Warnings appeared in log file(s) during final server shutdown. # Warnings appeared in log file(s) during final server shutdown.
exit(1); exit(1);
...@@ -1595,7 +1599,7 @@ sub collect_mysqld_features { ...@@ -1595,7 +1599,7 @@ sub collect_mysqld_features {
my $cmd= join(" ", $exe_mysqld, @$args); my $cmd= join(" ", $exe_mysqld, @$args);
my $list= `$cmd`; my $list= `$cmd`;
print "cmd: $cmd\n"; mtr_verbose("cmd: $cmd");
foreach my $line (split('\n', $list)) foreach my $line (split('\n', $list))
{ {
...@@ -2493,7 +2497,7 @@ sub check_ndbcluster_support ($) { ...@@ -2493,7 +2497,7 @@ sub check_ndbcluster_support ($) {
} }
sub ndbcluster_wait_started($$){ sub ndbcluster_wait_started {
my $cluster= shift; my $cluster= shift;
my $ndb_waiter_extra_opt= shift; my $ndb_waiter_extra_opt= shift;
my $path_waitlog= join('/', $opt_vardir, $cluster->name(), "ndb_waiter.log"); my $path_waitlog= join('/', $opt_vardir, $cluster->name(), "ndb_waiter.log");
...@@ -2661,7 +2665,7 @@ sub ndbd_start { ...@@ -2661,7 +2665,7 @@ sub ndbd_start {
sub ndbcluster_start ($) { sub ndbcluster_start ($) {
my $cluster= shift; my ($cluster) = @_;
mtr_verbose("ndbcluster_start '".$cluster->name()."'"); mtr_verbose("ndbcluster_start '".$cluster->name()."'");
...@@ -2681,6 +2685,109 @@ sub ndbcluster_start ($) { ...@@ -2681,6 +2685,109 @@ sub ndbcluster_start ($) {
} }
sub mysql_server_start($) {
my ($mysqld, $tinfo) = @_;
if ( $mysqld->{proc} )
{
# Already started
# Write start of testcase to log file
mark_log($mysqld->value('#log-error'), $tinfo);
return;
}
my $datadir= $mysqld->value('datadir');
if (not $opt_start_dirty)
{
my @options= ('log-bin', 'relay-log');
foreach my $option_name ( @options ) {
next unless $mysqld->option($option_name);
my $file_name= $mysqld->value($option_name);
next unless
defined $file_name and
-e $file_name;
mtr_debug(" -removing '$file_name'");
unlink($file_name) or die ("unable to remove file '$file_name'");
}
if (-d $datadir ) {
preserve_error_log($mysqld);
mtr_verbose(" - removing '$datadir'");
rmtree($datadir);
}
}
my $mysqld_basedir= $mysqld->value('basedir');
if ( $basedir eq $mysqld_basedir )
{
if (! $opt_start_dirty) # If dirty, keep possibly grown system db
{
# Copy datadir from installed system db
for my $path ( "$opt_vardir", "$opt_vardir/..") {
my $install_db= "$path/install.db";
copytree($install_db, $datadir)
if -d $install_db;
}
mtr_error("Failed to copy system db to '$datadir'")
unless -d $datadir;
}
}
else
{
mysql_install_db($mysqld); # For versional testing
mtr_error("Failed to install system db to '$datadir'")
unless -d $datadir;
}
restore_error_log($mysqld);
# Create the servers tmpdir
my $tmpdir= $mysqld->value('tmpdir');
mkpath($tmpdir) unless -d $tmpdir;
# Write start of testcase to log file
mark_log($mysqld->value('#log-error'), $tinfo);
# Run <tname>-master.sh
if ($mysqld->option('#!run-master-sh') and
run_sh_script($tinfo->{master_sh}) )
{
$tinfo->{'comment'}= "Failed to execute '$tinfo->{master_sh}'";
return 1;
}
# Run <tname>-slave.sh
if ($mysqld->option('#!run-slave-sh') and
run_sh_script($tinfo->{slave_sh}))
{
$tinfo->{'comment'}= "Failed to execute '$tinfo->{slave_sh}'";
return 1;
}
if (!$opt_embedded_server)
{
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;
}
}
sub mysql_server_wait {
my ($mysqld) = @_;
return not sleep_until_file_created($mysqld->value('pid-file'),
$opt_start_timeout,
$mysqld->{'proc'});
}
sub create_config_file_for_extern { sub create_config_file_for_extern {
my %opts= my %opts=
( (
...@@ -3455,9 +3562,82 @@ sub restart_forced_by_test ...@@ -3455,9 +3562,82 @@ sub restart_forced_by_test
# Return timezone value of tinfo or default value # Return timezone value of tinfo or default value
sub timezone { sub timezone {
my ($tinfo)= @_; my ($tinfo)= @_;
return $tinfo->{timezone} || "DEFAULT"; local $_ = $tinfo->{timezone};
return 'DEFAULT' unless defined $_;
s/\$\{(\w+)\}/envsubst($1)/ge;
s/\$(\w+)/envsubst($1)/ge;
$_;
}
sub mycnf_create {
my ($config) = @_;
my $res;
foreach my $group ($config->groups()) {
$res .= "[$group->{name}]\n";
foreach my $option ($group->options()) {
$res .= $option->name();
my $value= $option->value();
if (defined $value) {
$res .= "=$value";
}
$res .= "\n";
}
$res .= "\n";
}
$res;
}
sub config_files($) {
my ($tinfo) = @_;
(
'my.cnf' => \&mycnf_create,
$suites{$tinfo->{suite}}->config_files()
);
}
sub _like { return $config ? $config->like($_[0]) : (); }
sub mysqlds { return _like('mysqld\.'); }
sub ndbds { return _like('cluster_config\.ndbd\.');}
sub ndb_mgmds { return _like('cluster_config\.ndb_mgmd\.'); }
sub fix_servers($) {
my ($tinfo) = @_;
return () unless $config;
my %servers = (
qr/mysqld\./ => {
SORT => 300,
START => \&mysql_server_start,
WAIT => \&mysql_server_wait,
},
qr/mysql_cluster\./ => {
SORT => 200,
START => \&ndbcluster_start,
WAIT => \&ndbcluster_wait_started,
},
qr/cluster_config\.ndb_mgmd\./ => {
SORT => 210,
START => undef,
},
qr/cluster_config\.ndbd\./ => {
SORT => 220,
START => undef,
},
$suites{$tinfo->{suite}}->servers()
);
for ($config->groups()) {
while (my ($re,$prop) = each %servers) {
@$_{keys %$prop} = values %$prop if $_->{name} =~ /^$re/;
}
}
} }
sub all_servers {
return unless $config;
( sort { $a->{SORT} <=> $b->{SORT} }
grep { defined $_->{SORT} } $config->groups() );
}
# Storage for changed environment variables # Storage for changed environment variables
my %old_env; my %old_env;
...@@ -3500,7 +3680,7 @@ sub run_testcase ($$) { ...@@ -3500,7 +3680,7 @@ sub run_testcase ($$) {
if ( @restart != 0) { if ( @restart != 0) {
# Remember that we restarted for this test case (count restarts) # Remember that we restarted for this test case (count restarts)
$tinfo->{'restarted'}= 1; $tinfo->{'restarted'}= 1;
stop_servers(@restart ); stop_servers(reverse @restart);
if ($opt_warnings) { if ($opt_warnings) {
check_warnings_post_shutdown($server_socket); check_warnings_post_shutdown($server_socket);
} }
...@@ -3536,7 +3716,6 @@ sub run_testcase ($$) { ...@@ -3536,7 +3716,6 @@ sub run_testcase ($$) {
vardir => $opt_vardir, vardir => $opt_vardir,
tmpdir => $opt_tmpdir, tmpdir => $opt_tmpdir,
baseport => $baseport, baseport => $baseport,
#hosts => [ 'host1', 'host2' ],
user => $opt_user, user => $opt_user,
password => '', password => '',
ssl => $opt_ssl_supported, ssl => $opt_ssl_supported,
...@@ -3544,8 +3723,16 @@ sub run_testcase ($$) { ...@@ -3544,8 +3723,16 @@ sub run_testcase ($$) {
} }
); );
# Write the new my.cnf fix_servers($tinfo);
$config->save($path_config_file);
# Write config files:
my %config_files = config_files($tinfo);
while (my ($file, $generate) = each %config_files) {
my ($path) = "$opt_vardir/$file";
open (F, '>', $path) or die "Could not open '$path': $!";
print F &$generate($config);
close F;
}
# Remember current config so a restart can occur when a test need # Remember current config so a restart can occur when a test need
# to use a different one # to use a different one
...@@ -3688,7 +3875,7 @@ sub run_testcase ($$) { ...@@ -3688,7 +3875,7 @@ sub run_testcase ($$) {
if ($opt_warnings) { if ($opt_warnings) {
# Checking error logs for warnings, so need to stop server # Checking error logs for warnings, so need to stop server
# gracefully so that memory leaks etc. can be properly detected. # gracefully so that memory leaks etc. can be properly detected.
stop_servers(all_servers()); stop_servers(reverse all_servers());
check_warnings_post_shutdown($server_socket); check_warnings_post_shutdown($server_socket);
# Even if we got warnings here, we should not fail this # Even if we got warnings here, we should not fail this
# particular test, as the warnings may be caused by an earlier # particular test, as the warnings may be caused by an earlier
...@@ -3846,7 +4033,8 @@ sub run_testcase ($$) { ...@@ -3846,7 +4033,8 @@ sub run_testcase ($$) {
# valuable debugging information even if there is no test failure recorded. # valuable debugging information even if there is no test failure recorded.
sub _preserve_error_log_names { sub _preserve_error_log_names {
my ($mysqld)= @_; my ($mysqld)= @_;
my $error_log_file= $mysqld->value('#log-error'); my $error_log_file= $mysqld->if_exist('#log-error');
return unless $error_log_file and -r $error_log_file;
my $error_log_dir= dirname($error_log_file); my $error_log_dir= dirname($error_log_file);
my $save_name= $error_log_dir ."/../". $mysqld->name() .".error.log"; my $save_name= $error_log_dir ."/../". $mysqld->name() .".error.log";
return ($error_log_file, $save_name); return ($error_log_file, $save_name);
...@@ -3855,14 +4043,14 @@ sub _preserve_error_log_names { ...@@ -3855,14 +4043,14 @@ sub _preserve_error_log_names {
sub preserve_error_log { sub preserve_error_log {
my ($mysqld)= @_; my ($mysqld)= @_;
my ($error_log_file, $save_name)= _preserve_error_log_names($mysqld); my ($error_log_file, $save_name)= _preserve_error_log_names($mysqld);
my $res= rename($error_log_file, $save_name); rename($error_log_file, $save_name) if $save_name;
# Ignore any errors, as it's just a best-effort to keep the log if possible. # Ignore any errors, as it's just a best-effort to keep the log if possible.
} }
sub restore_error_log { sub restore_error_log {
my ($mysqld)= @_; my ($mysqld)= @_;
my ($error_log_file, $save_name)= _preserve_error_log_names($mysqld); my ($error_log_file, $save_name)= _preserve_error_log_names($mysqld);
my $res= rename($save_name, $error_log_file); rename($save_name, $error_log_file) if $save_name;
} }
# Keep track of last position in mysqld error log where we scanned for # Keep track of last position in mysqld error log where we scanned for
...@@ -3907,6 +4095,8 @@ sub pre_write_errorlog { ...@@ -3907,6 +4095,8 @@ sub pre_write_errorlog {
sub extract_server_log ($$) { sub extract_server_log ($$) {
my ($error_log, $tname) = @_; my ($error_log, $tname) = @_;
return unless $error_log;
# Open the servers .err log file and read all lines # Open the servers .err log file and read all lines
# belonging to current test into @lines # belonging to current test into @lines
my $Ferr = IO::File->new($error_log) my $Ferr = IO::File->new($error_log)
...@@ -3948,9 +4138,9 @@ sub get_log_from_proc ($$) { ...@@ -3948,9 +4138,9 @@ sub get_log_from_proc ($$) {
my ($proc, $name)= @_; my ($proc, $name)= @_;
my $srv_log= ""; my $srv_log= "";
foreach my $mysqld (mysqlds()) { foreach my $mysqld (all_servers()) {
if ($mysqld->{proc} eq $proc) { if ($mysqld->{proc} eq $proc) {
my @srv_lines= extract_server_log($mysqld->value('#log-error'), $name); my @srv_lines= extract_server_log($mysqld->if_exist('#log-error'), $name);
$srv_log= "\nServer log from this test:\n" . join ("", @srv_lines); $srv_log= "\nServer log from this test:\n" . join ("", @srv_lines);
last; last;
} }
...@@ -4029,16 +4219,18 @@ sub extract_warning_lines ($) { ...@@ -4029,16 +4219,18 @@ sub extract_warning_lines ($) {
my @antipatterns = my @antipatterns =
( (
qr/error .*connecting to master/, qr/error .*connecting to master/,
qr/Plugin 'ndbcluster' will be forced to shutdown/,
qr/InnoDB: Error: in ALTER TABLE `test`.`t[12]`/, qr/InnoDB: Error: in ALTER TABLE `test`.`t[12]`/,
qr/InnoDB: Error: table `test`.`t[12]` does not exist in the InnoDB internal/, qr/InnoDB: Error: table `test`.`t[12]` does not exist in the InnoDB internal/,
qr/Slave: Unknown table 't1' Error_code: 1051/, qr/Slave: Unknown table 't1' Error_code: 1051/,
qr/Slave SQL:.*(Error_code: [[:digit:]]+|Query:.*)/, qr/Slave SQL:.*(Error_code: [[:digit:]]+|Query:.*)/,
qr/slave SQL thread aborted/, qr/slave SQL thread aborted/,
qr/unknown option '--loose-/, qr/unknown option '--loose[-_]/,
qr/unknown variable 'loose-/, qr/unknown variable 'loose[-_]/,
qr/Now setting lower_case_table_names to [02]/, qr/Now setting lower_case_table_names to [02]/,
qr/Setting lower_case_table_names=2/, qr/Setting lower_case_table_names=2/,
qr/You have forced lower_case_table_names to 0/, qr/You have forced lower_case_table_names to 0/,
qr/Plugin 'ndbcluster' will be forced to shutdow/,
qr/deprecated/, qr/deprecated/,
qr/Slave SQL thread retried transaction/, qr/Slave SQL thread retried transaction/,
qr/Slave \(additional info\)/, qr/Slave \(additional info\)/,
...@@ -4347,29 +4539,18 @@ sub clean_dir { ...@@ -4347,29 +4539,18 @@ sub clean_dir {
sub clean_datadir { sub clean_datadir {
mtr_verbose("Cleaning datadirs..."); mtr_verbose("Cleaning datadirs...");
if (started(all_servers()) != 0){ if (started(all_servers()) != 0){
mtr_error("Trying to clean datadir before all servers stopped"); mtr_error("Trying to clean datadir before all servers stopped");
} }
foreach my $cluster ( clusters() ) for (all_servers())
{ {
my $cluster_dir= "$opt_vardir/".$cluster->{name}; preserve_error_log($_); # or at least, try to
mtr_verbose(" - removing '$cluster_dir'"); my $dir= "$opt_vardir/".$_->{name};
rmtree($cluster_dir); mtr_verbose(" - removing '$dir'");
rmtree($dir);
}
foreach my $mysqld ( mysqlds() )
{
my $mysqld_dir= dirname($mysqld->value('datadir'));
preserve_error_log($mysqld);
if (-d $mysqld_dir ) {
mtr_verbose(" - removing '$mysqld_dir'");
rmtree($mysqld_dir);
}
} }
# Remove all files in tmp and var/tmp # Remove all files in tmp and var/tmp
...@@ -4392,17 +4573,6 @@ sub save_datadir_after_failure($$) { ...@@ -4392,17 +4573,6 @@ sub save_datadir_after_failure($$) {
} }
sub remove_ndbfs_from_ndbd_datadir {
my ($ndbd_datadir)= @_;
# Remove the ndb_*_fs directory from ndbd.X/ dir
foreach my $ndbfs_dir ( glob("$ndbd_datadir/ndb_*_fs") )
{
next unless -d $ndbfs_dir; # Skip if not a directory
rmtree($ndbfs_dir);
}
}
sub after_failure ($) { sub after_failure ($) {
my ($tinfo)= @_; my ($tinfo)= @_;
...@@ -4419,31 +4589,18 @@ sub after_failure ($) { ...@@ -4419,31 +4589,18 @@ sub after_failure ($) {
mkpath($save_dir) if ! -d $save_dir; mkpath($save_dir) if ! -d $save_dir;
# Save the used my.cnf file # Save the used config files
copy($path_config_file, $save_dir); my %config_files = config_files($tinfo);
while (my ($file, $generate) = each %config_files) {
copy("$opt_vardir/$file", $save_dir);
}
# Copy the tmp dir # Copy the tmp dir
copytree("$opt_vardir/tmp/", "$save_dir/tmp/"); copytree("$opt_vardir/tmp/", "$save_dir/tmp/");
if ( clusters() ) { foreach (all_servers()) {
foreach my $cluster ( clusters() ) { my $dir= "$opt_vardir/".$_->{name};
my $cluster_dir= "$opt_vardir/".$cluster->{name}; save_datadir_after_failure($dir, $save_dir);
# Remove the fileystem of each ndbd
foreach my $ndbd ( in_cluster($cluster, ndbds()) )
{
my $ndbd_datadir= $ndbd->value("DataDir");
remove_ndbfs_from_ndbd_datadir($ndbd_datadir);
}
save_datadir_after_failure($cluster_dir, $save_dir);
}
}
else {
foreach my $mysqld ( mysqlds() ) {
my $data_dir= $mysqld->value('datadir');
save_datadir_after_failure(dirname($data_dir), $save_dir);
}
} }
} }
...@@ -4581,8 +4738,8 @@ sub mysqld_arguments ($$$) { ...@@ -4581,8 +4738,8 @@ sub mysqld_arguments ($$$) {
mtr_add_arg($args, "%s--log-output=table,file"); mtr_add_arg($args, "%s--log-output=table,file");
} }
# Check if "extra_opt" contains skip-log-bin # Check if "extra_opt" contains --log-bin
my $skip_binlog= grep(/^(--|--loose-)skip-log-bin/, @$extra_opts); my $skip_binlog= not grep /^--(loose-)?log-bin/, @$extra_opts;
# Indicate to mysqld it will be debugged in debugger # Indicate to mysqld it will be debugged in debugger
if ( $glob_debugger ) if ( $glob_debugger )
...@@ -4838,8 +4995,7 @@ sub server_need_restart { ...@@ -4838,8 +4995,7 @@ sub server_need_restart {
return 1; return 1;
} }
my $is_mysqld= grep ($server eq $_, mysqlds()); if ($server->name() =~ /^mysqld\./)
if ($is_mysqld)
{ {
# Check that running process was started with same options # Check that running process was started with same options
...@@ -4891,17 +5047,9 @@ sub servers_need_restart($) { ...@@ -4891,17 +5047,9 @@ sub servers_need_restart($) {
# ############################################
# Return list of specific servers
# - there is no servers in an empty config
#
sub _like { return $config ? $config->like($_[0]) : (); }
sub mysqlds { return _like('mysqld.'); }
sub ndbds { return _like('cluster_config.ndbd.');}
sub ndb_mgmds { return _like('cluster_config.ndb_mgmd.'); }
sub clusters { return _like('mysql_cluster.'); }
sub all_servers { return ( mysqlds(), ndb_mgmds(), ndbds() ); }
############################################
# #
# Filter a list of servers and return only those that are part # Filter a list of servers and return only those that are part
...@@ -4955,28 +5103,10 @@ sub get_extra_opts { ...@@ -4955,28 +5103,10 @@ sub get_extra_opts {
sub stop_servers($$) { sub stop_servers($$) {
my (@servers)= @_; my (@servers)= @_;
if ( join('|', @servers) eq join('|', all_servers()) )
{
# All servers are going down, use some kind of order to
# avoid too many warnings in the log files
mtr_report("Restarting all servers");
# mysqld processes
My::SafeProcess::shutdown( $opt_shutdown_timeout, started(mysqlds()) );
# cluster processes
My::SafeProcess::shutdown( $opt_shutdown_timeout,
started(ndbds(), ndb_mgmds()) );
}
else
{
mtr_report("Restarting ", started(@servers)); mtr_report("Restarting ", started(@servers));
# Stop only some servers My::SafeProcess::shutdown($opt_shutdown_timeout,
My::SafeProcess::shutdown( $opt_shutdown_timeout, started(@servers));
started(@servers) );
}
foreach my $server (@servers) foreach my $server (@servers)
{ {
...@@ -5003,145 +5133,14 @@ sub stop_servers($$) { ...@@ -5003,145 +5133,14 @@ sub stop_servers($$) {
sub start_servers($) { sub start_servers($) {
my ($tinfo)= @_; my ($tinfo)= @_;
# Start clusters for (all_servers()) {
foreach my $cluster ( clusters() ) $_->{START}->($_, $tinfo) if $_->{START};
{
ndbcluster_start($cluster);
}
# Start mysqlds
foreach my $mysqld ( mysqlds() )
{
if ( $mysqld->{proc} )
{
# Already started
# Write start of testcase to log file
mark_log($mysqld->value('#log-error'), $tinfo);
next;
}
my $datadir= $mysqld->value('datadir');
if ($opt_start_dirty)
{
# Don't delete anything if starting dirty
;
}
else
{
my @options= ('log-bin', 'relay-log');
foreach my $option_name ( @options ) {
next unless $mysqld->option($option_name);
my $file_name= $mysqld->value($option_name);
next unless
defined $file_name and
-e $file_name;
mtr_debug(" -removing '$file_name'");
unlink($file_name) or die ("unable to remove file '$file_name'");
}
if (-d $datadir ) {
preserve_error_log($mysqld);
mtr_verbose(" - removing '$datadir'");
rmtree($datadir);
}
}
my $mysqld_basedir= $mysqld->value('basedir');
if ( $basedir eq $mysqld_basedir )
{
if (! $opt_start_dirty) # If dirty, keep possibly grown system db
{
# Copy datadir from installed system db
for my $path ( "$opt_vardir", "$opt_vardir/..") {
my $install_db= "$path/install.db";
copytree($install_db, $datadir)
if -d $install_db;
}
mtr_error("Failed to copy system db to '$datadir'")
unless -d $datadir;
}
}
else
{
mysql_install_db($mysqld); # For versional testing
mtr_error("Failed to install system db to '$datadir'")
unless -d $datadir;
}
restore_error_log($mysqld);
# Create the servers tmpdir
my $tmpdir= $mysqld->value('tmpdir');
mkpath($tmpdir) unless -d $tmpdir;
# Write start of testcase to log file
mark_log($mysqld->value('#log-error'), $tinfo);
# Run <tname>-master.sh
if ($mysqld->option('#!run-master-sh') and
run_sh_script($tinfo->{master_sh}) )
{
$tinfo->{'comment'}= "Failed to execute '$tinfo->{master_sh}'";
return 1;
}
# Run <tname>-slave.sh
if ($mysqld->option('#!run-slave-sh') and
run_sh_script($tinfo->{slave_sh}))
{
$tinfo->{'comment'}= "Failed to execute '$tinfo->{slave_sh}'";
return 1;
}
if (!$opt_embedded_server)
{
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;
}
}
# Wait for clusters to start
foreach my $cluster ( clusters() )
{
if (ndbcluster_wait_started($cluster, ""))
{
# failed to start
$tinfo->{'comment'}= "Start of '".$cluster->name()."' cluster failed";
return 1;
}
} }
# Wait for mysqlds to start for (all_servers()) {
foreach my $mysqld ( mysqlds() ) next unless $_->{WAIT} and started($_);
{ if ($_->{WAIT}->($_)) {
next if !started($mysqld); $tinfo->{comment}= "Failed to start ".$_->name();
if (sleep_until_file_created($mysqld->value('pid-file'),
$opt_start_timeout,
$mysqld->{'proc'}) == 0) {
$tinfo->{comment}=
"Failed to start ".$mysqld->name();
my $logfile= $mysqld->value('#log-error');
if ( defined $logfile and -f $logfile )
{
my @srv_lines= extract_server_log($logfile, $tinfo->{name});
$tinfo->{logfile}= "Server log is:\n" . join ("", @srv_lines);
}
else
{
$tinfo->{logfile}= "Could not open server logfile: '$logfile'";
}
return 1; return 1;
} }
} }
...@@ -5403,13 +5402,7 @@ sub gdb_arguments { ...@@ -5403,13 +5402,7 @@ sub gdb_arguments {
else else
{ {
# write init file for mysqld # write init file for mysqld
mtr_tofile($gdb_init_file, mtr_tofile($gdb_init_file, "set args $str\n");
"set args $str\n" .
"break mysql_parse\n" .
"commands 1\n" .
"disable 1\n" .
"end\n" .
"run");
} }
if ( $opt_manual_gdb ) if ( $opt_manual_gdb )
...@@ -5467,13 +5460,7 @@ sub ddd_arguments { ...@@ -5467,13 +5460,7 @@ sub ddd_arguments {
else else
{ {
# write init file for mysqld # write init file for mysqld
mtr_tofile($gdb_init_file, mtr_tofile($gdb_init_file, "file $$exe\nset args $str\n");
"file $$exe\n" .
"set args $str\n" .
"break mysql_parse\n" .
"commands 1\n" .
"disable 1\n" .
"end");
} }
if ( $opt_manual_ddd ) if ( $opt_manual_ddd )
...@@ -5855,3 +5842,25 @@ sub list_options ($) { ...@@ -5855,3 +5842,25 @@ sub list_options ($) {
exit(1); exit(1);
} }
sub time_format($) {
sprintf '%d:%02d:%02d', $_[0]/3600, ($_[0]/60)%60, $_[0]%60;
}
my $num_tests;
sub xterm_stat {
if (-t STDOUT and $ENV{TERM} =~ /xterm/) {
my ($left) = @_;
# 2.5 -> best by test
$num_tests = $left + 2.5 unless $num_tests;
my $done = $num_tests - $left;
my $spent = time - $^T;
printf "\e];mtr: spent %s on %d tests. %s (%d tests) left\a",
time_format($spent), $done,
time_format($spent/$done * $left), $left;
}
}
drop database if exists events_test;
drop database if exists events_test2;
drop table if exists t1;
CREATE TABLE t1 (
Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL,
Varor_period smallint(4) unsigned DEFAULT '0' NOT NULL
) ENGINE=example;
drop table t1;
create table t1 (id int) engine=NDB; create table t1 (id int) engine=InnoDB;
Warnings: Warnings:
Warning 1286 Unknown table engine 'NDB' Warning 1286 Unknown table engine 'InnoDB'
Warning 1266 Using storage engine MyISAM for table 't1' Warning 1266 Using storage engine MyISAM for table 't1'
alter table t1 engine=NDB; alter table t1 engine=InnoDB;
Warnings: Warnings:
Warning 1286 Unknown table engine 'NDB' Warning 1286 Unknown table engine 'InnoDB'
drop table t1; drop table t1;
SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='ndbcluster'; SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='InnoDB';
ENGINE SUPPORT ENGINE SUPPORT
ndbcluster NO InnoDB NO
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='InnoDB';
PLUGIN_NAME='ndbcluster';
PLUGIN_NAME PLUGIN_STATUS PLUGIN_NAME PLUGIN_STATUS
ndbcluster DISABLED InnoDB DISABLED
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
# BINLOG statement does not work in embedded mode. # BINLOG statement does not work in embedded mode.
source include/have_log_bin.inc;
source include/not_embedded.inc; source include/not_embedded.inc;
disable_warnings; disable_warnings;
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
# Related bugs: BUG#27779, BUG#31581, BUG#31582, BUG#31583, BUG#32407 # Related bugs: BUG#27779, BUG#31581, BUG#31582, BUG#31583, BUG#32407
source include/have_log_bin.inc;
source include/not_embedded.inc; source include/not_embedded.inc;
--disable_warnings --disable_warnings
......
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
...@@ -3,9 +3,10 @@ ...@@ -3,9 +3,10 @@
[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
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
--source include/not_embedded.inc --source include/not_embedded.inc
# This test depends on having the PBXT information_schema stuff. # This test depends on having the PBXT information_schema stuff.
--source include/have_pbxt.inc --source include/have_pbxt.inc
--source include/have_innodb.inc
--source include/have_xtradb.inc --source include/have_xtradb.inc
let $my_where = WHERE table_schema = 'information_schema' let $my_where = WHERE table_schema = 'information_schema'
......
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1 --binlog_cache_size=32768 --loose-innodb_lock_wait_timeout=1
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
--innodb-autoinc-lock-mode=0 --loose-innodb-autoinc-lock-mode=0
--innodb --innodb_autoinc_lock_mode=0 --loose-innodb --loose-innodb_autoinc_lock_mode=0
--innodb-file-per-table=1 --loose-innodb-file-per-table=1
--innodb_lock_wait_timeout=1 --loose-innodb_lock_wait_timeout=1
--log-bin --innodb-locks-unsafe-for-binlog --binlog-format=mixed --loose-innodb-locks-unsafe-for-binlog --binlog-format=mixed
-- source include/have_innodb.inc -- source include/have_innodb.inc
-- source include/have_log_bin.inc
create table bug53674(a int)engine=innodb; create table bug53674(a int)engine=innodb;
insert into bug53674 values (1),(2); insert into bug53674 values (1),(2);
......
--innodb_lock_wait_timeout=1 --loose-innodb_lock_wait_timeout=1
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1 --binlog_cache_size=32768 --loose-innodb_lock_wait_timeout=1
--innodb-lock-wait-timeout=2 --loose-innodb-lock-wait-timeout=2
--innodb_lock_wait_timeout=1 --innodb_rollback_on_timeout=1 --loose-innodb_lock_wait_timeout=1 --loose-innodb_rollback_on_timeout=1
--innodb_lock_wait_timeout=2 --innodb_rollback_on_timeout --loose-innodb_lock_wait_timeout=2 --loose-innodb_rollback_on_timeout
[innodb_plugin]
ignore-builtin-innodb
plugin-load=$HA_INNODB_PLUGIN_SO
innodb
[xtradb_plugin]
ignore-builtin-innodb
plugin-load=$HA_XTRADB_SO
innodb
[xtradb]
innodb
package My::Suite::InnoDB_plugin;
@ISA = qw(My::Suite);
############# initialization ######################
my @combinations;
push @combinations, 'innodb_plugin' if $ENV{HA_INNODB_PLUGIN_SO};
push @combinations, 'xtradb_plugin' if $ENV{HA_XTRADB_SO};
push @combinations, 'xtradb' if $::mysqld_variables{'innodb'} eq "ON";
return "Neither innodb_plugin nor xtradb are available" unless @combinations;
$ENV{INNODB_PLUGIN_COMBINATIONS}=join ':', @combinations
unless $ENV{INNODB_PLUGIN_COMBINATIONS};
############# return an object ######################
bless { };
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1 --binlog_cache_size=32768 --loose-innodb_lock_wait_timeout=1
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
--innodb-use-sys-malloc=true --loose-innodb-use-sys-malloc=true
--innodb-autoinc-lock-mode=0 --loose-innodb-autoinc-lock-mode=0
--innodb --innodb_autoinc_lock_mode=0 --loose-innodb_autoinc_lock_mode=0
--innodb-file-per-table=1 --loose-innodb-file-per-table=1
--innodb_commit_concurrency=1 --loose-innodb_commit_concurrency=1
--log-bin --innodb-locks-unsafe-for-binlog --binlog-format=mixed --log-bin=master-bin --loose-innodb-locks-unsafe-for-binlog --binlog-format=mixed
--innodb_lock_wait_timeout=1 --loose-innodb_lock_wait_timeout=1
--innodb-lock-wait-timeout=2 --loose-innodb-lock-wait-timeout=2
--innodb_lock_wait_timeout=1 --innodb_rollback_on_timeout=1 --loose-innodb_lock_wait_timeout=1 --loose-innodb_rollback_on_timeout=1
--innodb_lock_wait_timeout=2 --innodb_rollback_on_timeout --loose-innodb_lock_wait_timeout=2 --loose-innodb_rollback_on_timeout
--innodb --default-storage-engine=innodb --loose-innodb --default-storage-engine=innodb
--innodb_file_per_table=1 --loose-innodb_file_per_table=1
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
!include include/default_mysqld.cnf !include include/default_mysqld.cnf
[mysqld.1] [mysqld.1]
pbxt
default-storage-engine=pbxt default-storage-engine=pbxt
[ENV] [ENV]
......
--default-storage-engine=pbxt
--innodb_doublewrite_file=ib_doublewrite --loose-innodb_doublewrite_file=ib_doublewrite
...@@ -8,8 +8,6 @@ ...@@ -8,8 +8,6 @@
log-bin= master-bin log-bin= master-bin
loose-innodb
[mysqld.2] [mysqld.2]
# Run the slave.sh script before starting this process # Run the slave.sh script before starting this process
#!run-slave-sh #!run-slave-sh
...@@ -18,7 +16,6 @@ loose-innodb ...@@ -18,7 +16,6 @@ loose-innodb
# starting the mysqld # starting the mysqld
#!use-slave-opt #!use-slave-opt
log-bin= slave-bin
relay-log= slave-relay-bin relay-log= slave-relay-bin
init-rpl-role= slave init-rpl-role= slave
......
--innodb --binlog-ignore-db=db2 --loose-innodb --binlog-ignore-db=db2
--innodb --replicate-do-db=db1 --loose-innodb --replicate-do-db=db1
...@@ -2,19 +2,19 @@ ...@@ -2,19 +2,19 @@
[mysqld.1] [mysqld.1]
log-slave-updates log-slave-updates
innodb loose-innodb
[mysqld.2] [mysqld.2]
log-slave-updates log-slave-updates
innodb loose-innodb
[mysqld.3] [mysqld.3]
log-slave-updates log-slave-updates
innodb loose-innodb
[mysqld.4] [mysqld.4]
log-slave-updates log-slave-updates
innodb loose-innodb
[ENV] [ENV]
SLAVE_MYPORT1= @mysqld.3.port SLAVE_MYPORT1= @mysqld.3.port
......
--innodb-lock-wait-timeout=1 --loose-innodb-lock-wait-timeout=1
--innodb_lock_wait_timeout=4 --slave-transaction-retries=2 --max-relay-log-size=4096 --loose-innodb-lock-wait-timeout=4 --slave-transaction-retries=2 --max-relay-log-size=4096
--innodb_autoinc_lock_mode=0 --loose-innodb-autoinc-lock-mode=0
--innodb_autoinc_lock_mode=0 --loose-innodb-autoinc-lock-mode=0
--innodb_autoinc_lock_mode=0 --loose-innodb-autoinc-lock-mode=0
--innodb_lock_wait_timeout=60 --loose-innodb-lock-wait-timeout=60
...@@ -4,6 +4,11 @@ ...@@ -4,6 +4,11 @@
# TODO: Remove statement include once 12574 is patched # TODO: Remove statement include once 12574 is patched
--source include/have_binlog_format_mixed_or_statement.inc --source include/have_binlog_format_mixed_or_statement.inc
--source include/master-slave.inc --source include/master-slave.inc
--source include/have_innodb.inc
connection slave;
--source include/have_innodb.inc
connection master;
CALL mtr.add_suppression("Statement may not be safe to log in statement format."); CALL mtr.add_suppression("Statement may not be safe to log in statement format.");
...@@ -506,11 +511,9 @@ sync_slave_with_master; ...@@ -506,11 +511,9 @@ sync_slave_with_master;
connection master; connection master;
source include/master-slave-reset.inc; source include/master-slave-reset.inc;
source include/have_innodb.inc;
connection slave; connection slave;
source include/have_innodb.inc;
connection master; connection master;
create table t1 ( f int ) engine = innodb; create table t1 ( f int ) engine = innodb;
create table log ( r int ) engine = myisam; create table log ( r int ) engine = myisam;
create trigger tr create trigger tr
......
--innodb --loose-innodb
\ No newline at end of file
--innodb --default-storage-engine=innodb --ndbcluster=0 --loose-innodb --default-storage-engine=innodb --ndbcluster=0
--innodb --loose-ndbcluster=OFF --log-slave-updates=0 --loose-innodb --loose-ndbcluster=OFF --log-slave-updates=0
...@@ -2,15 +2,12 @@ ...@@ -2,15 +2,12 @@
[mysqld.1.1] [mysqld.1.1]
server-id= 1 server-id= 1
log-bin
[mysqld.2.1] [mysqld.2.1]
server-id= 1 server-id= 1
log-bin
[mysqld.1.slave] [mysqld.1.slave]
server-id= 2 server-id= 2
log-bin
skip-slave-start skip-slave-start
[mysqld.2.slave] [mysqld.2.slave]
...@@ -21,7 +18,6 @@ master-password= @mysqld.2.1.#password ...@@ -21,7 +18,6 @@ master-password= @mysqld.2.1.#password
master-user= @mysqld.2.1.#user master-user= @mysqld.2.1.#user
master-connect-retry= 1 master-connect-retry= 1
init-rpl-role= slave init-rpl-role= slave
log-bin
skip-slave-start skip-slave-start
ndb_connectstring= @mysql_cluster.slave.ndb_connectstring ndb_connectstring= @mysql_cluster.slave.ndb_connectstring
......
--innodb --ndbcluster --replicate-ignore-table=mysql.ndb_apply_status --loose-innodb --ndbcluster --replicate-ignore-table=mysql.ndb_apply_status
--innodb --default-storage-engine=innodb --loose-innodb --default-storage-engine=innodb
--secure-file-priv=$MYSQL_TEST_DIR --innodb --secure-file-priv=$MYSQL_TEST_DIR --loose-innodb
--innodb-autoinc-lock-mode=1 --loose-innodb-autoinc-lock-mode=1
--innodb --loose-innodb
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
--binlog-format=row --binlog-format=row
\ No newline at end of file
--innodb-lock-wait-timeout=2 --loose-innodb-lock-wait-timeout=2
--innodb-file-per-table --loose-innodb-file-per-table
--innodb_lock_wait_timeout=1 --loose-innodb_lock_wait_timeout=1
--innodb_locks_unsafe_for_binlog --loose-innodb_locks_unsafe_for_binlog
--innodb_lock_wait_timeout=1 --loose-innodb_lock_wait_timeout=1
...@@ -5,4 +5,4 @@ extra-port= @mysqld.1.#extra-port ...@@ -5,4 +5,4 @@ extra-port= @mysqld.1.#extra-port
extra-max-connections=1 extra-max-connections=1
[ENV] [ENV]
MASTER_EXTRA_PORT= @mysqld.1.extra-port MASTER_EXTRA_PORT= @mysqld.1.#extra-port
#
# Simple test for the example storage engine
# Taken fromm the select test
#
-- source include/have_exampledb.inc
--disable_warnings
# Clean up if event's test fails
drop database if exists events_test;
drop database if exists events_test2;
drop table if exists t1;
--enable_warnings
CREATE TABLE t1 (
Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL,
Varor_period smallint(4) unsigned DEFAULT '0' NOT NULL
) ENGINE=example;
drop table t1;
# End of 4.1 tests
--innodb_lock_wait_timeout=1 --loose-innodb_lock_wait_timeout=1
--innodb_lock_wait_timeout=2 --loose-innodb_lock_wait_timeout=2
...@@ -11,4 +11,4 @@ extra-max-connections=1 ...@@ -11,4 +11,4 @@ extra-max-connections=1
connect-timeout= 2 connect-timeout= 2
[ENV] [ENV]
MASTER_EXTRA_PORT= @mysqld.1.extra-port MASTER_EXTRA_PORT= @mysqld.1.#extra-port
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# part of sp_trans test that appeared to be sensitive to binlog format # part of sp_trans test that appeared to be sensitive to binlog format
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/have_binlog_format_mixed_or_row.inc --source include/have_binlog_format_mixed.inc
delimiter |; delimiter |;
......
--innodb_locks_unsafe_for_binlog=true --innodb_lock_wait_timeout=1 --loose-innodb_locks_unsafe_for_binlog=true --loose-innodb_lock_wait_timeout=1
...@@ -2,23 +2,22 @@ ...@@ -2,23 +2,22 @@
# Only run this test with a compiled in but disabled # Only run this test with a compiled in but disabled
# engine # engine
# #
disable_query_log; if (!`SELECT count(*) FROM information_schema.engines WHERE
--require r/true.require support = 'NO' AND engine = 'innodb'`){
select support = 'NO' as `TRUE` from information_schema.engines where engine = 'ndbcluster'; skip Needs innodb engine;
enable_query_log; }
# #
# Test for handler type, will select MyISAM and print a warning # Test for handler type, will select MyISAM and print a warning
# about that - since NDB is disabled # about that - since InnoDB is disabled
# #
create table t1 (id int) engine=NDB; create table t1 (id int) engine=InnoDB;
alter table t1 engine=NDB; alter table t1 engine=InnoDB;
drop table t1; drop table t1;
# #
# Bug#29263 disabled storage engines omitted in SHOW ENGINES # Bug#29263 disabled storage engines omitted in SHOW ENGINES
# #
SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='ndbcluster'; SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE='InnoDB';
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='InnoDB';
PLUGIN_NAME='ndbcluster';
...@@ -51,7 +51,7 @@ int my_getwd(char * buf, size_t size, myf MyFlags) ...@@ -51,7 +51,7 @@ int my_getwd(char * buf, size_t size, myf MyFlags)
(long) buf, (uint) size, MyFlags)); (long) buf, (uint) size, MyFlags));
if (size < 1) if (size < 1)
return(-1); DBUG_RETURN(-1);
if (curr_dir[0]) /* Current pos is saved here */ if (curr_dir[0]) /* Current pos is saved here */
VOID(strmake(buf,&curr_dir[0],size-1)); VOID(strmake(buf,&curr_dir[0],size-1));
...@@ -59,12 +59,12 @@ int my_getwd(char * buf, size_t size, myf MyFlags) ...@@ -59,12 +59,12 @@ int my_getwd(char * buf, size_t size, myf MyFlags)
{ {
#if defined(HAVE_GETCWD) #if defined(HAVE_GETCWD)
if (size < 2) if (size < 2)
return(-1); DBUG_RETURN(-1);
if (!getcwd(buf,(uint) (size-2)) && MyFlags & MY_WME) if (!getcwd(buf,(uint) (size-2)) && MyFlags & MY_WME)
{ {
my_errno=errno; my_errno=errno;
my_error(EE_GETWD,MYF(ME_BELL+ME_WAITTANG),errno); my_error(EE_GETWD,MYF(ME_BELL+ME_WAITTANG),errno);
return(-1); DBUG_RETURN(-1);
} }
#elif defined(HAVE_GETWD) #elif defined(HAVE_GETWD)
{ {
...@@ -74,12 +74,12 @@ int my_getwd(char * buf, size_t size, myf MyFlags) ...@@ -74,12 +74,12 @@ int my_getwd(char * buf, size_t size, myf MyFlags)
} }
#elif defined(VMS) #elif defined(VMS)
if (size < 2) if (size < 2)
return(-1); DBUG_RETURN(-1);
if (!getcwd(buf,size-2,1) && MyFlags & MY_WME) if (!getcwd(buf,size-2,1) && MyFlags & MY_WME)
{ {
my_errno=errno; my_errno=errno;
my_error(EE_GETWD,MYF(ME_BELL+ME_WAITTANG),errno); my_error(EE_GETWD,MYF(ME_BELL+ME_WAITTANG),errno);
return(-1); DBUG_RETURN(-1);
} }
intern_filename(buf,buf); intern_filename(buf,buf);
#else #else
......
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