From 02eee93f3aa476280f80042809574d00f1c20de2 Mon Sep 17 00:00:00 2001 From: Magnus Svensson Date: Sat, 20 Sep 2008 16:51:31 +0300 Subject: [PATCH] Versional testing support --- mysql-test/lib/My/Find.pm | 36 ++++++++++- mysql-test/mysql-test-run.pl | 117 ++++++++++++++++++++++------------- 2 files changed, 108 insertions(+), 45 deletions(-) diff --git a/mysql-test/lib/My/Find.pm b/mysql-test/lib/My/Find.pm index 8b90e757917..8557584bbc8 100644 --- a/mysql-test/lib/My/Find.pm +++ b/mysql-test/lib/My/Find.pm @@ -26,7 +26,7 @@ use Carp; use My::Platform; use base qw(Exporter); -our @EXPORT= qw(my_find_bin my_find_dir NOT_REQUIRED); +our @EXPORT= qw(my_find_bin my_find_dir my_find_file NOT_REQUIRED); our $vs_config_dir; @@ -77,6 +77,40 @@ sub my_find_bin { } +# +# my_find_file - find a file with "name_1...name_n" in +# paths "path_1...path_n" and return the full path +# +# Example: +# my $mysqld_exe= my_find_file($basedir. +# ["sql", "bin"], +# "filename"); +# +# +# Also supports NOT_REQUIRED flag +# +# NOTE: The function honours MTR_VS_CONFIG environment variable +# +# +sub my_find_file { + my ($base, $paths, $names, $required)= @_; + croak "usage: my_find_file(, , , [])" + unless @_ == 4 or @_ == 3; + + # ------------------------------------------------------- + # Find and return the first executable + # ------------------------------------------------------- + foreach my $path (my_find_paths($base, $paths, $names, $bin_extension)) { + return $path if ( -f $path ); + } + if (defined $required and $required == NOT_REQUIRED){ + # Return empty string to indicate not found + return ""; + } + find_error($base, $paths, $names); +} + + # # my_find_dir - find the first existing directory in one of # the given paths diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 53f916a630a..1eb767ee47f 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -188,8 +188,6 @@ my $exe_ndbd; my $exe_ndb_mgmd; my $exe_ndb_waiter; -our $path_sql_dir; - our $debug_compiled_binaries; our %mysqld_variables; @@ -651,7 +649,6 @@ sub run_worker ($) { setup_vardir(); check_running_as_root(); - mysql_install_db($thread_num); if ( using_extern() ) { create_config_file_for_extern(%opts_extern); @@ -894,21 +891,10 @@ sub command_line_setup { "$basedir/sql/share", "$basedir/share"); + $path_language= mtr_path_exists("$path_share/english"); $path_charsetsdir= mtr_path_exists("$path_share/charsets"); - # Look for SQL scripts directory - if ( mtr_file_exists("$path_share/mysql_system_tables.sql") ne "") - { - # The SQL scripts are in path_share - $path_sql_dir= $path_share; - } - else - { - $path_sql_dir= mtr_path_exists("$basedir/share", - "$basedir/scripts"); - } - if (using_extern()) { # Connect to the running mysqld and find out what it supports @@ -2419,7 +2405,7 @@ sub initialize_servers { remove_stale_vardir(); setup_vardir(); - mysql_install_db(0); + mysql_install_db(default_mysqld(), "$opt_vardir/install.db"); } } } @@ -2474,9 +2460,33 @@ sub sql_to_bootstrap { } +sub default_mysqld { + # Generate new config file from template + my $config= My::ConfigFactory->new_config + ( { + basedir => $basedir, + template_path => "include/default_my.cnf", + vardir => $opt_vardir, + tmpdir => $opt_tmpdir, + baseport => 0, + user => $opt_user, + password => '', + } + ); + + my $mysqld= $config->group('mysqld.1') + or mtr_error("Couldn't find mysqld.1 in default config"); + return $mysqld; +} + + sub mysql_install_db { - my ($thread_num)= @_; - my $data_dir= "$opt_vardir/install.db"; + my ($mysqld, $datadir)= @_; + + my $install_datadir= $datadir || $mysqld->value('datadir'); + my $install_basedir= $mysqld->value('basedir'); + my $install_lang= $mysqld->value('language'); + my $install_chsdir= $mysqld->value('character-sets-dir'); mtr_report("Installing system database..."); @@ -2484,8 +2494,8 @@ sub mysql_install_db { mtr_init_args(\$args); mtr_add_arg($args, "--no-defaults"); mtr_add_arg($args, "--bootstrap"); - mtr_add_arg($args, "--basedir=%s", $basedir); - mtr_add_arg($args, "--datadir=%s", $data_dir); + mtr_add_arg($args, "--basedir=%s", $install_basedir); + mtr_add_arg($args, "--datadir=%s", $install_datadir); mtr_add_arg($args, "--loose-skip-innodb"); mtr_add_arg($args, "--loose-skip-ndbcluster"); mtr_add_arg($args, "--tmpdir=%s", "$opt_vardir/tmp/"); @@ -2497,47 +2507,60 @@ sub mysql_install_db { $path_vardir_trace); } - mtr_add_arg($args, "--language=%s", $path_language); - mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir); + mtr_add_arg($args, "--language=%s", $install_lang); + mtr_add_arg($args, "--character-sets-dir=%s", $install_chsdir); # If DISABLE_GRANT_OPTIONS is defined when the server is compiled (e.g., # configure --disable-grant-options), mysqld will not recognize the # --bootstrap or --skip-grant-tables options. The user can set # MYSQLD_BOOTSTRAP to the full path to a mysqld which does accept # --bootstrap, to accommodate this. - my $exe_mysqld_bootstrap = $ENV{'MYSQLD_BOOTSTRAP'} || find_mysqld($basedir); + my $exe_mysqld_bootstrap = + $ENV{'MYSQLD_BOOTSTRAP'} || find_mysqld($install_basedir); # ---------------------------------------------------------------------- # export MYSQLD_BOOTSTRAP_CMD variable containing /mysqld # ---------------------------------------------------------------------- $ENV{'MYSQLD_BOOTSTRAP_CMD'}= "$exe_mysqld_bootstrap " . join(" ", @$args); - return if $thread_num > 0; # Only generate MYSQLD_BOOTSTRAP_CMD in workers + # ---------------------------------------------------------------------- # Create the bootstrap.sql file # ---------------------------------------------------------------------- my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql"; - if (-f "$path_sql_dir/mysql_system_tables.sql") + my $path_sql= my_find_file($install_basedir, + ["mysql", "sql/share", "share", "scripts"], + "mysql_system_tables.sql", + NOT_REQUIRED); + + if (-f $path_sql ) { + my $sql_dir= dirname($path_sql); # Use the mysql database for system tables mtr_tofile($bootstrap_sql_file, "use mysql\n"); # Add the offical mysql system tables # for a production system - mtr_appendfile_to_file("$path_sql_dir/mysql_system_tables.sql", + mtr_appendfile_to_file("$sql_dir/mysql_system_tables.sql", $bootstrap_sql_file); # Add the mysql system tables initial data # for a production system - mtr_appendfile_to_file("$path_sql_dir/mysql_system_tables_data.sql", + mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql", $bootstrap_sql_file); # Add test data for timezone - this is just a subset, on a real # system these tables will be populated either by mysql_tzinfo_to_sql # or by downloading the timezone table package from our website - mtr_appendfile_to_file("$path_sql_dir/mysql_test_data_timezone.sql", + mtr_appendfile_to_file("$sql_dir/mysql_test_data_timezone.sql", + $bootstrap_sql_file); + + # Fill help tables, just an empty file when running from bk repo + # but will be replaced by a real fill_help_tables.sql when + # building the source dist + mtr_appendfile_to_file("$sql_dir/fill_help_tables.sql", $bootstrap_sql_file); } @@ -2545,7 +2568,7 @@ sub mysql_install_db { { # Install db from init_db.sql that exist in early 5.1 and 5.0 # versions of MySQL - my $init_file= "$basedir/mysql-test/lib/init_db.sql"; + my $init_file= "$install_basedir/mysql-test/lib/init_db.sql"; mtr_report(" - from '$init_file'"); my $text= mtr_grab_file($init_file) or mtr_error("Can't open '$init_file': $!"); @@ -2554,12 +2577,6 @@ sub mysql_install_db { sql_to_bootstrap($text)); } - # Fill help tables, just an empty file when running from bk repo - # but will be replaced by a real fill_help_tables.sql when - # building the source dist - mtr_appendfile_to_file("$path_sql_dir/fill_help_tables.sql", - $bootstrap_sql_file); - # Remove anonymous users mtr_tofile($bootstrap_sql_file, "DELETE FROM mysql.user where user= '';\n"); @@ -2582,8 +2599,8 @@ sub mysql_install_db { "$exe_mysqld_bootstrap " . join(" ", @$args) . "\n"); # Create directories mysql and test - mkpath("$data_dir/mysql"); - mkpath("$data_dir/test"); + mkpath("$install_datadir/mysql"); + mkpath("$install_datadir/test"); if ( My::SafeProcess->run ( @@ -4087,14 +4104,26 @@ sub start_servers($) { } } - # 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; + my $mysqld_basedir= $mysqld->value('basedir'); + if ( $basedir eq $mysqld_basedir ) + { + # 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); + + mtr_error("Failed to install system db to '$datadir'") + unless -d $datadir; + } - mtr_error("Failed to copy system db to '$datadir'") - unless -d $datadir; # Create the servers tmpdir my $tmpdir= $mysqld->value('tmpdir');