mysql-test-run.pl
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:71k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. # -*- cperl -*-
  3. # This is a transformation of the "mysql-test-run" Bourne shell script
  4. # to Perl. There are reasons this rewrite is not the prettiest Perl
  5. # you have seen
  6. #
  7. #   - The original script is huge and for most part uncommented,
  8. #     not even a usage description of the flags.
  9. #
  10. #   - There has been an attempt to write a replacement in C for the
  11. #     original Bourne shell script. It was kind of working but lacked
  12. #     lot of functionality to really be a replacement. Not to redo
  13. #     that mistake and catch all the obscure features of the original
  14. #     script, the rewrite in Perl is more close to the original script
  15. #     meaning it also share some of the ugly parts as well.
  16. #
  17. #   - The original intention was that this script was to be a prototype
  18. #     to be the base for a new C version with full functionality. Since
  19. #     then it was decided that the Perl version should replace the
  20. #     Bourne shell version, but the Perl style still reflects the wish
  21. #     to make the Perl to C step easy.
  22. #
  23. # Some coding style from the original intent has been kept
  24. #
  25. #   - To make this Perl script easy to alter even for those that not
  26. #     code Perl that often, the coding style is as close as possible to
  27. #     the C/C++ MySQL coding standard.
  28. #
  29. #   - All lists of arguments to send to commands are Perl lists/arrays,
  30. #     not strings we append args to. Within reason, most string
  31. #     concatenation for arguments should be avoided.
  32. #
  33. #   - Functions defined in the main program are not to be prefixed,
  34. #     functions in "library files" are to be prefixed with "mtr_" (for
  35. #     Mysql-Test-Run). There are some exceptions, code that fits best in
  36. #     the main program, but are put into separate files to avoid
  37. #     clutter, may be without prefix.
  38. #
  39. #   - All stat/opendir/-f/ is to be kept in collect_test_cases(). It
  40. #     will create a struct that the rest of the program can use to get
  41. #     the information. This separates the "find information" from the
  42. #     "do the work" and makes the program more easy to maintain.
  43. #
  44. #   - At the moment, there are tons of "global" variables that control
  45. #     this script, even accessed from the files in "lib/*.pl". This
  46. #     will change over time, for now global variables are used instead
  47. #     of using %opt, %path and %exe hashes, because I want more
  48. #     compile time checking, that hashes would not give me. Once this
  49. #     script is debugged, hashes will be used and passed as parameters
  50. #     to functions, to more closely mimic how it would be coded in C
  51. #     using structs.
  52. #
  53. #   - The rule when it comes to the logic of this program is
  54. #
  55. #       command_line_setup() - is to handle the logic between flags
  56. #       collect_test_cases() - is to do its best to select what tests
  57. #                              to run, dig out options, if needs restart etc.
  58. #       run_testcase()       - is to run a single testcase, and follow the
  59. #                              logic set in both above. No, or rare file
  60. #                              system operations. If a test seems complex,
  61. #                              it should probably not be here.
  62. #
  63. # A nice way to trace the execution of this script while debugging
  64. # is to use the Devel::Trace package found at
  65. # "http://www.plover.com/~mjd/perl/Trace/" and run this script like
  66. # "perl -d:Trace mysql-test-run.pl"
  67. #
  68. # FIXME Save a PID file from this code as well, to record the process
  69. #       id we think it has. In Cygwin, a fork creates one Cygwin process,
  70. #       and then the real Win32 process. Cygwin Perl can only kill Cygwin
  71. #       processes. And "mysqld --bootstrap ..." doesn't save a PID file.
  72. $Devel::Trace::TRACE= 0;       # Don't trace boring init stuff
  73. #require 5.6.1;
  74. use File::Path;
  75. use File::Basename;
  76. use Cwd;
  77. use Getopt::Long;
  78. use Sys::Hostname;
  79. #use Carp;
  80. use IO::Socket;
  81. use IO::Socket::INET;
  82. use Data::Dumper;
  83. use strict;
  84. #use diagnostics;
  85. require "lib/mtr_cases.pl";
  86. require "lib/mtr_process.pl";
  87. require "lib/mtr_timer.pl";
  88. require "lib/mtr_io.pl";
  89. require "lib/mtr_gcov.pl";
  90. require "lib/mtr_gprof.pl";
  91. require "lib/mtr_report.pl";
  92. require "lib/mtr_diff.pl";
  93. require "lib/mtr_match.pl";
  94. require "lib/mtr_misc.pl";
  95. $Devel::Trace::TRACE= 1;
  96. # Used by gcov
  97. our @mysqld_src_dirs=
  98.   (
  99.    "strings",
  100.    "mysys",
  101.    "include",
  102.    "extra",
  103.    "regex",
  104.    "isam",
  105.    "merge",
  106.    "myisam",
  107.    "myisammrg",
  108.    "heap",
  109.    "sql",
  110.   );
  111. ##############################################################################
  112. #
  113. #  Default settings
  114. #
  115. ##############################################################################
  116. # We are to use handle_options() in "mysys/my_getopt.c" for the C version
  117. #
  118. # In the C version we want to use structs and, in some cases, arrays of
  119. # structs. We let each struct be a separate hash.
  120. # Misc global variables
  121. our $glob_win32=                  0; # OS and native Win32 executables
  122. our $glob_win32_perl=             0; # ActiveState Win32 Perl
  123. our $glob_cygwin_perl=            0; # Cygwin Perl
  124. our $glob_cygwin_shell=           undef;
  125. our $glob_mysql_test_dir=         undef;
  126. our $glob_mysql_bench_dir=        undef;
  127. our $glob_hostname=               undef;
  128. our $glob_scriptname=             undef;
  129. our $glob_timers=                 undef;
  130. our $glob_use_running_server=     0;
  131. our $glob_use_running_ndbcluster= 0;
  132. our $glob_use_embedded_server=    0;
  133. our @glob_test_mode;
  134. our $glob_basedir;
  135. # The total result
  136. our $path_charsetsdir;
  137. our $path_client_bindir;
  138. our $path_language;
  139. our $path_timefile;
  140. our $path_manager_log;           # Used by mysqldadmin
  141. our $path_slave_load_tmpdir;     # What is this?!
  142. our $path_my_basedir;
  143. our $opt_vardir;                 # A path but set directly on cmd line
  144. our $opt_tmpdir;                 # A path but set directly on cmd line
  145. our $opt_usage;
  146. our $opt_suite;
  147. our $opt_netware;
  148. our $opt_script_debug= 0;  # Script debugging, enable with --script-debug
  149. # Options FIXME not all....
  150. our $exe_master_mysqld;
  151. our $exe_mysql;
  152. our $exe_mysqladmin;
  153. our $exe_mysqlbinlog;
  154. our $exe_mysql_client_test;
  155. our $exe_mysqld;
  156. our $exe_mysqldump;              # Called from test case
  157. our $exe_mysqlimport;              # Called from test case
  158. our $exe_mysqlshow;              # Called from test case
  159. our $exe_mysql_fix_system_tables;
  160. our $exe_mysqltest;
  161. our $exe_slave_mysqld;
  162. our $opt_bench= 0;
  163. our $opt_small_bench= 0;
  164. our $opt_big_test= 0;            # Send --big-test to mysqltest
  165. our @opt_extra_mysqld_opt;
  166. our $opt_compress;
  167. our $opt_current_test;
  168. our $opt_ddd;
  169. our $opt_debug;
  170. our $opt_do_test;
  171. our @opt_cases;                  # The test cases names in argv
  172. our $opt_embedded_server;
  173. our $opt_extern;
  174. our $opt_fast;
  175. our $opt_force;
  176. our $opt_reorder;
  177. our $opt_gcov;
  178. our $opt_gcov_err;
  179. our $opt_gcov_msg;
  180. our $opt_gdb;
  181. our $opt_client_gdb;
  182. our $opt_manual_gdb;
  183. our $opt_gprof;
  184. our $opt_gprof_dir;
  185. our $opt_gprof_master;
  186. our $opt_gprof_slave;
  187. our $opt_local;
  188. our $opt_local_master;
  189. our $master;                    # Will be struct in C
  190. our $slave;
  191. our $opt_ndbcluster_port;
  192. our $opt_ndbconnectstring;
  193. our $opt_no_manager;            # Does nothing now, we never use manager
  194. our $opt_manager_port;          # Does nothing now, we never use manager
  195. our $opt_old_master;
  196. our $opt_record;
  197. our $opt_result_ext;
  198. our $opt_skip;
  199. our $opt_skip_rpl;
  200. our $opt_skip_test;
  201. our $opt_sleep;
  202. our $opt_ps_protocol;
  203. our $opt_sleep_time_after_restart=  1;
  204. our $opt_sleep_time_for_delete=    10;
  205. our $opt_testcase_timeout;
  206. our $opt_suite_timeout;
  207. my  $default_testcase_timeout=     10; # 10 min max
  208. my  $default_suite_timeout=       120; # 2 hours max
  209. our $opt_socket;
  210. our $opt_source_dist;
  211. our $opt_start_and_exit;
  212. our $opt_start_dirty;
  213. our $opt_start_from;
  214. our $opt_strace_client;
  215. our $opt_timer;
  216. our $opt_user;
  217. our $opt_user_test;
  218. our $opt_valgrind;
  219. our $opt_valgrind_mysqltest;
  220. our $opt_valgrind_all;
  221. our $opt_valgrind_options;
  222. our $opt_verbose;
  223. our $opt_wait_for_master;
  224. our $opt_wait_for_slave;
  225. our $opt_wait_timeout=  10;
  226. our $opt_warnings;
  227. our $opt_udiff;
  228. our $opt_skip_ndbcluster;
  229. our $opt_with_ndbcluster;
  230. our $opt_with_openssl;
  231. our $exe_ndb_mgm;
  232. our $path_ndb_tools_dir;
  233. our $path_ndb_backup_dir;
  234. our $file_ndb_testrun_log;
  235. our $flag_ndb_status_ok= 1;
  236. ######################################################################
  237. #
  238. #  Function declarations
  239. #
  240. ######################################################################
  241. sub main ();
  242. sub initial_setup ();
  243. sub command_line_setup ();
  244. sub executable_setup ();
  245. sub environment_setup ();
  246. sub kill_running_server ();
  247. sub kill_and_cleanup ();
  248. sub ndbcluster_support ();
  249. sub ndbcluster_install ();
  250. sub ndbcluster_start ();
  251. sub ndbcluster_stop ();
  252. sub run_benchmarks ($);
  253. sub run_tests ();
  254. sub mysql_install_db ();
  255. sub install_db ($$);
  256. sub run_testcase ($);
  257. sub report_failure_and_restart ($);
  258. sub do_before_start_master ($$);
  259. sub do_before_start_slave ($$);
  260. sub mysqld_start ($$$$);
  261. sub mysqld_arguments ($$$$$);
  262. sub stop_masters_slaves ();
  263. sub stop_masters ();
  264. sub stop_slaves ();
  265. sub run_mysqltest ($);
  266. sub usage ($);
  267. ######################################################################
  268. #
  269. #  Main program
  270. #
  271. ######################################################################
  272. main();
  273. sub main () {
  274.   initial_setup();
  275.   command_line_setup();
  276.   executable_setup();
  277.   
  278.   if (! $opt_skip_ndbcluster and ! $opt_with_ndbcluster)
  279.   {
  280.     $opt_with_ndbcluster= ndbcluster_support();
  281.   }
  282.   environment_setup();
  283.   signal_setup();
  284.   if ( $opt_gcov )
  285.   {
  286.     gcov_prepare();
  287.   }
  288.   if ( $opt_gprof )
  289.   {
  290.     gprof_prepare();
  291.   }
  292.   if ( ! $glob_use_running_server )
  293.   {
  294.     if ( $opt_start_dirty )
  295.     {
  296.       kill_running_server();
  297.     }
  298.     else
  299.     {
  300.       kill_and_cleanup();
  301.       mysql_install_db();
  302. #    mysql_loadstd();  FIXME copying from "std_data" .frm and
  303. #                      .MGR but there are none?!
  304.     }
  305.   }
  306.   if ( $opt_start_dirty )
  307.   {
  308.     if ( ndbcluster_start() )
  309.     {
  310.       mtr_error("Can't start ndbcluster");
  311.     }
  312.     if ( mysqld_start('master',0,[],[]) )
  313.     {
  314.       mtr_report("Servers started, exiting");
  315.     }
  316.     else
  317.     {
  318.       mtr_error("Can't start the mysqld server");
  319.     }
  320.   }
  321.   elsif ( $opt_bench )
  322.   {
  323.     run_benchmarks(shift);      # Shift what? Extra arguments?!
  324.   }
  325.   else
  326.   {
  327.     run_tests();
  328.   }
  329.   mtr_exit(0);
  330. }
  331. ##############################################################################
  332. #
  333. #  Initial setup independent on command line arguments
  334. #
  335. ##############################################################################
  336. sub initial_setup () {
  337.   select(STDOUT);
  338.   $| = 1;                       # Make unbuffered
  339.   $glob_scriptname=  basename($0);
  340.   $glob_win32_perl=  ($^O eq "MSWin32");
  341.   $glob_cygwin_perl= ($^O eq "cygwin");
  342.   $glob_win32=       ($glob_win32_perl or $glob_cygwin_perl);
  343.   # We require that we are in the "mysql-test" directory
  344.   # to run mysql-test-run
  345.   if (! -f $glob_scriptname)
  346.   {
  347.     mtr_error("Can't find the location for the mysql-test-run scriptn" .
  348.               "Go to to the mysql-test directory and execute the script " .
  349.               "as follows:n./$glob_scriptname");
  350.   }
  351.   if ( -d "../sql" )
  352.   {
  353.     $opt_source_dist=  1;
  354.   }
  355.   $glob_hostname=  mtr_short_hostname();
  356.   # 'basedir' is always parent of "mysql-test" directory
  357.   $glob_mysql_test_dir=  cwd();
  358.   if ( $glob_cygwin_perl )
  359.   {
  360.     # Windows programs like 'mysqld' needs Windows paths
  361.     $glob_mysql_test_dir= `cygpath -m $glob_mysql_test_dir`;
  362.     my $shell= $ENV{'SHELL'} || "/bin/bash";
  363.     $glob_cygwin_shell=   `cygpath -w $shell`; # The Windows path c:...
  364.     chomp($glob_mysql_test_dir);
  365.     chomp($glob_cygwin_shell);
  366.   }
  367.   $glob_basedir=         dirname($glob_mysql_test_dir);
  368.   $glob_mysql_bench_dir= "$glob_basedir/mysql-bench"; # FIXME make configurable
  369.   # needs to be same length to test logging (FIXME what???)
  370.   $path_slave_load_tmpdir=  "../../var/tmp";
  371.   $path_my_basedir=
  372.     $opt_source_dist ? $glob_mysql_test_dir : $glob_basedir;
  373.   $glob_timers= mtr_init_timers();
  374. }
  375. ##############################################################################
  376. #
  377. #  Default settings
  378. #
  379. ##############################################################################
  380. sub command_line_setup () {
  381.   # These are defaults for things that are set on the command line
  382.   $opt_suite=        "main";    # Special default suite
  383.   my $opt_master_myport= 9306;
  384.   my $opt_slave_myport=  9308;
  385.   $opt_ndbcluster_port=  9350;
  386.   if ( $ENV{'MTR_BUILD_THREAD'} )
  387.   {
  388.     $opt_master_myport=   $ENV{'MTR_BUILD_THREAD'} * 40 + 8120;
  389.     $opt_slave_myport=    $opt_master_myport + 16;
  390.     $opt_ndbcluster_port= $opt_master_myport + 24;
  391.   }
  392.   # Read the command line
  393.   # Note: Keep list, and the order, in sync with usage at end of this file
  394.   Getopt::Long::Configure("pass_through");
  395.   GetOptions(
  396.              # Control what engine/variation to run
  397.              'embedded-server'          => $opt_embedded_server,
  398.              'ps-protocol'              => $opt_ps_protocol,
  399.              'bench'                    => $opt_bench,
  400.              'small-bench'              => $opt_small_bench,
  401.              'no-manager'               => $opt_no_manager, # Currently not used
  402.              # Control what test suites or cases to run
  403.              'force'                    => $opt_force,
  404.              'with-ndbcluster'          => $opt_with_ndbcluster,
  405.              'skip-ndbcluster|skip-ndb' => $opt_skip_ndbcluster,
  406.              'do-test=s'                => $opt_do_test,
  407.              'suite=s'                  => $opt_suite,
  408.              'skip-rpl'                 => $opt_skip_rpl,
  409.              'skip-test=s'              => $opt_skip_test,
  410.              # Specify ports
  411.              'master_port=i'            => $opt_master_myport,
  412.              'slave_port=i'             => $opt_slave_myport,
  413.              'ndbcluster_port=i'        => $opt_ndbcluster_port,
  414.              'manager-port=i'           => $opt_manager_port, # Currently not used
  415.              # Test case authoring
  416.              'record'                   => $opt_record,
  417.              # ???
  418.              'mysqld=s'                 => @opt_extra_mysqld_opt,
  419.              # Run test on running server
  420.              'extern'                   => $opt_extern,
  421.              'ndbconnectstring=s'       => $opt_ndbconnectstring,
  422.              # Debugging
  423.              'gdb'                      => $opt_gdb,
  424.              'manual-gdb'               => $opt_manual_gdb,
  425.              'client-gdb'               => $opt_client_gdb,
  426.              'ddd'                      => $opt_ddd,
  427.              'strace-client'            => $opt_strace_client,
  428.              'master-binary=s'          => $exe_master_mysqld,
  429.              'slave-binary=s'           => $exe_slave_mysqld,
  430.              # Coverage, profiling etc
  431.              'gcov'                     => $opt_gcov,
  432.              'gprof'                    => $opt_gprof,
  433.              'valgrind:s'               => $opt_valgrind,
  434.              'valgrind-mysqltest:s'     => $opt_valgrind_mysqltest,
  435.              'valgrind-all:s'           => $opt_valgrind_all,
  436.              'valgrind-options=s'       => $opt_valgrind_options,
  437.              # Misc
  438.              'big-test'                 => $opt_big_test,
  439.              'compress'                 => $opt_compress,
  440.              'debug'                    => $opt_debug,
  441.              'fast'                     => $opt_fast,
  442.              'local'                    => $opt_local,
  443.              'local-master'             => $opt_local_master,
  444.              'netware'                  => $opt_netware,
  445.              'old-master'               => $opt_old_master,
  446.              'reorder'                  => $opt_reorder,
  447.              'script-debug'             => $opt_script_debug,
  448.              'sleep=i'                  => $opt_sleep,
  449.              'socket=s'                 => $opt_socket,
  450.              'start-dirty'              => $opt_start_dirty,
  451.              'start-and-exit'           => $opt_start_and_exit,
  452.              'start-from=s'             => $opt_start_from,
  453.              'timer'                    => $opt_timer,
  454.              'tmpdir=s'                 => $opt_tmpdir,
  455.              'unified-diff|udiff'       => $opt_udiff,
  456.              'user-test=s'              => $opt_user_test,
  457.              'user=s'                   => $opt_user,
  458.              'vardir=s'                 => $opt_vardir,
  459.              'verbose'                  => $opt_verbose,
  460.              'wait-timeout=i'           => $opt_wait_timeout,
  461.              'testcase-timeout=i'       => $opt_testcase_timeout,
  462.              'suite-timeout=i'          => $opt_suite_timeout,
  463.              'warnings|log-warnings'    => $opt_warnings,
  464.              'with-openssl'             => $opt_with_openssl,
  465.              'help|h'                   => $opt_usage,
  466.             ) or usage("Can't read options");
  467.   if ( $opt_usage )
  468.   {
  469.     usage("");
  470.   }
  471.   foreach my $arg ( @ARGV )
  472.   {
  473.     if ( $arg =~ /^--skip-/ )
  474.     {
  475.       push(@opt_extra_mysqld_opt, $arg);
  476.     }
  477.     elsif ( $arg =~ /^-/ )
  478.     {
  479.       usage("Invalid option "$arg"");
  480.     }
  481.     else
  482.     {
  483.       push(@opt_cases, $arg);
  484.     }
  485.   }
  486.   # --------------------------------------------------------------------------
  487.   # Set the "var/" directory, as it is the base for everything else
  488.   # --------------------------------------------------------------------------
  489.   if ( ! $opt_vardir )
  490.   {
  491.     $opt_vardir= "$glob_mysql_test_dir/var";
  492.   }
  493.   # We make the path absolute, as the server will do a chdir() before usage
  494.   unless ( $opt_vardir =~ m,^/, or
  495.            ($glob_win32 and $opt_vardir =~ m,^[a-z]:/,i) )
  496.   {
  497.     # Make absolute path, relative test dir
  498.     $opt_vardir= "$glob_mysql_test_dir/$opt_vardir";
  499.   }
  500.   # --------------------------------------------------------------------------
  501.   # If not set, set these to defaults
  502.   # --------------------------------------------------------------------------
  503.   $opt_tmpdir=       "$opt_vardir/tmp" unless $opt_tmpdir;
  504.   # FIXME maybe not needed?
  505.   $path_manager_log= "$opt_vardir/log/manager.log"
  506.     unless $path_manager_log;
  507.   $opt_current_test= "$opt_vardir/log/current_test"
  508.     unless $opt_current_test;
  509.   # --------------------------------------------------------------------------
  510.   # Do sanity checks of command line arguments
  511.   # --------------------------------------------------------------------------
  512.   if ( $opt_extern and $opt_local )
  513.   {
  514.     mtr_error("Can't use --extern and --local at the same time");
  515.   }
  516.   if ( ! $opt_socket )
  517.   {     # FIXME set default before reading options?
  518. #    $opt_socket=  '@MYSQL_UNIX_ADDR@';
  519.     $opt_socket=  "/tmp/mysql.sock"; # FIXME
  520.   }
  521.   # --------------------------------------------------------------------------
  522.   # Look at the command line options and set script flags
  523.   # --------------------------------------------------------------------------
  524.   if ( $opt_record and ! @opt_cases )
  525.   {
  526.     mtr_error("Will not run in record mode without a specific test case");
  527.   }
  528.   if ( $opt_embedded_server )
  529.   {
  530.     $glob_use_embedded_server= 1;
  531.     push(@glob_test_mode, "embedded");
  532.     $opt_skip_rpl= 1;              # We never run replication with embedded
  533.     if ( $opt_extern )
  534.     {
  535.       mtr_error("Can't use --extern with --embedded-server");
  536.     }
  537.   }
  538.   if ( $opt_ps_protocol )
  539.   {
  540.     push(@glob_test_mode, "ps-protocol");
  541.   }
  542.   # FIXME don't understand what this is
  543. #  if ( $opt_local_master )
  544. #  {
  545. #    $opt_master_myport=  3306;
  546. #  }
  547.   if ( $opt_small_bench )
  548.   {
  549.     $opt_bench=  1;
  550.   }
  551.   if ( $opt_sleep )
  552.   {
  553.     $opt_sleep_time_after_restart= $opt_sleep;
  554.   }
  555.   if ( $opt_gcov and ! $opt_source_dist )
  556.   {
  557.     mtr_error("Coverage test needs the source - please use source dist");
  558.   }
  559.   if ( $opt_gdb )
  560.   {
  561.     $opt_wait_timeout=  300;
  562.     if ( $opt_extern )
  563.     {
  564.       mtr_error("Can't use --extern with --gdb");
  565.     }
  566.   }
  567.   if ( $opt_manual_gdb )
  568.   {
  569.     $opt_gdb=  1;
  570.     if ( $opt_extern )
  571.     {
  572.       mtr_error("Can't use --extern with --manual-gdb");
  573.     }
  574.   }
  575.   if ( $opt_ddd )
  576.   {
  577.     if ( $opt_extern )
  578.     {
  579.       mtr_error("Can't use --extern with --ddd");
  580.     }
  581.   }
  582.   if ( $opt_ndbconnectstring )
  583.   {
  584.     $glob_use_running_ndbcluster= 1;
  585.     $opt_with_ndbcluster= 1;
  586.   }
  587.   else
  588.   {
  589.     $opt_ndbconnectstring= "host=localhost:$opt_ndbcluster_port";
  590.   }
  591.   if ( $opt_skip_ndbcluster )
  592.   {
  593.     $opt_with_ndbcluster= 0;
  594.   }
  595.   # The ":s" in the argument spec, means we have three different cases
  596.   #
  597.   #   undefined    option not set
  598.   #   ""           option set with no argument
  599.   #   "somestring" option is name/path of valgrind executable
  600.   # Take executable path from any of them, if any
  601.   $opt_valgrind= $opt_valgrind_mysqltest if $opt_valgrind_mysqltest;
  602.   $opt_valgrind= $opt_valgrind_all       if $opt_valgrind_all;
  603.   # If valgrind flag not defined, define if other valgrind flags are
  604.   unless ( defined $opt_valgrind )
  605.   {
  606.     $opt_valgrind= ""
  607.       if defined $opt_valgrind_mysqltest or defined $opt_valgrind_all;
  608.   }
  609.   if ( ! $opt_testcase_timeout )
  610.   {
  611.     $opt_testcase_timeout= $default_testcase_timeout;
  612.     $opt_testcase_timeout*= 10 if defined $opt_valgrind;
  613.   }
  614.   if ( ! $opt_suite_timeout )
  615.   {
  616.     $opt_suite_timeout= $default_suite_timeout;
  617.     $opt_suite_timeout*= 4 if defined $opt_valgrind;
  618.   }
  619.   if ( defined $opt_valgrind )
  620.   {
  621.     $opt_sleep_time_after_restart= 10;
  622.     $opt_sleep_time_for_delete= 60;
  623.     # >=2.1.2 requires the --tool option, some versions write to stdout, some to stderr
  624.     #  valgrind --help 2>&1 | grep "--tool" > /dev/null && VALGRIND="$VALGRIND --tool=memcheck"
  625.   }
  626.   if ( ! $opt_user )
  627.   {
  628.     if ( $glob_use_running_server )
  629.     {
  630.       $opt_user= "test";
  631.     }
  632.     else
  633.     {
  634.       $opt_user= "root"; # We want to do FLUSH xxx commands
  635.     }
  636.   }
  637.   # Put this into a hash, will be a C struct
  638.   $master->[0]=
  639.   {
  640.    path_myddir   => "$opt_vardir/master-data",
  641.    path_myerr    => "$opt_vardir/log/master.err",
  642.    path_mylog    => "$opt_vardir/log/master.log",
  643.    path_mypid    => "$opt_vardir/run/master.pid",
  644.    path_mysock   => "$opt_tmpdir/master.sock",
  645.    path_myport   =>  $opt_master_myport,
  646.    start_timeout =>  400, # enough time create innodb tables
  647.    ndbcluster    =>  1, # ndbcluster not started
  648.   };
  649.   $master->[1]=
  650.   {
  651.    path_myddir   => "$opt_vardir/master1-data",
  652.    path_myerr    => "$opt_vardir/log/master1.err",
  653.    path_mylog    => "$opt_vardir/log/master1.log",
  654.    path_mypid    => "$opt_vardir/run/master1.pid",
  655.    path_mysock   => "$opt_tmpdir/master1.sock",
  656.    path_myport   => $opt_master_myport + 1,
  657.    start_timeout => 400, # enough time create innodb tables
  658.   };
  659.   $slave->[0]=
  660.   {
  661.    path_myddir   => "$opt_vardir/slave-data",
  662.    path_myerr    => "$opt_vardir/log/slave.err",
  663.    path_mylog    => "$opt_vardir/log/slave.log",
  664.    path_mypid    => "$opt_vardir/run/slave.pid",
  665.    path_mysock   => "$opt_tmpdir/slave.sock",
  666.    path_myport   => $opt_slave_myport,
  667.    start_timeout => 400,
  668.   };
  669.   $slave->[1]=
  670.   {
  671.    path_myddir   => "$opt_vardir/slave1-data",
  672.    path_myerr    => "$opt_vardir/log/slave1.err",
  673.    path_mylog    => "$opt_vardir/log/slave1.log",
  674.    path_mypid    => "$opt_vardir/run/slave1.pid",
  675.    path_mysock   => "$opt_tmpdir/slave1.sock",
  676.    path_myport   => $opt_slave_myport + 1,
  677.    start_timeout => 300,
  678.   };
  679.   $slave->[2]=
  680.   {
  681.    path_myddir   => "$opt_vardir/slave2-data",
  682.    path_myerr    => "$opt_vardir/log/slave2.err",
  683.    path_mylog    => "$opt_vardir/log/slave2.log",
  684.    path_mypid    => "$opt_vardir/run/slave2.pid",
  685.    path_mysock   => "$opt_tmpdir/slave2.sock",
  686.    path_myport   => $opt_slave_myport + 2,
  687.    start_timeout => 300,
  688.   };
  689.   if ( $opt_extern )
  690.   {
  691.     $glob_use_running_server=  1;
  692.     $opt_skip_rpl= 1;                   # We don't run rpl test cases
  693.     $master->[0]->{'path_mysock'}=  $opt_socket;
  694.   }
  695.   $path_timefile=  "$opt_vardir/log/mysqltest-time";
  696. }
  697. ##############################################################################
  698. #
  699. #  Set paths to various executable programs
  700. #
  701. ##############################################################################
  702. sub executable_setup () {
  703.   if ( $opt_source_dist )
  704.   {
  705.     if ( $glob_win32 )
  706.     {
  707.       $path_client_bindir= mtr_path_exists("$glob_basedir/client_release",
  708.                                            "$glob_basedir/bin");
  709.       $exe_mysqld=         mtr_exe_exists ("$path_client_bindir/mysqld-nt",
  710.                                            "$path_client_bindir/mysqld",
  711.                                            "$path_client_bindir/mysqld-debug",);
  712.       $path_language=      mtr_path_exists("$glob_basedir/share/english/");
  713.       $path_charsetsdir=   mtr_path_exists("$glob_basedir/share/charsets");
  714.     }
  715.     else
  716.     {
  717.       $path_client_bindir= mtr_path_exists("$glob_basedir/client");
  718.       $exe_mysqld=         mtr_exe_exists ("$glob_basedir/sql/mysqld");
  719.       $path_language=      mtr_path_exists("$glob_basedir/sql/share/english/");
  720.       $path_charsetsdir=   mtr_path_exists("$glob_basedir/sql/share/charsets");
  721.     }
  722.     if ( $glob_use_embedded_server )
  723.     {
  724.       my $path_examples= "$glob_basedir/libmysqld/examples";
  725.       $exe_mysqltest=    mtr_exe_exists("$path_examples/mysqltest_embedded");
  726.       $exe_mysql_client_test=
  727.         mtr_exe_exists("$path_examples/mysql_client_test_embedded",
  728.        "/usr/bin/false");
  729.     }
  730.     else
  731.     {
  732.       $exe_mysqltest=  mtr_exe_exists("$path_client_bindir/mysqltest");
  733.       $exe_mysql_client_test=
  734.         mtr_exe_exists("$glob_basedir/tests/mysql_client_test",
  735.        "/usr/bin/false");
  736.     }
  737.     $exe_mysqldump=      mtr_exe_exists("$path_client_bindir/mysqldump");
  738.     $exe_mysqlimport=    mtr_exe_exists("$path_client_bindir/mysqlimport");
  739.     $exe_mysqlshow=      mtr_exe_exists("$path_client_bindir/mysqlshow");
  740.     $exe_mysqlbinlog=    mtr_exe_exists("$path_client_bindir/mysqlbinlog");
  741.     $exe_mysqladmin=     mtr_exe_exists("$path_client_bindir/mysqladmin");
  742.     $exe_mysql=          mtr_exe_exists("$path_client_bindir/mysql");
  743.     $exe_mysql_fix_system_tables=
  744.       mtr_script_exists("$glob_basedir/scripts/mysql_fix_privilege_tables");
  745.     $path_ndb_tools_dir= mtr_path_exists("$glob_basedir/ndb/tools");
  746.     $exe_ndb_mgm=        "$glob_basedir/ndb/src/mgmclient/ndb_mgm";
  747.   }
  748.   else
  749.   {
  750.     $path_client_bindir= mtr_path_exists("$glob_basedir/bin");
  751.     $exe_mysqldump=      mtr_exe_exists("$path_client_bindir/mysqldump");
  752.     $exe_mysqlimport=    mtr_exe_exists("$path_client_bindir/mysqlimport");
  753.     $exe_mysqlshow=      mtr_exe_exists("$path_client_bindir/mysqlshow");
  754.     $exe_mysqlbinlog=    mtr_exe_exists("$path_client_bindir/mysqlbinlog");
  755.     $exe_mysqladmin=     mtr_exe_exists("$path_client_bindir/mysqladmin");
  756.     $exe_mysql=          mtr_exe_exists("$path_client_bindir/mysql");
  757.     $exe_mysql_fix_system_tables=
  758.       mtr_script_exists("$path_client_bindir/mysql_fix_privilege_tables",
  759. "$glob_basedir/scripts/mysql_fix_privilege_tables");
  760.     $path_language=      mtr_path_exists("$glob_basedir/share/mysql/english/",
  761.                                          "$glob_basedir/share/english/");
  762.     $path_charsetsdir=   mtr_path_exists("$glob_basedir/share/mysql/charsets",
  763.                                          "$glob_basedir/share/charsets");
  764.     if ( $glob_win32 )
  765.     {
  766.       $exe_mysqld=         mtr_exe_exists ("$glob_basedir/bin/mysqld-nt",
  767.                                            "$glob_basedir/bin/mysqld",
  768.                                            "$glob_basedir/bin/mysqld-debug",);
  769.     }
  770.     else
  771.     {
  772.       $exe_mysqld=         mtr_exe_exists ("$glob_basedir/libexec/mysqld",
  773.                                            "$glob_basedir/bin/mysqld");
  774.     }
  775.     if ( $glob_use_embedded_server )
  776.     {
  777.       $exe_mysqltest= mtr_exe_exists("$path_client_bindir/mysqltest_embedded");
  778.       $exe_mysql_client_test=
  779.         mtr_exe_exists("$glob_basedir/tests/mysql_client_test_embedded",
  780.                        "$path_client_bindir/mysql_client_test_embedded",
  781.        "/usr/bin/false");
  782.     }
  783.     else
  784.     {
  785.       $exe_mysqltest= mtr_exe_exists("$path_client_bindir/mysqltest");
  786.       $exe_mysql_client_test=
  787.         mtr_exe_exists("$path_client_bindir/mysql_client_test",
  788.        "/usr/bin/false"); # FIXME temporary
  789.     }
  790.     $path_ndb_tools_dir=  "$glob_basedir/bin";
  791.     $exe_ndb_mgm=         "$glob_basedir/bin/ndb_mgm";
  792.   }
  793.   $exe_master_mysqld= $exe_master_mysqld || $exe_mysqld;
  794.   $exe_slave_mysqld=  $exe_slave_mysqld  || $exe_mysqld;
  795.   $path_ndb_backup_dir=
  796.     "$opt_vardir/ndbcluster-$opt_ndbcluster_port";
  797.   $file_ndb_testrun_log= "$opt_vardir/log/ndb_testrun.log";
  798. }
  799. ##############################################################################
  800. #
  801. #  Set environment to be used by childs of this process
  802. #
  803. ##############################################################################
  804. # Note that some env is setup in spawn/run, in "mtr_process.pl"
  805. sub environment_setup () {
  806.   # --------------------------------------------------------------------------
  807.   # We might not use a standard installation directory, like /usr/lib.
  808.   # Set LD_LIBRARY_PATH to make sure we find our installed libraries.
  809.   # --------------------------------------------------------------------------
  810.   unless ( $opt_source_dist )
  811.   {
  812.     $ENV{'LD_LIBRARY_PATH'}=
  813.       "$glob_basedir/lib" .
  814.         ($ENV{'LD_LIBRARY_PATH'} ? ":$ENV{'LD_LIBRARY_PATH'}" : "");
  815.     $ENV{'DYLD_LIBRARY_PATH'}=
  816.       "$glob_basedir/lib" .
  817.         ($ENV{'DYLD_LIBRARY_PATH'} ? ":$ENV{'DYLD_LIBRARY_PATH'}" : "");
  818.   }
  819.   # --------------------------------------------------------------------------
  820.   # Also command lines in .opt files may contain env vars
  821.   # --------------------------------------------------------------------------
  822.   $ENV{'UMASK'}=              "0660"; # The octal *string*
  823.   $ENV{'UMASK_DIR'}=          "0770"; # The octal *string*
  824.   $ENV{'LC_COLLATE'}=         "C";
  825.   $ENV{'USE_RUNNING_SERVER'}= $glob_use_running_server;
  826.   $ENV{'MYSQL_TEST_DIR'}=     $glob_mysql_test_dir;
  827.   $ENV{'MYSQL_TEST_WINDIR'}=  $glob_mysql_test_dir;
  828.   $ENV{'MASTER_MYSOCK'}=      $master->[0]->{'path_mysock'};
  829.   $ENV{'MASTER_WINMYSOCK'}=   $master->[0]->{'path_mysock'};
  830.   $ENV{'MASTER_MYSOCK1'}=     $master->[1]->{'path_mysock'};
  831.   $ENV{'MASTER_MYPORT'}=      $master->[0]->{'path_myport'};
  832.   $ENV{'MASTER_MYPORT1'}=     $master->[1]->{'path_myport'};
  833.   $ENV{'SLAVE_MYPORT'}=       $slave->[0]->{'path_myport'};
  834. # $ENV{'MYSQL_TCP_PORT'}=     '@MYSQL_TCP_PORT@'; # FIXME
  835.   $ENV{'MYSQL_TCP_PORT'}=     3306;
  836.   if ( $glob_cygwin_perl )
  837.   {
  838.     foreach my $key ('MYSQL_TEST_WINDIR','MASTER_MYSOCK')
  839.     {
  840.       $ENV{$key}= `cygpath -w $ENV{$key}`;
  841.       $ENV{$key} =~ s,\,\\,g;
  842.       chomp($ENV{$key});
  843.     }
  844.   }
  845.   # We are nice and report a bit about our settings
  846.   print "Using MTR_BUILD_THREAD = ",$ENV{MTR_BUILD_THREAD} || 0,"n";
  847.   print "Using MASTER_MYPORT    = $ENV{MASTER_MYPORT}n";
  848.   print "Using MASTER_MYPORT1   = $ENV{MASTER_MYPORT1}n";
  849.   print "Using SLAVE_MYPORT     = $ENV{SLAVE_MYPORT}n";
  850.   print "Using NDBCLUSTER_PORT  = $opt_ndbcluster_portn";
  851. }
  852. ##############################################################################
  853. #
  854. #  If we get a ^C, we try to clean up before termination
  855. #
  856. ##############################################################################
  857. # FIXME check restrictions what to do in a signal handler
  858. sub signal_setup () {
  859.   $SIG{INT}= &handle_int_signal;
  860. }
  861. sub handle_int_signal () {
  862.   $SIG{INT}= 'DEFAULT';         # If we get a ^C again, we die...
  863.   mtr_warning("got INT signal, cleaning up.....");
  864.   stop_masters_slaves();
  865.   mtr_error("We die from ^C signal from user");
  866. }
  867. ##############################################################################
  868. #
  869. #  Handle left overs from previous runs
  870. #
  871. ##############################################################################
  872. sub kill_running_server () {
  873.   if ( $opt_fast or $glob_use_embedded_server )
  874.   {
  875.     # FIXME is embedded server really using PID files?!
  876.     unlink($master->[0]->{'path_mypid'});
  877.     unlink($master->[1]->{'path_mypid'});
  878.     unlink($slave->[0]->{'path_mypid'});
  879.     unlink($slave->[1]->{'path_mypid'});
  880.     unlink($slave->[2]->{'path_mypid'});
  881.   }
  882.   else
  883.   {
  884.     # Ensure that no old mysqld test servers are running
  885.     # This is different from terminating processes we have
  886.     # started from ths run of the script, this is terminating
  887.     # leftovers from previous runs.
  888.     mtr_report("Killing Possible Leftover Processes");
  889.     mkpath("$opt_vardir/log"); # Needed for mysqladmin log
  890.     mtr_kill_leftovers();
  891.     ndbcluster_stop();
  892.     $master->[0]->{'ndbcluster'}= 1;
  893.   }
  894. }
  895. sub kill_and_cleanup () {
  896.   kill_running_server ();
  897.   mtr_report("Removing Stale Files");
  898.   rmtree("$opt_vardir/log");
  899.   rmtree("$opt_vardir/ndbcluster-$opt_ndbcluster_port");
  900.   rmtree("$opt_vardir/run");
  901.   rmtree("$opt_vardir/tmp");
  902.   mkpath("$opt_vardir/log");
  903.   mkpath("$opt_vardir/run");
  904.   mkpath("$opt_vardir/tmp");
  905.   mkpath($opt_tmpdir) if $opt_tmpdir ne "$opt_vardir/tmp";
  906.   # FIXME do we really need to create these all, or are they
  907.   # created for us when tables are created?
  908.   my @data_dir_lst = (
  909.     $master->[0]->{'path_myddir'},
  910.     $master->[1]->{'path_myddir'},
  911.     $slave->[0]->{'path_myddir'},
  912.     $slave->[1]->{'path_myddir'},
  913.     $slave->[2]->{'path_myddir'});
  914.   
  915.   foreach my $data_dir (@data_dir_lst)
  916.   {
  917.     rmtree("$data_dir");
  918.     mkpath("$data_dir/mysql");
  919.     mkpath("$data_dir/test");
  920.   }
  921.   # To make some old test cases work, we create a soft
  922.   # link from the old "var" location to the new one
  923.   if ( ! $glob_win32 and $opt_vardir ne "$glob_mysql_test_dir/var" )
  924.   {
  925.     # FIXME why bother with the above, why not always remove all of var?!
  926.     rmtree("$glob_mysql_test_dir/var"); # Clean old var, FIXME or rename it?!
  927.     symlink($opt_vardir, "$glob_mysql_test_dir/var");
  928.   }
  929. }
  930. ##############################################################################
  931. #
  932. #  Start the ndb cluster
  933. #
  934. ##############################################################################
  935. sub ndbcluster_support () {
  936.   # check ndbcluster support by testing using a switch
  937.   # that is only available in that case
  938.   if ( mtr_run($exe_mysqld,
  939.        ["--no-defaults",
  940.         "--ndb-use-exact-count",
  941.         "--help"],
  942.        "", "/dev/null", "/dev/null", "") != 0 )
  943.   {
  944.     mtr_report("No ndbcluster support");
  945.     return 0;
  946.   }
  947.   mtr_report("Has ndbcluster support");
  948.   return 1;
  949. }
  950. # FIXME why is there a different start below?!
  951. sub ndbcluster_install () {
  952.   if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
  953.   {
  954.     return 0;
  955.   }
  956.   mtr_report("Install ndbcluster");
  957.   my $ndbcluster_opts=  $opt_bench ? "" : "--small";
  958.   my $ndbcluster_port_base= $opt_ndbcluster_port + 2;
  959.   if (  mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
  960. ["--port=$opt_ndbcluster_port",
  961.  "--port-base=$ndbcluster_port_base",
  962.  "--data-dir=$opt_vardir",
  963.  $ndbcluster_opts,
  964.  "--initial"],
  965. "", "", "", "") )
  966.   {
  967.     mtr_error("Error ndbcluster_install");
  968.     return 1;
  969.   }
  970.   ndbcluster_stop();
  971.   $master->[0]->{'ndbcluster'}= 1;
  972.   return 0;
  973. }
  974. sub ndbcluster_start () {
  975.   if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
  976.   {
  977.     return 0;
  978.   }
  979.   # FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null
  980.   if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
  981.        ["--port=$opt_ndbcluster_port",
  982. "--data-dir=$opt_vardir"],
  983.        "", "/dev/null", "", "") )
  984.   {
  985.     mtr_error("Error ndbcluster_start");
  986.     return 1;
  987.   }
  988.   return 0;
  989. }
  990. sub ndbcluster_stop () {
  991.   if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
  992.   {
  993.     return;
  994.   }
  995.   my $ndbcluster_port_base= $opt_ndbcluster_port + 2;
  996.   # FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null
  997.   mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
  998.           ["--port=$opt_ndbcluster_port",
  999.            "--data-dir=$opt_vardir",
  1000.            "--stop"],
  1001.           "", "/dev/null", "", "");
  1002.   return;
  1003. }
  1004. ##############################################################################
  1005. #
  1006. #  Run the benchmark suite
  1007. #
  1008. ##############################################################################
  1009. sub run_benchmarks ($) {
  1010.   my $benchmark=  shift;
  1011.   my $args;
  1012.   if ( ! $glob_use_embedded_server and ! $opt_local_master )
  1013.   {
  1014.     $master->[0]->{'pid'}= mysqld_start('master',0,[],[]);
  1015.     if ( ! $master->[0]->{'pid'} )
  1016.     {
  1017.       mtr_error("Can't start the mysqld server");
  1018.     }
  1019.   }
  1020.   mtr_init_args($args);
  1021.   mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'});
  1022.   mtr_add_arg($args, "--user=%s", $opt_user);
  1023.   if ( $opt_small_bench )
  1024.   {
  1025.     mtr_add_arg($args, "--small-test");
  1026.     mtr_add_arg($args, "--small-tables");
  1027.   }
  1028.   if ( $opt_with_ndbcluster )
  1029.   {
  1030.     mtr_add_arg($args, "--create-options=TYPE=ndb");
  1031.   }
  1032.   my $benchdir=  "$glob_basedir/sql-bench";
  1033.   chdir($benchdir);             # FIXME check error
  1034.   # FIXME write shorter....
  1035.   if ( ! $benchmark )
  1036.   {
  1037.     mtr_add_arg($args, "--log");
  1038.     mtr_run("$glob_mysql_bench_dir/run-all-tests", $args, "", "", "", "");
  1039.     # FIXME check result code?!
  1040.   }
  1041.   elsif ( -x $benchmark )
  1042.   {
  1043.     mtr_run("$glob_mysql_bench_dir/$benchmark", $args, "", "", "", "");
  1044.     # FIXME check result code?!
  1045.   }
  1046.   else
  1047.   {
  1048.     mtr_error("Benchmark $benchmark not found");
  1049.   }
  1050.   chdir($glob_mysql_test_dir);          # Go back
  1051.   if ( ! $glob_use_embedded_server )
  1052.   {
  1053.     stop_masters();
  1054.   }
  1055. }
  1056. ##############################################################################
  1057. #
  1058. #  Run the test suite
  1059. #
  1060. ##############################################################################
  1061. # FIXME how to specify several suites to run? Comma separated list?
  1062. sub run_tests () {
  1063.   run_suite($opt_suite);
  1064. }
  1065. sub run_suite () {
  1066.   my $suite= shift;
  1067.   mtr_print_thick_line();
  1068.   mtr_report("Finding  Tests in the '$suite' suite");
  1069.   mtr_timer_start($glob_timers,"suite", 60 * $opt_suite_timeout);
  1070.   my $tests= collect_test_cases($suite);
  1071.   mtr_report("Starting Tests in the '$suite' suite");
  1072.   mtr_print_header();
  1073.   foreach my $tinfo ( @$tests )
  1074.   {
  1075.     mtr_timer_start($glob_timers,"testcase", 60 * $opt_testcase_timeout);
  1076.     run_testcase($tinfo);
  1077.     mtr_timer_stop($glob_timers,"testcase");
  1078.   }
  1079.   mtr_print_line();
  1080.   if ( ! $opt_gdb and ! $glob_use_running_server and
  1081.        ! $opt_ddd and ! $glob_use_embedded_server )
  1082.   {
  1083.     stop_masters_slaves();
  1084.   }
  1085.   if ( $opt_gcov )
  1086.   {
  1087.     gcov_collect(); # collect coverage information
  1088.   }
  1089.   if ( $opt_gprof )
  1090.   {
  1091.     gprof_collect(); # collect coverage information
  1092.   }
  1093.   mtr_report_stats($tests);
  1094.   mtr_timer_stop($glob_timers,"suite");
  1095. }
  1096. ##############################################################################
  1097. #
  1098. #  Initiate the test databases
  1099. #
  1100. ##############################################################################
  1101. sub mysql_install_db () {
  1102.   # FIXME not exactly true I think, needs improvements
  1103.   install_db('master', $master->[0]->{'path_myddir'});
  1104.   install_db('master', $master->[1]->{'path_myddir'});
  1105.   install_db('slave',  $slave->[0]->{'path_myddir'});
  1106.   install_db('slave',  $slave->[1]->{'path_myddir'});
  1107.   install_db('slave',  $slave->[2]->{'path_myddir'});
  1108.   if ( ndbcluster_install() )
  1109.   {
  1110.     # failed to install, disable usage but flag that its no ok
  1111.     $opt_with_ndbcluster= 0;
  1112.     $flag_ndb_status_ok= 0;
  1113.   }
  1114.   return 0;
  1115. }
  1116. sub install_db ($$) {
  1117.   my $type=      shift;
  1118.   my $data_dir=  shift;
  1119.   my $init_db_sql=     "lib/init_db.sql";
  1120.   my $init_db_sql_tmp= "/tmp/init_db.sql$$";
  1121.   my $args;
  1122.   mtr_report("Installing u$type Databases");
  1123.   open(IN, $init_db_sql)
  1124.     or mtr_error("Can't open $init_db_sql: $!");
  1125.   open(OUT, ">", $init_db_sql_tmp)
  1126.     or mtr_error("Can't write to $init_db_sql_tmp: $!");
  1127.   while (<IN>)
  1128.   {
  1129.     chomp;
  1130.     s/@HOSTNAME@/$glob_hostname/;
  1131.     if ( /^s*$/ )
  1132.     {
  1133.       print OUT "n";
  1134.     }
  1135.     elsif (/;$/)
  1136.     {
  1137.       print OUT "$_n";
  1138.     }
  1139.     else
  1140.     {
  1141.       print OUT "$_ ";
  1142.     }
  1143.   }
  1144.   close OUT;
  1145.   close IN;
  1146.   mtr_init_args($args);
  1147.   mtr_add_arg($args, "--no-defaults");
  1148.   mtr_add_arg($args, "--bootstrap");
  1149.   mtr_add_arg($args, "--console");
  1150.   mtr_add_arg($args, "--skip-grant-tables");
  1151.   mtr_add_arg($args, "--basedir=%s", $path_my_basedir);
  1152.   mtr_add_arg($args, "--datadir=%s", $data_dir);
  1153.   mtr_add_arg($args, "--skip-innodb");
  1154.   mtr_add_arg($args, "--skip-ndbcluster");
  1155.   mtr_add_arg($args, "--skip-bdb");
  1156.   if ( ! $opt_netware )
  1157.   {
  1158.     mtr_add_arg($args, "--language=%s", $path_language);
  1159.     mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
  1160.   }
  1161.   if ( mtr_run($exe_mysqld, $args, $init_db_sql_tmp,
  1162.                $path_manager_log, $path_manager_log, "") != 0 )
  1163.   {
  1164.     unlink($init_db_sql_tmp);
  1165.     mtr_error("Error executing mysqld --bootstrapn" .
  1166.               "Could not install $type test DBs");
  1167.   }
  1168.   unlink($init_db_sql_tmp);
  1169. }
  1170. ##############################################################################
  1171. #
  1172. #  Run a single test case
  1173. #
  1174. ##############################################################################
  1175. # When we get here, we have already filtered out test cases that doesn't
  1176. # apply to the current setup, for example if we use a running server, test
  1177. # cases that restart the server are dropped. So this function should mostly
  1178. # be about doing things, not a lot of logic.
  1179. # We don't start and kill the servers for each testcase. But some
  1180. # testcases needs a restart, because they specify options to start
  1181. # mysqld with. After that testcase, we need to restart again, to set
  1182. # back the normal options.
  1183. sub run_testcase ($) {
  1184.   my $tinfo=  shift;
  1185.   my $tname= $tinfo->{'name'};
  1186.   mtr_tonewfile($opt_current_test,"$tnamen"); # Always tell where we are
  1187.   # output current test to ndbcluster log file to enable diagnostics
  1188.   mtr_tofile($file_ndb_testrun_log,"CURRENT TEST $tnamen");
  1189.   # ----------------------------------------------------------------------
  1190.   # If marked to skip, just print out and return.
  1191.   # Note that a test case not marked as 'skip' can still be
  1192.   # skipped later, because of the test case itself in cooperation
  1193.   # with the mysqltest program tells us so.
  1194.   # ----------------------------------------------------------------------
  1195.   if ( $tinfo->{'skip'} )
  1196.   {
  1197.     mtr_report_test_name($tinfo);
  1198.     mtr_report_test_skipped($tinfo);
  1199.     return;
  1200.   }
  1201.   # ----------------------------------------------------------------------
  1202.   # If not using a running servers we may need to stop and restart.
  1203.   # We restart in the case we have initiation scripts, server options
  1204.   # etc to run. But we also restart again after the test first restart
  1205.   # and test is run, to get back to normal server settings.
  1206.   #
  1207.   # To make the code a bit more clean, we actually only stop servers
  1208.   # here, and mark this to be done. Then a generic "start" part will
  1209.   # start up the needed servers again.
  1210.   # ----------------------------------------------------------------------
  1211.   if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
  1212.   {
  1213.     if ( $tinfo->{'master_restart'} or
  1214.          $master->[0]->{'running_master_is_special'} )
  1215.     {
  1216.       stop_masters();
  1217.       $master->[0]->{'running_master_is_special'}= 0; # Forget why we stopped
  1218.     }
  1219.     # ----------------------------------------------------------------------
  1220.     # Always terminate all slaves, if any. Else we may have useless
  1221.     # reconnection attempts and error messages in case the slave and
  1222.     # master servers restart.
  1223.     # ----------------------------------------------------------------------
  1224.     stop_slaves();
  1225.   }    
  1226.   # ----------------------------------------------------------------------
  1227.   # Prepare to start masters. Even if we use embedded, we want to run
  1228.   # the preparation.
  1229.   # ----------------------------------------------------------------------
  1230.   $ENV{'TZ'}= $tinfo->{'timezone'};
  1231.   mtr_report_test_name($tinfo);
  1232.   mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tnamen");
  1233. # FIXME test cases that depend on each other, prevent this from
  1234. # being at this location.
  1235. #  do_before_start_master($tname,$tinfo->{'master_sh'});
  1236.   # ----------------------------------------------------------------------
  1237.   # If any mysqld servers running died, we have to know
  1238.   # ----------------------------------------------------------------------
  1239.   mtr_record_dead_children();
  1240.   # ----------------------------------------------------------------------
  1241.   # Start masters
  1242.   # ----------------------------------------------------------------------
  1243.   if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
  1244.   {
  1245.     # FIXME give the args to the embedded server?!
  1246.     # FIXME what does $opt_local_master mean?!
  1247.     # FIXME split up start and check that started so that can do
  1248.     #       starts in parallel, masters and slaves at the same time.
  1249.     if ( ! $opt_local_master )
  1250.     {
  1251.       if ( $master->[0]->{'ndbcluster'} )
  1252.       {
  1253. $master->[0]->{'ndbcluster'}= ndbcluster_start();
  1254.         if ( $master->[0]->{'ndbcluster'} )
  1255.         {
  1256.           report_failure_and_restart($tinfo);
  1257.           return;
  1258.         }
  1259.       }
  1260.       if ( ! $master->[0]->{'pid'} )
  1261.       {
  1262.         # FIXME not correct location for do_before_start_master()
  1263.         do_before_start_master($tname,$tinfo->{'master_sh'});
  1264.         $master->[0]->{'pid'}=
  1265.           mysqld_start('master',0,$tinfo->{'master_opt'},[]);
  1266.         if ( ! $master->[0]->{'pid'} )
  1267.         {
  1268.           report_failure_and_restart($tinfo);
  1269.           return;
  1270.         }
  1271.       }
  1272.       if ( $opt_with_ndbcluster and ! $master->[1]->{'pid'} )
  1273.       {
  1274.         $master->[1]->{'pid'}=
  1275.           mysqld_start('master',1,$tinfo->{'master_opt'},[]);
  1276.         if ( ! $master->[1]->{'pid'} )
  1277.         {
  1278.           report_failure_and_restart($tinfo);
  1279.           return;
  1280.         }
  1281.       }
  1282.       if ( $tinfo->{'master_restart'} )
  1283.       {
  1284.         $master->[0]->{'running_master_is_special'}= 1;
  1285.       }
  1286.     }
  1287.     # ----------------------------------------------------------------------
  1288.     # Start slaves - if needed
  1289.     # ----------------------------------------------------------------------
  1290.     if ( $tinfo->{'slave_num'} )
  1291.     {
  1292.       mtr_tofile($slave->[0]->{'path_myerr'},"CURRENT_TEST: $tnamen");
  1293.       do_before_start_slave($tname,$tinfo->{'slave_sh'});
  1294.       for ( my $idx= 0; $idx <  $tinfo->{'slave_num'}; $idx++ )
  1295.       {
  1296.         if ( ! $slave->[$idx]->{'pid'} )
  1297.         {
  1298.           $slave->[$idx]->{'pid'}=
  1299.             mysqld_start('slave',$idx,
  1300.                          $tinfo->{'slave_opt'}, $tinfo->{'slave_mi'});
  1301.           if ( ! $slave->[$idx]->{'pid'} )
  1302.           {
  1303.             report_failure_and_restart($tinfo);
  1304.             return;
  1305.           }
  1306.         }
  1307.       }
  1308.     }
  1309.   }
  1310.   # ----------------------------------------------------------------------
  1311.   # If --start-and-exit given, stop here to let user manually run tests
  1312.   # ----------------------------------------------------------------------
  1313.   if ( $opt_start_and_exit )
  1314.   {
  1315.     mtr_report("nServers started, exiting");
  1316.     exit(0);
  1317.   }
  1318.   # ----------------------------------------------------------------------
  1319.   # Run the test case
  1320.   # ----------------------------------------------------------------------
  1321.   {
  1322.     # remove the old reject file
  1323.     if ( $opt_suite eq "main" )
  1324.     {
  1325.       unlink("r/$tname.reject");
  1326.     }
  1327.     else
  1328.     {
  1329.       unlink("suite/$opt_suite/r/$tname.reject");
  1330.     }
  1331.     unlink($path_timefile);
  1332.     my $res= run_mysqltest($tinfo);
  1333.     if ( $res == 0 )
  1334.     {
  1335.       mtr_report_test_passed($tinfo);
  1336.     }
  1337.     elsif ( $res == 62 )
  1338.     {
  1339.       # Testcase itself tell us to skip this one
  1340.       mtr_report_test_skipped($tinfo);
  1341.     }
  1342.     elsif ( $res == 63 )
  1343.     {
  1344.       $tinfo->{'timeout'}= 1;           # Mark as timeout
  1345.       report_failure_and_restart($tinfo);
  1346.     }
  1347.     else
  1348.     {
  1349.       # Test case failed, if in control mysqltest returns 1
  1350.       if ( $res != 1 )
  1351.       {
  1352.         mtr_tofile($path_timefile,
  1353.                    "mysqltest returned unexpected code $res, " .
  1354.                    "it has probably crashed");
  1355.       }
  1356.       report_failure_and_restart($tinfo);
  1357.     }
  1358.   }
  1359. }
  1360. sub report_failure_and_restart ($) {
  1361.   my $tinfo= shift;
  1362.   mtr_report_test_failed($tinfo);
  1363.   mtr_show_failed_diff($tinfo->{'name'});
  1364.   print "n";
  1365.   if ( ! $opt_force )
  1366.   {
  1367.     my $test_mode= join(" ", @::glob_test_mode) || "default";
  1368.     print "Aborting: $tinfo->{'name'} failed in $test_mode mode. ";
  1369.     print "To continue, re-run with '--force'.n";
  1370.     if ( ! $opt_gdb and ! $glob_use_running_server and
  1371.          ! $opt_ddd and ! $glob_use_embedded_server )
  1372.     {
  1373.       stop_masters_slaves();
  1374.     }
  1375.     mtr_exit(1);
  1376.   }
  1377.   # FIXME always terminate on failure?!
  1378.   if ( ! $opt_gdb and ! $glob_use_running_server and
  1379.        ! $opt_ddd and ! $glob_use_embedded_server )
  1380.   {
  1381.     stop_masters_slaves();
  1382.   }
  1383.   print "Resuming Testsnn";
  1384. }
  1385. ##############################################################################
  1386. #
  1387. #  Start and stop servers
  1388. #
  1389. ##############################################################################
  1390. # The embedded server needs the cleanup so we do some of the start work
  1391. # but stop before actually running mysqld or anything.
  1392. sub do_before_start_master ($$) {
  1393.   my $tname=       shift;
  1394.   my $init_script= shift;
  1395.   # FIXME what about second master.....
  1396.   # Remove stale binary logs except for 2 tests which need them FIXME here????
  1397.   if ( $tname ne "rpl_crash_binlog_ib_1b" and
  1398.        $tname ne "rpl_crash_binlog_ib_2b" and
  1399.        $tname ne "rpl_crash_binlog_ib_3b")
  1400.   {
  1401.     # FIXME we really want separate dir for binlogs
  1402.     foreach my $bin ( glob("$opt_vardir/log/master*-bin*") )
  1403.     {
  1404.       unlink($bin);
  1405.     }
  1406.   }
  1407.   # FIXME only remove the ones that are tied to this master
  1408.   # Remove old master.info and relay-log.info files
  1409.   unlink("$master->[0]->{'path_myddir'}/master.info");
  1410.   unlink("$master->[0]->{'path_myddir'}/relay-log.info");
  1411.   unlink("$master->[1]->{'path_myddir'}/master.info");
  1412.   unlink("$master->[1]->{'path_myddir'}/relay-log.info");
  1413.   # Run master initialization shell script if one exists
  1414.   if ( $init_script )
  1415.   {
  1416.     my $ret= mtr_run("/bin/sh", [$init_script], "", "", "", "");
  1417.     if ( $ret != 0 )
  1418.     {
  1419.       # FIXME rewrite those scripts to return 0 if successful
  1420. #      mtr_warning("$init_script exited with code $ret");
  1421.     }
  1422.   }
  1423.   # for gcov  FIXME needed? If so we need more absolute paths
  1424. # chdir($glob_basedir);
  1425. }
  1426. sub do_before_start_slave ($$) {
  1427.   my $tname=       shift;
  1428.   my $init_script= shift;
  1429.   # Remove stale binary logs and old master.info files
  1430.   # except for too tests which need them
  1431.   if ( $tname ne "rpl_crash_binlog_ib_1b" and
  1432.        $tname ne "rpl_crash_binlog_ib_2b" and
  1433.        $tname ne "rpl_crash_binlog_ib_3b" )
  1434.   {
  1435.     # FIXME we really want separate dir for binlogs
  1436.     foreach my $bin ( glob("$opt_vardir/log/slave*-bin*") )
  1437.     {
  1438.       unlink($bin);
  1439.     }
  1440.     # FIXME really master?!
  1441.     unlink("$slave->[0]->{'path_myddir'}/master.info");
  1442.     unlink("$slave->[0]->{'path_myddir'}/relay-log.info");
  1443.   }
  1444.   # Run slave initialization shell script if one exists
  1445.   if ( $init_script )
  1446.   {
  1447.     my $ret= mtr_run("/bin/sh", [$init_script], "", "", "", "");
  1448.     if ( $ret != 0 )
  1449.     {
  1450.       # FIXME rewrite those scripts to return 0 if successful
  1451. #      mtr_warning("$init_script exited with code $ret");
  1452.     }
  1453.   }
  1454.   foreach my $bin ( glob("$slave->[0]->{'path_myddir'}/log.*") )
  1455.   {
  1456.     unlink($bin);
  1457.   }
  1458. }
  1459. sub mysqld_arguments ($$$$$) {
  1460.   my $args=              shift;
  1461.   my $type=              shift;        # master/slave/bootstrap
  1462.   my $idx=               shift;
  1463.   my $extra_opt=         shift;
  1464.   my $slave_master_info= shift;
  1465.   my $sidx= "";                 # Index as string, 0 is empty string
  1466.   if ( $idx > 0 )
  1467.   {
  1468.     $sidx= sprintf("%d", $idx); # sprintf not needed in Perl for this
  1469.   }
  1470.   my $prefix= "";               # If mysqltest server arg
  1471.   if ( $glob_use_embedded_server )
  1472.   {
  1473.     $prefix= "--server-arg=";
  1474.   } else {
  1475.     # We can't pass embedded server --no-defaults
  1476.     mtr_add_arg($args, "%s--no-defaults", $prefix);
  1477.   }
  1478.   mtr_add_arg($args, "%s--console", $prefix);
  1479.   mtr_add_arg($args, "%s--basedir=%s", $prefix, $path_my_basedir);
  1480.   mtr_add_arg($args, "%s--character-sets-dir=%s", $prefix, $path_charsetsdir);
  1481.   mtr_add_arg($args, "%s--core", $prefix);
  1482.   mtr_add_arg($args, "%s--default-character-set=latin1", $prefix);
  1483.   mtr_add_arg($args, "%s--language=%s", $prefix, $path_language);
  1484.   mtr_add_arg($args, "%s--tmpdir=$opt_tmpdir", $prefix);
  1485.   if ( defined $opt_valgrind )
  1486.   {
  1487.     mtr_add_arg($args, "%s--skip-safemalloc", $prefix);
  1488.     mtr_add_arg($args, "%s--skip-bdb", $prefix);
  1489.   }
  1490.   my $pidfile;
  1491.   if ( $type eq 'master' )
  1492.   {
  1493.     my $id= $idx > 0 ? $idx + 101 : 1;
  1494.     mtr_add_arg($args, "%s--log-bin=%s/log/master-bin%s", $prefix,
  1495.                 $opt_vardir, $sidx);
  1496.     mtr_add_arg($args, "%s--pid-file=%s", $prefix,
  1497.                 $master->[$idx]->{'path_mypid'});
  1498.     mtr_add_arg($args, "%s--port=%d", $prefix,
  1499.                 $master->[$idx]->{'path_myport'});
  1500.     mtr_add_arg($args, "%s--server-id=%d", $prefix, $id);
  1501.     mtr_add_arg($args, "%s--socket=%s", $prefix,
  1502.                 $master->[$idx]->{'path_mysock'});
  1503.     mtr_add_arg($args, "%s--innodb_data_file_path=ibdata1:50M", $prefix);
  1504.     mtr_add_arg($args, "%s--local-infile", $prefix);
  1505.     mtr_add_arg($args, "%s--datadir=%s", $prefix,
  1506.                 $master->[$idx]->{'path_myddir'});
  1507.     if ( $idx > 0 )
  1508.     {
  1509.       mtr_add_arg($args, "%s--skip-innodb", $prefix);
  1510.     }
  1511.     if ( $opt_skip_ndbcluster )
  1512.     {
  1513.       mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
  1514.     }
  1515.   }
  1516.   if ( $type eq 'slave' )
  1517.   {
  1518.     my $slave_server_id=  2 + $idx;
  1519.     my $slave_rpl_rank= $slave_server_id;
  1520.     mtr_add_arg($args, "%s--datadir=%s", $prefix,
  1521.                 $slave->[$idx]->{'path_myddir'});
  1522.     # FIXME slave get this option twice?!
  1523.     mtr_add_arg($args, "%s--exit-info=256", $prefix);
  1524.     mtr_add_arg($args, "%s--init-rpl-role=slave", $prefix);
  1525.     mtr_add_arg($args, "%s--log-bin=%s/log/slave%s-bin", $prefix,
  1526.                 $opt_vardir, $sidx); # FIXME use own dir for binlogs
  1527.     mtr_add_arg($args, "%s--log-slave-updates", $prefix);
  1528.     # FIXME option duplicated for slave
  1529.     mtr_add_arg($args, "%s--log=%s", $prefix,
  1530.                 $slave->[$idx]->{'path_mylog'});
  1531.     mtr_add_arg($args, "%s--master-retry-count=10", $prefix);
  1532.     mtr_add_arg($args, "%s--pid-file=%s", $prefix,
  1533.                 $slave->[$idx]->{'path_mypid'});
  1534.     mtr_add_arg($args, "%s--port=%d", $prefix,
  1535.                 $slave->[$idx]->{'path_myport'});
  1536.     mtr_add_arg($args, "%s--relay-log=%s/log/slave%s-relay-bin", $prefix,
  1537.                 $opt_vardir, $sidx);
  1538.     mtr_add_arg($args, "%s--report-host=127.0.0.1", $prefix);
  1539.     mtr_add_arg($args, "%s--report-port=%d", $prefix,
  1540.                 $slave->[$idx]->{'path_myport'});
  1541.     mtr_add_arg($args, "%s--report-user=root", $prefix);
  1542.     mtr_add_arg($args, "%s--skip-innodb", $prefix);
  1543.     mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
  1544.     mtr_add_arg($args, "%s--skip-slave-start", $prefix);
  1545.     mtr_add_arg($args, "%s--slave-load-tmpdir=%s", $prefix,
  1546.                 $path_slave_load_tmpdir);
  1547.     mtr_add_arg($args, "%s--socket=%s", $prefix,
  1548.                 $slave->[$idx]->{'path_mysock'});
  1549.     mtr_add_arg($args, "%s--set-variable=slave_net_timeout=10", $prefix);
  1550.     if ( @$slave_master_info )
  1551.     {
  1552.       foreach my $arg ( @$slave_master_info )
  1553.       {
  1554.         mtr_add_arg($args, "%s%s", $prefix, $arg);
  1555.       }
  1556.     }
  1557.     else
  1558.     {
  1559.       mtr_add_arg($args, "%s--master-user=root", $prefix);
  1560.       mtr_add_arg($args, "%s--master-connect-retry=1", $prefix);
  1561.       mtr_add_arg($args, "%s--master-host=127.0.0.1", $prefix);
  1562.       mtr_add_arg($args, "%s--master-password=", $prefix);
  1563.       mtr_add_arg($args, "%s--master-port=%d", $prefix,
  1564.                   $master->[0]->{'path_myport'}); # First master
  1565.       mtr_add_arg($args, "%s--server-id=%d", $prefix, $slave_server_id);
  1566.       mtr_add_arg($args, "%s--rpl-recovery-rank=%d", $prefix, $slave_rpl_rank);
  1567.     }
  1568.   } # end slave
  1569.   if ( $opt_debug )
  1570.   {
  1571.     if ( $type eq 'master' )
  1572.     {
  1573.       mtr_add_arg($args, "%s--debug=d:t:i:A,%s/log/master%s.trace",
  1574.                   $prefix, $opt_vardir, $sidx);
  1575.     }
  1576.     if ( $type eq 'slave' )
  1577.     {
  1578.       mtr_add_arg($args, "%s--debug=d:t:i:A,%s/log/slave%s.trace",
  1579.                   $prefix, $opt_vardir, $sidx);
  1580.     }
  1581.   }
  1582.   if ( $opt_with_ndbcluster )
  1583.   {
  1584.     mtr_add_arg($args, "%s--ndbcluster", $prefix);
  1585.     mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
  1586.                 $opt_ndbconnectstring);
  1587.   }
  1588.   # FIXME always set nowdays??? SMALL_SERVER
  1589.   mtr_add_arg($args, "%s--key_buffer_size=1M", $prefix);
  1590.   mtr_add_arg($args, "%s--sort_buffer=256K", $prefix);
  1591.   mtr_add_arg($args, "%s--max_heap_table_size=1M", $prefix);
  1592.   if ( $opt_with_openssl )
  1593.   {
  1594.     mtr_add_arg($args, "%s--ssl-ca=%s/std_data/cacert.pem", $prefix,
  1595.                 $glob_mysql_test_dir);
  1596.     mtr_add_arg($args, "%s--ssl-cert=%s/std_data/server-cert.pem", $prefix,
  1597.                 $glob_mysql_test_dir);
  1598.     mtr_add_arg($args, "%s--ssl-key=%s/std_data/server-key.pem", $prefix,
  1599.                 $glob_mysql_test_dir);
  1600.   }
  1601.   if ( $opt_warnings )
  1602.   {
  1603.     mtr_add_arg($args, "%s--log-warnings", $prefix);
  1604.   }
  1605.   if ( $opt_gdb or $opt_client_gdb or $opt_manual_gdb or $opt_ddd)
  1606.   {
  1607.     mtr_add_arg($args, "%s--gdb", $prefix);
  1608.   }
  1609.   # If we should run all tests cases, we will use a local server for that
  1610.   if ( -w "/" )
  1611.   {
  1612.     # We are running as root;  We need to add the --root argument
  1613.     mtr_add_arg($args, "%s--user=root", $prefix);
  1614.   }
  1615.   if ( $type eq 'master' )
  1616.   {
  1617.     if ( ! $opt_old_master )
  1618.     {
  1619.       mtr_add_arg($args, "%s--rpl-recovery-rank=1", $prefix);
  1620.       mtr_add_arg($args, "%s--init-rpl-role=master", $prefix);
  1621.     }
  1622.     # FIXME strange,.....
  1623.     # FIXME MYSQL_MYPORT is not set anythere?!
  1624.     if ( $opt_local_master )
  1625.     {
  1626.       mtr_add_arg($args, "%s--host=127.0.0.1", $prefix);
  1627.       mtr_add_arg($args, "%s--port=%s", $prefix, $ENV{'MYSQL_MYPORT'});
  1628.     }
  1629.   }
  1630.   foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt )
  1631.   {
  1632.     mtr_add_arg($args, "%s%s", $prefix, $arg);
  1633.   }
  1634.   if ( $opt_bench )
  1635.   {
  1636.     mtr_add_arg($args, "%s--rpl-recovery-rank=1", $prefix);
  1637.     mtr_add_arg($args, "%s--init-rpl-role=master", $prefix);
  1638.   }
  1639.   elsif ( $type eq 'master' )
  1640.   {
  1641.     mtr_add_arg($args, "%s--exit-info=256", $prefix);
  1642.     mtr_add_arg($args, "%s--open-files-limit=1024", $prefix);
  1643.     mtr_add_arg($args, "%s--log=%s", $prefix, $master->[0]->{'path_mylog'});
  1644.   }
  1645.   return $args;
  1646. }
  1647. # FIXME
  1648. #  if ( $type eq 'master' and $glob_use_embedded_server )
  1649. #  {
  1650. #    # Add a -A to each argument to pass it to embedded server
  1651. #    my @mysqltest_opt=  map {("-A",$_)} @args;
  1652. #    $opt_extra_mysqltest_opt=  @mysqltest_opt;
  1653. #    return;
  1654. #  }
  1655. ##############################################################################
  1656. #
  1657. #  Start mysqld and return the PID
  1658. #
  1659. ##############################################################################
  1660. sub mysqld_start ($$$$) {
  1661.   my $type=              shift;        # master/slave/bootstrap
  1662.   my $idx=               shift;
  1663.   my $extra_opt=         shift;
  1664.   my $slave_master_info= shift;
  1665.   my $args;                             # Arg vector
  1666.   my $exe;
  1667.   my $pid;
  1668.   if ( $type eq 'master' )
  1669.   {
  1670.     $exe= $exe_master_mysqld;
  1671.   }
  1672.   elsif ( $type eq 'slave' )
  1673.   {
  1674.     $exe= $exe_slave_mysqld;
  1675.   }
  1676.   else
  1677.   {
  1678.     $exe= $exe_mysqld;
  1679.   }
  1680.   mtr_init_args($args);
  1681.   if ( defined $opt_valgrind )
  1682.   {
  1683.     valgrind_arguments($args, $exe);
  1684.   }
  1685.   mysqld_arguments($args,$type,$idx,$extra_opt,$slave_master_info);
  1686.   if ( $type eq 'master' )
  1687.   {
  1688.     if ( $pid= mtr_spawn($exe, $args, "",
  1689.                          $master->[$idx]->{'path_myerr'},
  1690.                          $master->[$idx]->{'path_myerr'},
  1691.                          "",
  1692.                          { append_log_file => 1 }) )
  1693.     {
  1694.       return sleep_until_file_created($master->[$idx]->{'path_mypid'},
  1695.                                       $master->[$idx]->{'start_timeout'}, $pid);
  1696.     }
  1697.   }
  1698.   if ( $type eq 'slave' )
  1699.   {
  1700.     if ( $pid= mtr_spawn($exe, $args, "",
  1701.                          $slave->[$idx]->{'path_myerr'},
  1702.                          $slave->[$idx]->{'path_myerr'},
  1703.                          "",
  1704.                          { append_log_file => 1 }) )
  1705.     {
  1706.       return sleep_until_file_created($slave->[$idx]->{'path_mypid'},
  1707.                                       $master->[$idx]->{'start_timeout'}, $pid);
  1708.     }
  1709.   }
  1710.   return 0;
  1711. }
  1712. sub stop_masters_slaves () {
  1713.   print  "Ending Testsn";
  1714.   print  "Shutting-down MySQL daemonnn";
  1715.   stop_masters();
  1716.   print "Master(s) shutdown finishedn";
  1717.   stop_slaves();
  1718.   print "Slave(s) shutdown finishedn";
  1719. }
  1720. sub stop_masters () {
  1721.   my @args;
  1722.   for ( my $idx; $idx < 2; $idx++ )
  1723.   {
  1724.     # FIXME if we hit ^C before fully started, this test will prevent
  1725.     # the mysqld process from being killed
  1726.     if ( $master->[$idx]->{'pid'} )
  1727.     {
  1728.       push(@args,{
  1729.                   pid      => $master->[$idx]->{'pid'},
  1730.                   pidfile  => $master->[$idx]->{'path_mypid'},
  1731.                   sockfile => $master->[$idx]->{'path_mysock'},
  1732.                   port     => $master->[$idx]->{'path_myport'},
  1733.                  });
  1734.       $master->[$idx]->{'pid'}= 0; # Assume we are done with it
  1735.     }
  1736.   }
  1737.   if ( ! $master->[0]->{'ndbcluster'} )
  1738.   {
  1739.     ndbcluster_stop();
  1740.     $master->[0]->{'ndbcluster'}= 1;
  1741.   }
  1742.   mtr_stop_mysqld_servers(@args);
  1743. }
  1744. sub stop_slaves () {
  1745.   my $force= shift;
  1746.   my @args;
  1747.   for ( my $idx; $idx < 3; $idx++ )
  1748.   {
  1749.     if ( $slave->[$idx]->{'pid'} )
  1750.     {
  1751.       push(@args,{
  1752.                   pid      => $slave->[$idx]->{'pid'},
  1753.                   pidfile  => $slave->[$idx]->{'path_mypid'},
  1754.                   sockfile => $slave->[$idx]->{'path_mysock'},
  1755.                   port     => $slave->[$idx]->{'path_myport'},
  1756.                  });
  1757.       $slave->[$idx]->{'pid'}= 0; # Assume we are done with it
  1758.     }
  1759.   }
  1760.   mtr_stop_mysqld_servers(@args);
  1761. }
  1762. sub run_mysqltest ($) {
  1763.   my $tinfo=       shift;
  1764.   my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " .
  1765.                          "--port=$master->[0]->{'path_myport'} " .
  1766.                          "--socket=$master->[0]->{'path_mysock'} --password=";
  1767.   if ( $opt_debug )
  1768.   {
  1769.     $cmdline_mysqldump .=
  1770.       " --debug=d:t:A,$opt_vardir/log/mysqldump.trace";
  1771.   }
  1772.   my $cmdline_mysqlimport= "$exe_mysqlimport -uroot " .
  1773.                          "--port=$master->[0]->{'path_myport'} " .
  1774.                          "--socket=$master->[0]->{'path_mysock'} --password=";
  1775.   if ( $opt_debug )
  1776.   {
  1777.     $cmdline_mysqlimport .=
  1778.       " --debug=d:t:A,$opt_vardir/log/mysqlimport.trace";
  1779.   }
  1780.   my $cmdline_mysqlshow= "$exe_mysqlshow -uroot " .
  1781.                          "--port=$master->[0]->{'path_myport'} " .
  1782.                          "--socket=$master->[0]->{'path_mysock'} --password=";
  1783.   if ( $opt_debug )
  1784.   {
  1785.     $cmdline_mysqlshow .=
  1786.       " --debug=d:t:A,$opt_vardir/log/mysqlshow.trace";
  1787.   }
  1788.   my $cmdline_mysqlbinlog=
  1789.     "$exe_mysqlbinlog --no-defaults --local-load=$opt_tmpdir";
  1790.   if ( $opt_debug )
  1791.   {
  1792.     $cmdline_mysqlbinlog .=
  1793.       " --debug=d:t:A,$opt_vardir/log/mysqlbinlog.trace";
  1794.   }
  1795.   my $cmdline_mysql=
  1796.     "$exe_mysql --host=localhost  --user=root --password= " .
  1797.     "--port=$master->[0]->{'path_myport'} " .
  1798.     "--socket=$master->[0]->{'path_mysock'}";
  1799.   my $cmdline_mysql_client_test=
  1800.     "$exe_mysql_client_test --no-defaults --testcase --user=root --silent " .
  1801.     "--port=$master->[0]->{'path_myport'} " .
  1802.     "--socket=$master->[0]->{'path_mysock'}";
  1803.   if ( $glob_use_embedded_server )
  1804.   {
  1805.     $cmdline_mysql_client_test.=
  1806.       " -A --language=$path_language" .
  1807.       " -A --datadir=$slave->[0]->{'path_myddir'}" .
  1808.       " -A --character-sets-dir=$path_charsetsdir";
  1809.   }
  1810.   my $cmdline_mysql_fix_system_tables=
  1811.     "$exe_mysql_fix_system_tables --no-defaults --host=localhost --user=root --password= " .
  1812.     "--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " .
  1813.     "--port=$master->[0]->{'path_myport'} " .
  1814.     "--socket=$master->[0]->{'path_mysock'}";
  1815.   # FIXME really needing a PATH???
  1816.   # $ENV{'PATH'}= "/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11:$ENV{'PATH'}";
  1817.   $ENV{'MYSQL'}=                    $cmdline_mysql;
  1818.   $ENV{'MYSQL_DUMP'}=               $cmdline_mysqldump;
  1819.   $ENV{'MYSQL_IMPORT'}=             $cmdline_mysqlimport;
  1820.   $ENV{'MYSQL_SHOW'}=               $cmdline_mysqlshow;
  1821.   $ENV{'MYSQL_BINLOG'}=             $cmdline_mysqlbinlog;
  1822.   $ENV{'MYSQL_FIX_SYSTEM_TABLES'}=  $cmdline_mysql_fix_system_tables;
  1823.   $ENV{'MYSQL_CLIENT_TEST'}=        $cmdline_mysql_client_test;
  1824.   $ENV{'CHARSETSDIR'}=              $path_charsetsdir;
  1825.   $ENV{'NDB_STATUS_OK'}=            $flag_ndb_status_ok;
  1826.   $ENV{'NDB_MGM'}=                  $exe_ndb_mgm;
  1827.   $ENV{'NDB_BACKUP_DIR'}=           $path_ndb_backup_dir;
  1828.   $ENV{'NDB_TOOLS_DIR'}=            $path_ndb_tools_dir;
  1829.   $ENV{'NDB_TOOLS_OUTPUT'}=         $file_ndb_testrun_log;
  1830.   $ENV{'NDB_CONNECTSTRING'}=        $opt_ndbconnectstring;
  1831.   my $exe= $exe_mysqltest;
  1832.   my $args;
  1833.   mtr_init_args($args);
  1834.   if ( defined $opt_valgrind_mysqltest )
  1835.   {
  1836.     valgrind_arguments($args, $exe);
  1837.   }
  1838.   mtr_add_arg($args, "--no-defaults");
  1839.   mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'});
  1840.   mtr_add_arg($args, "--database=test");
  1841.   mtr_add_arg($args, "--user=%s", $opt_user);
  1842.   mtr_add_arg($args, "--password=");
  1843.   mtr_add_arg($args, "--silent");
  1844.   mtr_add_arg($args, "-v");
  1845.   mtr_add_arg($args, "--skip-safemalloc");
  1846.   mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
  1847.   mtr_add_arg($args, "--port=%d", $master->[0]->{'path_myport'});
  1848.   if ( $opt_ps_protocol )
  1849.   {
  1850.     mtr_add_arg($args, "--ps-protocol");
  1851.   }
  1852.   if ( $opt_strace_client )
  1853.   {
  1854.     $exe=  "strace";            # FIXME there are ktrace, ....
  1855.     mtr_add_arg($args, "-o");
  1856.     mtr_add_arg($args, "%s/log/mysqltest.strace", $opt_vardir);
  1857.     mtr_add_arg($args, "$exe_mysqltest");
  1858.   }
  1859.   if ( $opt_timer )
  1860.   {
  1861.     mtr_add_arg($args, "--timer-file=%s/log/timer", $opt_vardir);
  1862.   }
  1863.   if ( $opt_big_test )
  1864.   {
  1865.     mtr_add_arg($args, "--big-test");
  1866.   }
  1867.   if ( $opt_compress )
  1868.   {
  1869.     mtr_add_arg($args, "--compress");
  1870.   }
  1871.   if ( $opt_sleep )
  1872.   {
  1873.     mtr_add_arg($args, "--sleep=%d", $opt_sleep);
  1874.   }
  1875.   if ( $opt_debug )
  1876.   {
  1877.     mtr_add_arg($args, "--debug=d:t:A,%s/log/mysqltest.trace", $opt_vardir);
  1878.   }
  1879.   if ( $opt_with_openssl )
  1880.   {
  1881.     mtr_add_arg($args, "--ssl-ca=%s/std_data/cacert.pem",
  1882.                 $glob_mysql_test_dir);
  1883.     mtr_add_arg($args, "--ssl-cert=%s/std_data/client-cert.pem",
  1884.                 $glob_mysql_test_dir);
  1885.     mtr_add_arg($args, "--ssl-key=%s/std_data/client-key.pem",
  1886.                 $glob_mysql_test_dir);
  1887.   }
  1888.   # ----------------------------------------------------------------------
  1889.   # If embedded server, we create server args to give mysqltest to pass on
  1890.   # ----------------------------------------------------------------------
  1891.   if ( $glob_use_embedded_server )
  1892.   {
  1893.     mysqld_arguments($args,'master',0,$tinfo->{'master_opt'},[]);
  1894.   }
  1895.   # ----------------------------------------------------------------------
  1896.   # export MYSQL_TEST variable containing <path>/mysqltest <args>
  1897.   # ----------------------------------------------------------------------
  1898.   $ENV{'MYSQL_TEST'}= "$exe_mysqltest " . join(" ", @$args);
  1899.   # ----------------------------------------------------------------------
  1900.   # Add arguments that should not go into the MYSQL_TEST env var
  1901.   # ----------------------------------------------------------------------
  1902.   mtr_add_arg($args, "-R");
  1903.   mtr_add_arg($args, $tinfo->{'result_file'});
  1904.   if ( $opt_record )
  1905.   {
  1906.     mtr_add_arg($args, "--record");
  1907.   }
  1908.   return mtr_run_test($exe,$args,$tinfo->{'path'},"",$path_timefile,"");
  1909. }
  1910. sub valgrind_arguments {
  1911.   my $args= shift;
  1912.   my $exe=  shift;
  1913.   mtr_add_arg($args, "--tool=memcheck"); # From >= 2.1.2 needs this option
  1914.   mtr_add_arg($args, "--alignment=8");
  1915.   mtr_add_arg($args, "--leak-check=yes");
  1916.   mtr_add_arg($args, "--num-callers=16");
  1917.   mtr_add_arg($args, "--suppressions=%s/valgrind.supp", $glob_mysql_test_dir)
  1918.     if -f "$glob_mysql_test_dir/valgrind.supp";
  1919.   if ( defined $opt_valgrind_all )
  1920.   {
  1921.     mtr_add_arg($args, "-v");
  1922.     mtr_add_arg($args, "--show-reachable=yes");
  1923.   }
  1924.   if ( $opt_valgrind_options )
  1925.   {
  1926.     # FIXME split earlier and put into @glob_valgrind_*
  1927.     mtr_add_arg($args, split(' ', $opt_valgrind_options));
  1928.   }
  1929.   mtr_add_arg($args, $$exe);
  1930.   $$exe= $opt_valgrind || "valgrind";
  1931. }
  1932. ##############################################################################
  1933. #
  1934. #  Usage
  1935. #
  1936. ##############################################################################
  1937. sub usage ($) {
  1938.   print STDERR <<HERE;
  1939. mysql-test-run [ OPTIONS ] [ TESTCASE ]
  1940. FIXME when is TESTCASE arg used or not?!
  1941. Options to control what engine/variation to run
  1942.   embedded-server       Use the embedded server, i.e. no mysqld daemons
  1943.   ps-protocol           Use the binary protocol between client and server
  1944.   bench                 Run the benchmark suite FIXME
  1945.   small-bench           FIXME
  1946.   no-manager            Use the istanse manager (currently disabled)
  1947. Options to control what test suites or cases to run
  1948.   force                 Continue to run the suite after failure
  1949.   with-ndbcluster       Use cluster, and enable test cases that requres it
  1950.   do-test=PREFIX        Run test cases which name are prefixed with PREFIX
  1951.   start-from=PREFIX     Run test cases starting from test prefixed with PREFIX
  1952.   suite=NAME            Run the test suite named NAME. The default is "main"
  1953.   skip-rpl              Skip the replication test cases.
  1954.   skip-test=PREFIX      Skip test cases which name are prefixed with PREFIX
  1955. Options that specify ports
  1956.   master_port=PORT      Specify the port number used by the first master
  1957.   slave_port=PORT       Specify the port number used by the first slave
  1958.   ndbcluster_port=PORT  Specify the port number used by cluster
  1959.   manager-port=PORT     Specify the port number used by manager (currently not used)
  1960. Options for test case authoring
  1961.   record TESTNAME       (Re)genereate the result file for TESTNAME
  1962. Options that pass on options
  1963.   mysqld=ARGS           Specify additional arguments to "mysqld"
  1964. Options to run test on running server
  1965.   extern                Use running server for tests FIXME DANGEROUS
  1966.   ndbconnectstring=STR  Use running cluster, and connect using STR      
  1967.   user=USER             User for connect to server
  1968. Options for debugging the product
  1969.   gdb                   FIXME
  1970.   manual-gdb            FIXME
  1971.   client-gdb            FIXME
  1972.   ddd                   FIXME
  1973.   strace-client         FIXME
  1974.   master-binary=PATH    Specify the master "mysqld" to use
  1975.   slave-binary=PATH     Specify the slave "mysqld" to use
  1976. Options for coverage, profiling etc
  1977.   gcov                  FIXME
  1978.   gprof                 FIXME
  1979.   valgrind[=EXE]        Run the "mysqltest" executable as well as the "mysqld"
  1980.                         server using valgrind, optionally specifying the
  1981.                         executable path/name
  1982.   valgrind-mysqltest[=EXE] In addition, run the "mysqltest" executable with valgrind
  1983.   valgrind-all[=EXE]    Adds verbose flag, and --show-reachable to valgrind
  1984.   valgrind-options=ARGS Extra options to give valgrind
  1985. Misc options
  1986.   verbose               Verbose output from this script
  1987.   script-debug          Debug this script itself
  1988.   compress              Use the compressed protocol between client and server
  1989.   timer                 Show test case execution time
  1990.   start-and-exit        Only initiate and start the "mysqld" servers, use the startup
  1991.                         settings for the specified test case if any
  1992.   start-dirty           Only start the "mysqld" servers without initiation
  1993.   fast                  Don't try to cleanup from earlier runs
  1994.   reorder               Reorder tests to get less server restarts
  1995.   help                  Get this help text
  1996.   unified-diff | udiff  When presenting differences, use unified diff
  1997.   testcase-timeout=MINUTES Max test case run time (default 5)
  1998.   suite-timeout=MINUTES    Max test suite run time (default 120)
  1999. Options not yet described, or that I want to look into more
  2000.   big-test              
  2001.   debug                 
  2002.   local                 
  2003.   local-master          
  2004.   netware               
  2005.   old-master            
  2006.   sleep=SECONDS         
  2007.   socket=PATH           
  2008.   tmpdir=DIR            
  2009.   user-test=s           
  2010.   wait-timeout=SECONDS  
  2011.   warnings              
  2012.   log-warnings          
  2013.   with-openssl          
  2014. HERE
  2015.   mtr_exit(1);
  2016. }