Automerge with 5.1
This commit is contained in:
commit
58a75bb18b
@ -1936,3 +1936,5 @@ sql/client_plugin.c
|
|||||||
*.dgcov
|
*.dgcov
|
||||||
libmysqld/create_options.cc
|
libmysqld/create_options.cc
|
||||||
storage/pbxt/bin/xtstat
|
storage/pbxt/bin/xtstat
|
||||||
|
mysql-test/mtr_command
|
||||||
|
scripts/convert-debug-for-diff
|
||||||
|
@ -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"
|
|||||||
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.
|
||||||
|
7
BUILD/compile-amd64-debug-all
Executable file
7
BUILD/compile-amd64-debug-all
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#! /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"
|
10
BUILD/compile-pentium-debug-all
Executable file
10
BUILD/compile-pentium-debug-all
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
#! /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"
|
12
BUILD/compile-pentium64-debug-all
Executable file
12
BUILD/compile-pentium64-debug-all
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#! /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"
|
@ -156,6 +156,7 @@ static my_bool ignore_errors=0,wait_flag=0,quick=0,
|
|||||||
static my_bool debug_info_flag, debug_check_flag, batch_abort_on_error;
|
static my_bool debug_info_flag, debug_check_flag, batch_abort_on_error;
|
||||||
static my_bool column_types_flag;
|
static my_bool column_types_flag;
|
||||||
static my_bool preserve_comments= 0;
|
static my_bool preserve_comments= 0;
|
||||||
|
static my_bool in_com_source, aborted= 0;
|
||||||
static ulong opt_max_allowed_packet, opt_net_buffer_length;
|
static ulong opt_max_allowed_packet, opt_net_buffer_length;
|
||||||
static uint verbose=0,opt_silent=0,opt_mysql_port=0, opt_local_infile=0;
|
static uint verbose=0,opt_silent=0,opt_mysql_port=0, opt_local_infile=0;
|
||||||
static uint my_end_arg;
|
static uint my_end_arg;
|
||||||
@ -1088,6 +1089,7 @@ int main(int argc,char *argv[])
|
|||||||
"\\N [\\d]> ",MYF(MY_WME));
|
"\\N [\\d]> ",MYF(MY_WME));
|
||||||
current_prompt = my_strdup(default_prompt,MYF(MY_WME));
|
current_prompt = my_strdup(default_prompt,MYF(MY_WME));
|
||||||
prompt_counter=0;
|
prompt_counter=0;
|
||||||
|
aborted= 0;
|
||||||
|
|
||||||
outfile[0]=0; // no (default) outfile
|
outfile[0]=0; // no (default) outfile
|
||||||
strmov(pager, "stdout"); // the default, if --pager wasn't given
|
strmov(pager, "stdout"); // the default, if --pager wasn't given
|
||||||
@ -1282,8 +1284,10 @@ sig_handler mysql_end(int sig)
|
|||||||
/*
|
/*
|
||||||
This function handles sigint calls
|
This function handles sigint calls
|
||||||
If query is in process, kill query
|
If query is in process, kill query
|
||||||
|
If 'source' is executed, abort source command
|
||||||
no query in process, terminate like previous behavior
|
no query in process, terminate like previous behavior
|
||||||
*/
|
*/
|
||||||
|
|
||||||
sig_handler handle_sigint(int sig)
|
sig_handler handle_sigint(int sig)
|
||||||
{
|
{
|
||||||
char kill_buffer[40];
|
char kill_buffer[40];
|
||||||
@ -1322,7 +1326,8 @@ sig_handler handle_sigint(int sig)
|
|||||||
mysql_close(kill_mysql);
|
mysql_close(kill_mysql);
|
||||||
tee_fprintf(stdout, "Ctrl-C -- query killed. Continuing normally.\n");
|
tee_fprintf(stdout, "Ctrl-C -- query killed. Continuing normally.\n");
|
||||||
interrupted_query= 0;
|
interrupted_query= 0;
|
||||||
|
if (in_com_source)
|
||||||
|
aborted= 1; // Abort source command
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -1886,7 +1891,7 @@ static int read_and_execute(bool interactive)
|
|||||||
String buffer;
|
String buffer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *line;
|
char *line= 0;
|
||||||
char in_string=0;
|
char in_string=0;
|
||||||
ulong line_number=0;
|
ulong line_number=0;
|
||||||
bool ml_comment= 0;
|
bool ml_comment= 0;
|
||||||
@ -1894,7 +1899,7 @@ static int read_and_execute(bool interactive)
|
|||||||
bool truncated= 0;
|
bool truncated= 0;
|
||||||
status.exit_status=1;
|
status.exit_status=1;
|
||||||
|
|
||||||
for (;;)
|
while (!aborted)
|
||||||
{
|
{
|
||||||
if (!interactive)
|
if (!interactive)
|
||||||
{
|
{
|
||||||
@ -4074,17 +4079,19 @@ static int com_source(String *buffer, char *line)
|
|||||||
status.file_name=source_name;
|
status.file_name=source_name;
|
||||||
glob_buffer.length(0); // Empty command buffer
|
glob_buffer.length(0); // Empty command buffer
|
||||||
ignore_errors= !batch_abort_on_error;
|
ignore_errors= !batch_abort_on_error;
|
||||||
|
in_com_source= 1;
|
||||||
error= read_and_execute(false);
|
error= read_and_execute(false);
|
||||||
ignore_errors= save_ignore_errors;
|
ignore_errors= save_ignore_errors;
|
||||||
status=old_status; // Continue as before
|
status=old_status; // Continue as before
|
||||||
|
in_com_source= aborted= 0;
|
||||||
my_fclose(sql_file,MYF(0));
|
my_fclose(sql_file,MYF(0));
|
||||||
batch_readline_end(line_buff);
|
batch_readline_end(line_buff);
|
||||||
/*
|
/*
|
||||||
If we got an error during source operation, don't abort the client
|
If we got an error during source operation, don't abort the client
|
||||||
if ignore_errors is set
|
if ignore_errors is set
|
||||||
*/
|
*/
|
||||||
if (error && batch_abort_on_error && ignore_errors)
|
if (error && !batch_abort_on_error && ignore_errors)
|
||||||
error= -1;
|
error= -1; // Ignore error
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,8 +71,8 @@ static struct my_option my_long_options[] =
|
|||||||
&opt_auto_repair, &opt_auto_repair, 0, GET_BOOL, NO_ARG, 0,
|
&opt_auto_repair, &opt_auto_repair, 0, GET_BOOL, NO_ARG, 0,
|
||||||
0, 0, 0, 0, 0},
|
0, 0, 0, 0, 0},
|
||||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||||
"Directory for character set files.", &charsets_dir,
|
"Directory for character set files.", (char**) &charsets_dir,
|
||||||
&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
(char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
|
{"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
|
||||||
0, 0, 0, 0},
|
0, 0, 0, 0},
|
||||||
{"check-only-changed", 'C',
|
{"check-only-changed", 'C',
|
||||||
|
@ -211,8 +211,8 @@ static struct my_option my_long_options[] =
|
|||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#endif
|
#endif
|
||||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||||
"Directory for character set files.", &charsets_dir,
|
"Directory for character set files.", (char**) &charsets_dir,
|
||||||
&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
(char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"comments", 'i', "Write additional information.",
|
{"comments", 'i', "Write additional information.",
|
||||||
&opt_comments, &opt_comments, 0, GET_BOOL, NO_ARG,
|
&opt_comments, &opt_comments, 0, GET_BOOL, NO_ARG,
|
||||||
1, 0, 0, 0, 0, 0},
|
1, 0, 0, 0, 0, 0},
|
||||||
@ -242,8 +242,8 @@ static struct my_option my_long_options[] =
|
|||||||
{"debug", '#', "This is a non-debug version. Catch this and exit.",
|
{"debug", '#', "This is a non-debug version. Catch this and exit.",
|
||||||
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#else
|
#else
|
||||||
{"debug", '#', "Output debug log.", &default_dbug_option,
|
{"debug", '#', "Output debug log.", (char**) &default_dbug_option,
|
||||||
&default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
(char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#endif
|
#endif
|
||||||
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
||||||
&debug_check_flag, &debug_check_flag, 0,
|
&debug_check_flag, &debug_check_flag, 0,
|
||||||
|
@ -73,8 +73,8 @@ static struct my_option my_long_options[] =
|
|||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#endif
|
#endif
|
||||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||||
"Directory for character set files.", &charsets_dir,
|
"Directory for character set files.", (char**) &charsets_dir,
|
||||||
&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
(char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"default-character-set", OPT_DEFAULT_CHARSET,
|
{"default-character-set", OPT_DEFAULT_CHARSET,
|
||||||
"Set the default character set.", &default_charset,
|
"Set the default character set.", &default_charset,
|
||||||
&default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
&default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
@ -55,8 +55,8 @@ static struct my_option my_long_options[] =
|
|||||||
{"debug", '#', "This is a non-debug version. Catch this and exit",
|
{"debug", '#', "This is a non-debug version. Catch this and exit",
|
||||||
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#else
|
#else
|
||||||
{"debug", '#', "Output debug log", &default_dbug_option,
|
{"debug", '#', "Output debug log", (char**) &default_dbug_option,
|
||||||
&default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
(char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#endif
|
#endif
|
||||||
{"defaults-file", 'c', "Like --config-file, except: if first option, "
|
{"defaults-file", 'c', "Like --config-file, except: if first option, "
|
||||||
"then read this file only, do not read global or per-user config "
|
"then read this file only, do not read global or per-user config "
|
||||||
|
@ -807,10 +807,10 @@ typedef SOCKET_SIZE_TYPE size_socket;
|
|||||||
#endif
|
#endif
|
||||||
/* get memory in huncs */
|
/* get memory in huncs */
|
||||||
#define ONCE_ALLOC_INIT (uint) (4096-MALLOC_OVERHEAD)
|
#define ONCE_ALLOC_INIT (uint) (4096-MALLOC_OVERHEAD)
|
||||||
/* Typical record cash */
|
/* Typical record cache */
|
||||||
#define RECORD_CACHE_SIZE (uint) (64*1024-MALLOC_OVERHEAD)
|
#define RECORD_CACHE_SIZE (uint) (128*1024-MALLOC_OVERHEAD)
|
||||||
/* Typical key cash */
|
/* Typical key cache */
|
||||||
#define KEY_CACHE_SIZE (uint) (8*1024*1024-MALLOC_OVERHEAD)
|
#define KEY_CACHE_SIZE (uint) (128L*1024L*1024L-MALLOC_OVERHEAD)
|
||||||
/* Default size of a key cache block */
|
/* Default size of a key cache block */
|
||||||
#define KEY_CACHE_BLOCK_SIZE (uint) 1024
|
#define KEY_CACHE_BLOCK_SIZE (uint) 1024
|
||||||
|
|
||||||
|
@ -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 \
|
|||||||
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/vcol suite/vcol/t suite/vcol/r suite/vcol/inc \
|
suite/vcol suite/vcol/t suite/vcol/r suite/vcol/inc \
|
||||||
suite/oqgraph suite/oqgraph/t suite/oqgraph/r suite/oqgraph/include \
|
suite/oqgraph suite/oqgraph/t suite/oqgraph/r suite/oqgraph/include \
|
||||||
|
@ -18,7 +18,7 @@ the test suite expects you to provide the names of the tests to run.
|
|||||||
For example, here is the command to run the "alias" and "analyze" tests
|
For example, here is the command to run the "alias" and "analyze" tests
|
||||||
with an external server:
|
with an external server:
|
||||||
|
|
||||||
mysql-test-run --extern alias analyze
|
mysql-test-run --extern socket=/tmp/mysql.sock alias analyze
|
||||||
|
|
||||||
To match your setup, you might also need to provide --socket, --user, and
|
To match your setup, you might also need to provide --socket, --user, and
|
||||||
other relevant options.
|
other relevant options.
|
||||||
|
138
mysql-test/README.suites
Normal file
138
mysql-test/README.suites
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
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 @@
|
|||||||
# 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
|
|||||||
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
|
|
||||||
|
|
||||||
|
1
mysql-test/include/have_binlog_format_mixed.opt
Normal file
1
mysql-test/include/have_binlog_format_mixed.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--binlog-format=mixed
|
1
mysql-test/include/have_binlog_format_row.opt
Normal file
1
mysql-test/include/have_binlog_format_row.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--binlog-format=row
|
2
mysql-test/include/have_binlog_format_statement.opt
Normal file
2
mysql-test/include/have_binlog_format_statement.opt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
--binlog-format=statement
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
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;
|
|
@ -1,4 +1,5 @@
|
|||||||
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;
|
||||||
|
}
|
||||||
|
1
mysql-test/include/have_innodb.opt
Normal file
1
mysql-test/include/have_innodb.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--loose-innodb
|
@ -1,4 +1,5 @@
|
|||||||
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;
|
||||||
|
}
|
||||||
|
1
mysql-test/include/have_log_bin-master.opt
Normal file
1
mysql-test/include/have_log_bin-master.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--log-bin=master-bin
|
1
mysql-test/include/have_log_bin-slave.opt
Normal file
1
mysql-test/include/have_log_bin-slave.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--log-bin=slave-bin
|
@ -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';
|
||||||
|
1
mysql-test/include/have_pbxt.opt
Normal file
1
mysql-test/include/have_pbxt.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--loose-pbxt
|
@ -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 {
|
|||||||
$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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# 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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# <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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# <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 {
|
|||||||
|
|
||||||
#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 {
|
|||||||
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 {
|
|||||||
|
|
||||||
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)
|
|||||||
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 {
|
|||||||
|
|
||||||
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)
|
||||||
|
or croak "There is no group named '$group_name' that ",
|
||||||
|
"can be used to resolve '$option_name'";
|
||||||
|
|
||||||
my $from_group= $config->group($group_name)
|
my $value= $from_group->value($option_name);
|
||||||
or croak "There is no group named '$group_name' that ",
|
$res .= $before.$value;
|
||||||
"can be used to resolve '$option_name'";
|
}
|
||||||
|
$res .= $after;
|
||||||
|
|
||||||
my $from= $from_group->value($option_name);
|
$config->insert($group->name(), $option->name(), $res)
|
||||||
$config->insert($group->name(), $option->name(), $from)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -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 {
|
|||||||
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
|
||||||
|
0
mysql-test/lib/My/Handles.pm
Executable file → Normal file
0
mysql-test/lib/My/Handles.pm
Executable file → Normal file
@ -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'});
|
||||||
|
10
mysql-test/lib/My/Suite.pm
Normal file
10
mysql-test/lib/My/Suite.pm
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# 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 {
|
|||||||
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;
|
|||||||
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";
|
|||||||
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 ($$$) {
|
|||||||
$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 ($$$) {
|
|||||||
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
|
|||||||
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
|
|||||||
{
|
{
|
||||||
# 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 {
|
|||||||
# 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 {
|
|||||||
|
|
||||||
$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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
$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 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
$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'} )
|
||||||
@ -1127,27 +1007,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;
|
||||||
}
|
}
|
||||||
@ -1157,24 +1037,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],
|
||||||
@ -1182,7 +1044,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],
|
||||||
@ -1196,6 +1057,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> )
|
||||||
{
|
{
|
||||||
@ -1231,13 +1093,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 {
|
||||||
@ -1250,6 +1112,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 {
|
|||||||
|
|
||||||
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
|
|||||||
# 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,vcol,oqgraph";
|
my $DEFAULT_SUITES= "main,binlog,federated,rpl,maria,parts,innodb,innodb_plugin,percona,vcol,oqgraph,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;
|
|||||||
|
|
||||||
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 ($$$) {
|
|||||||
$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 ($) {
|
|||||||
# 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);
|
||||||
@ -1592,7 +1596,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))
|
||||||
{
|
{
|
||||||
@ -2490,7 +2494,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");
|
||||||
@ -2658,7 +2662,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()."'");
|
||||||
|
|
||||||
@ -2678,6 +2682,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=
|
||||||
(
|
(
|
||||||
@ -3452,9 +3559,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;
|
||||||
@ -3497,7 +3677,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);
|
||||||
}
|
}
|
||||||
@ -3533,7 +3713,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,
|
||||||
@ -3541,8 +3720,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
|
||||||
@ -3685,7 +3872,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
|
||||||
@ -3843,7 +4030,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);
|
||||||
@ -3852,14 +4040,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
|
||||||
@ -3904,6 +4092,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)
|
||||||
@ -3945,9 +4135,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;
|
||||||
}
|
}
|
||||||
@ -4026,15 +4216,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/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\)/,
|
||||||
@ -4343,29 +4536,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
|
||||||
@ -4388,17 +4570,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)= @_;
|
||||||
|
|
||||||
@ -4415,31 +4586,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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4577,8 +4735,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 )
|
||||||
@ -4834,8 +4992,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
|
||||||
@ -4887,17 +5044,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
|
||||||
@ -4951,28 +5100,10 @@ sub get_extra_opts {
|
|||||||
sub stop_servers($$) {
|
sub stop_servers($$) {
|
||||||
my (@servers)= @_;
|
my (@servers)= @_;
|
||||||
|
|
||||||
if ( join('|', @servers) eq join('|', all_servers()) )
|
mtr_report("Restarting ", started(@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");
|
My::SafeProcess::shutdown($opt_shutdown_timeout,
|
||||||
|
started(@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));
|
|
||||||
|
|
||||||
# Stop only some servers
|
|
||||||
My::SafeProcess::shutdown( $opt_shutdown_timeout,
|
|
||||||
started(@servers) );
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach my $server (@servers)
|
foreach my $server (@servers)
|
||||||
{
|
{
|
||||||
@ -4999,145 +5130,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
|
for (all_servers()) {
|
||||||
foreach my $mysqld ( mysqlds() )
|
next unless $_->{WAIT} and started($_);
|
||||||
{
|
if ($_->{WAIT}->($_)) {
|
||||||
if ( $mysqld->{proc} )
|
$tinfo->{comment}= "Failed to start ".$_->name();
|
||||||
{
|
|
||||||
# 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
|
|
||||||
foreach my $mysqld ( mysqlds() )
|
|
||||||
{
|
|
||||||
next if !started($mysqld);
|
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5835,3 +5835,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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
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;
|
|
@ -1809,5 +1809,22 @@ SELECT MAX(t2.a) FROM t2 LEFT JOIN t1 ON t2.a = t1.a;
|
|||||||
MAX(t2.a)
|
MAX(t2.a)
|
||||||
2
|
2
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
CREATE TABLE t1 (a int(11) NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
key_col int(11) NOT NULL,
|
||||||
|
KEY (key_col)
|
||||||
|
);
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
select min(t2.key_col) from t1,t2 where t1.a=1;
|
||||||
|
min(t2.key_col)
|
||||||
|
1
|
||||||
|
select min(t2.key_col) from t1,t2 where t1.a > 1000;
|
||||||
|
min(t2.key_col)
|
||||||
|
NULL
|
||||||
|
select min(t2.key_col)+1 from t1,t2 where t1.a> 1000;
|
||||||
|
min(t2.key_col)+1
|
||||||
|
NULL
|
||||||
|
drop table t1,t2;
|
||||||
#
|
#
|
||||||
# End of 5.1 tests
|
# End of 5.1 tests
|
||||||
|
@ -59,3 +59,26 @@ FROM t3 WHERE 1 = 0 GROUP BY 1;
|
|||||||
(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
|
(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
|
||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
End of 5.0 tests.
|
End of 5.0 tests.
|
||||||
|
CREATE TABLE t1 (col_int_nokey int(11) NOT NULL, col_varchar_nokey varchar(1) NOT NULL) engine=myisam;
|
||||||
|
INSERT INTO t1 VALUES (2,'s'),(0,'v'),(2,'s');
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
pk int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`col_int_key` int(11) NOT NULL,
|
||||||
|
col_varchar_key varchar(1) NOT NULL,
|
||||||
|
PRIMARY KEY (pk),
|
||||||
|
KEY `col_int_key` (`col_int_key`),
|
||||||
|
KEY `col_varchar_key` (`col_varchar_key`)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (4,10,'g'), (5,20,'v');
|
||||||
|
SELECT t1.col_int_nokey,(SELECT MIN( t2_a.col_int_key ) FROM t2 t2_a, t2 t2_b, t1 t1_a WHERE t1_a.col_varchar_nokey = t2_b.col_varchar_key and t1.col_int_nokey ) as sub FROM t1;
|
||||||
|
col_int_nokey sub
|
||||||
|
2 10
|
||||||
|
0 NULL
|
||||||
|
2 10
|
||||||
|
SELECT t1.col_int_nokey,(SELECT MIN( t2_a.col_int_key ) +1 FROM t2 t2_a, t2 t2_b, t1 t1_a WHERE t1_a.col_varchar_nokey = t2_b.col_varchar_key and t1.col_int_nokey ) as sub FROM t1;
|
||||||
|
col_int_nokey sub
|
||||||
|
2 11
|
||||||
|
0 NULL
|
||||||
|
2 11
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
End of 5.1 tests.
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
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 @@
|
|||||||
|
|
||||||
|
|
||||||
# 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 @@
|
|||||||
|
|
||||||
# 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
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2
|
--loose-innodb_lock_wait_timeout=2
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2
|
--loose-innodb_lock_wait_timeout=2
|
||||||
|
30
mysql-test/suite/federated/federated_bug_32426.result
Normal file
30
mysql-test/suite/federated/federated_bug_32426.result
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
CREATE DATABASE federated;
|
||||||
|
CREATE DATABASE federated;
|
||||||
|
#
|
||||||
|
# Bug #32426: FEDERATED query returns corrupt results for ORDER BY
|
||||||
|
# on a TEXT column
|
||||||
|
#
|
||||||
|
CREATE TABLE federated.t1(a TEXT);
|
||||||
|
INSERT INTO federated.t1 VALUES('abc'), ('gh'), ('f'), ('ijk'), ('de');
|
||||||
|
CREATE TABLE federated.t1(a TEXT) ENGINE=FEDERATED
|
||||||
|
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1';
|
||||||
|
SELECT * FROM federated.t1 ORDER BY A;
|
||||||
|
a
|
||||||
|
abc
|
||||||
|
de
|
||||||
|
f
|
||||||
|
gh
|
||||||
|
ijk
|
||||||
|
SELECT * FROM federated.t1 ORDER BY A DESC;
|
||||||
|
a
|
||||||
|
ijk
|
||||||
|
gh
|
||||||
|
f
|
||||||
|
de
|
||||||
|
abc
|
||||||
|
DROP TABLE federated.t1;
|
||||||
|
DROP TABLE federated.t1;
|
||||||
|
DROP TABLE IF EXISTS federated.t1;
|
||||||
|
DROP DATABASE IF EXISTS federated;
|
||||||
|
DROP TABLE IF EXISTS federated.t1;
|
||||||
|
DROP DATABASE IF EXISTS federated;
|
24
mysql-test/suite/federated/federated_bug_32426.test
Normal file
24
mysql-test/suite/federated/federated_bug_32426.test
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
source federated.inc;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #32426: FEDERATED query returns corrupt results for ORDER BY
|
||||||
|
--echo # on a TEXT column
|
||||||
|
--echo #
|
||||||
|
connection slave;
|
||||||
|
CREATE TABLE federated.t1(a TEXT);
|
||||||
|
INSERT INTO federated.t1 VALUES('abc'), ('gh'), ('f'), ('ijk'), ('de');
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
--replace_result $SLAVE_MYPORT SLAVE_PORT
|
||||||
|
eval CREATE TABLE federated.t1(a TEXT) ENGINE=FEDERATED
|
||||||
|
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1';
|
||||||
|
SELECT * FROM federated.t1 ORDER BY A;
|
||||||
|
SELECT * FROM federated.t1 ORDER BY A DESC;
|
||||||
|
DROP TABLE federated.t1;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
DROP TABLE federated.t1;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
source federated_cleanup.inc;
|
@ -1 +1 @@
|
|||||||
--innodb
|
--loose-innodb
|
||||||
|
@ -213,7 +213,7 @@ id name
|
|||||||
alter server s1 options (database 'db_bogus');
|
alter server s1 options (database 'db_bogus');
|
||||||
flush tables;
|
flush tables;
|
||||||
select * from federated.t1;
|
select * from federated.t1;
|
||||||
ERROR 42000: Got error: 1044 : Access denied for user 'test_fed'@'localhost' to database 'db_bogus'
|
ERROR 42000: Received error: 1044 : Access denied for user 'test_fed'@'localhost' to database 'db_bogus'
|
||||||
drop server if exists 's1';
|
drop server if exists 's1';
|
||||||
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
||||||
create server 's1' foreign data wrapper 'mysql' options
|
create server 's1' foreign data wrapper 'mysql' options
|
||||||
|
@ -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 @@
|
|||||||
--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'
|
||||||
|
@ -1 +1 @@
|
|||||||
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1
|
--binlog_cache_size=32768 --loose-innodb_lock_wait_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2
|
--loose-innodb_lock_wait_timeout=2
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-autoinc-lock-mode=0
|
--loose-innodb-autoinc-lock-mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb --innodb_autoinc_lock_mode=0
|
--loose-innodb --loose-innodb_autoinc_lock_mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-file-per-table=1
|
--loose-innodb-file-per-table=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=1
|
--loose-innodb_lock_wait_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--log-bin --innodb-locks-unsafe-for-binlog --binlog-format=mixed
|
--loose-innodb-locks-unsafe-for-binlog --binlog-format=mixed
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
-- 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);
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=1
|
--loose-innodb_lock_wait_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1
|
--binlog_cache_size=32768 --loose-innodb_lock_wait_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-lock-wait-timeout=2
|
--loose-innodb-lock-wait-timeout=2
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=1 --innodb_rollback_on_timeout=1
|
--loose-innodb_lock_wait_timeout=1 --loose-innodb_rollback_on_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2 --innodb_rollback_on_timeout
|
--loose-innodb_lock_wait_timeout=2 --loose-innodb_rollback_on_timeout
|
||||||
|
12
mysql-test/suite/innodb_plugin/combinations
Normal file
12
mysql-test/suite/innodb_plugin/combinations
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[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
|
19
mysql-test/suite/innodb_plugin/suite.pm
Normal file
19
mysql-test/suite/innodb_plugin/suite.pm
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
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 { };
|
||||||
|
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2
|
--loose-innodb_lock_wait_timeout=2
|
||||||
|
@ -1 +1 @@
|
|||||||
--binlog_cache_size=32768 --innodb_lock_wait_timeout=1
|
--binlog_cache_size=32768 --loose-innodb_lock_wait_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2
|
--loose-innodb_lock_wait_timeout=2
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-use-sys-malloc=true
|
--loose-innodb-use-sys-malloc=true
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-autoinc-lock-mode=0
|
--loose-innodb-autoinc-lock-mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb --innodb_autoinc_lock_mode=0
|
--loose-innodb_autoinc_lock_mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-file-per-table=1
|
--loose-innodb-file-per-table=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_commit_concurrency=1
|
--loose-innodb_commit_concurrency=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--log-bin --innodb-locks-unsafe-for-binlog --binlog-format=mixed
|
--log-bin=master-bin --loose-innodb-locks-unsafe-for-binlog --binlog-format=mixed
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=1
|
--loose-innodb_lock_wait_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-lock-wait-timeout=2
|
--loose-innodb-lock-wait-timeout=2
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=1 --innodb_rollback_on_timeout=1
|
--loose-innodb_lock_wait_timeout=1 --loose-innodb_rollback_on_timeout=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2 --innodb_rollback_on_timeout
|
--loose-innodb_lock_wait_timeout=2 --loose-innodb_rollback_on_timeout
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb --default-storage-engine=innodb
|
--loose-innodb --default-storage-engine=innodb
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_file_per_table=1
|
--loose-innodb_file_per_table=1
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=2
|
--loose-innodb_lock_wait_timeout=2
|
||||||
|
@ -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]
|
||||||
|
@ -1 +0,0 @@
|
|||||||
--default-storage-engine=pbxt
|
|
@ -1 +1 @@
|
|||||||
--innodb_doublewrite_file=ib_doublewrite
|
--loose-innodb_doublewrite_file=ib_doublewrite
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb
|
--loose-innodb
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb
|
--loose-innodb
|
||||||
|
@ -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
|
|||||||
# 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
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb --binlog-ignore-db=db2
|
--loose-innodb --binlog-ignore-db=db2
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb --replicate-do-db=db1
|
--loose-innodb --replicate-do-db=db1
|
||||||
|
@ -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
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb-lock-wait-timeout=1
|
--loose-innodb-lock-wait-timeout=1
|
||||||
|
1
mysql-test/suite/rpl/t/rpl_ddl-slave.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_ddl-slave.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--loose-skip-innodb
|
@ -1 +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
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_autoinc_lock_mode=0
|
--loose-innodb-autoinc-lock-mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_autoinc_lock_mode=0
|
--loose-innodb-autoinc-lock-mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_autoinc_lock_mode=0
|
--loose-innodb-autoinc-lock-mode=0
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb_lock_wait_timeout=60
|
--loose-innodb-lock-wait-timeout=60
|
||||||
|
@ -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;
|
|||||||
|
|
||||||
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
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb
|
--loose-innodb
|
||||||
|
@ -1 +1 @@
|
|||||||
--innodb --default-storage-engine=innodb --ndbcluster=0
|
--loose-innodb --default-storage-engine=innodb --ndbcluster=0
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user