mysql-test-run.pl 134 KB
Newer Older
unknown's avatar
unknown committed
1 2 3 4
#!/usr/bin/perl
# -*- cperl -*-

#
5 6 7
##############################################################################
#
#  mysql-test-run.pl
unknown's avatar
unknown committed
8
#
9
#  Tool used for executing a suite of .test file
unknown's avatar
unknown committed
10
#
11 12
#  See the "MySQL Test framework manual" for more information
#  http://dev.mysql.com/doc/mysqltest/en/index.html
unknown's avatar
unknown committed
13
#
14
#  Please keep the test framework tools identical in all versions!
unknown's avatar
unknown committed
15
#
16
##############################################################################
unknown's avatar
unknown committed
17
#
18
# Coding style directions for this perl script
unknown's avatar
unknown committed
19
#
unknown's avatar
unknown committed
20
#   - To make this Perl script easy to alter even for those that not
21
#     code Perl that often, keeep the coding style as close as possible to
unknown's avatar
unknown committed
22
#     the C/C++ MySQL coding standard.
unknown's avatar
unknown committed
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#
#   - All lists of arguments to send to commands are Perl lists/arrays,
#     not strings we append args to. Within reason, most string
#     concatenation for arguments should be avoided.
#
#   - Functions defined in the main program are not to be prefixed,
#     functions in "library files" are to be prefixed with "mtr_" (for
#     Mysql-Test-Run). There are some exceptions, code that fits best in
#     the main program, but are put into separate files to avoid
#     clutter, may be without prefix.
#
#   - All stat/opendir/-f/ is to be kept in collect_test_cases(). It
#     will create a struct that the rest of the program can use to get
#     the information. This separates the "find information" from the
#     "do the work" and makes the program more easy to maintain.
#
#   - The rule when it comes to the logic of this program is
#
#       command_line_setup() - is to handle the logic between flags
#       collect_test_cases() - is to do its best to select what tests
#                              to run, dig out options, if needs restart etc.
#       run_testcase()       - is to run a single testcase, and follow the
#                              logic set in both above. No, or rare file
#                              system operations. If a test seems complex,
#                              it should probably not be here.
#
# A nice way to trace the execution of this script while debugging
# is to use the Devel::Trace package found at
# "http://www.plover.com/~mjd/perl/Trace/" and run this script like
# "perl -d:Trace mysql-test-run.pl"
unknown's avatar
unknown committed
53
#
unknown's avatar
unknown committed
54 55 56 57 58 59

$Devel::Trace::TRACE= 0;       # Don't trace boring init stuff

#require 5.6.1;
use File::Path;
use File::Basename;
60
use File::Copy;
unknown's avatar
unknown committed
61 62 63 64 65
use Cwd;
use Getopt::Long;
use Sys::Hostname;
use IO::Socket;
use IO::Socket::INET;
66
use Data::Dumper;
unknown's avatar
unknown committed
67
use strict;
68
use warnings;
69
use diagnostics;
unknown's avatar
unknown committed
70

71 72 73
select(STDOUT);
$| = 1; # Automatically flush STDOUT

unknown's avatar
unknown committed
74 75 76 77
our $glob_win32_perl=  ($^O eq "MSWin32"); # ActiveState Win32 Perl
our $glob_cygwin_perl= ($^O eq "cygwin");  # Cygwin Perl
our $glob_win32=       ($glob_win32_perl or $glob_cygwin_perl);
our $glob_netware=     ($^O eq "NetWare"); # NetWare
unknown's avatar
unknown committed
78

unknown's avatar
unknown committed
79
require "lib/mtr_cases.pl";
80
require "lib/mtr_im.pl";
unknown's avatar
unknown committed
81
require "lib/mtr_process.pl";
82
require "lib/mtr_timer.pl";
unknown's avatar
unknown committed
83 84 85 86
require "lib/mtr_io.pl";
require "lib/mtr_gcov.pl";
require "lib/mtr_gprof.pl";
require "lib/mtr_report.pl";
unknown's avatar
unknown committed
87
require "lib/mtr_diff.pl";
unknown's avatar
unknown committed
88 89
require "lib/mtr_match.pl";
require "lib/mtr_misc.pl";
90
require "lib/mtr_stress.pl";
unknown's avatar
unknown committed
91 92 93 94 95 96 97 98 99 100

$Devel::Trace::TRACE= 1;

##############################################################################
#
#  Default settings
#
##############################################################################

# Misc global variables
unknown's avatar
unknown committed
101
our $mysql_version_id;
unknown's avatar
unknown committed
102
our $glob_mysql_test_dir=         undef;
unknown's avatar
unknown committed
103
our $glob_mysql_bench_dir=        undef;
unknown's avatar
unknown committed
104 105
our $glob_hostname=               undef;
our $glob_scriptname=             undef;
106
our $glob_timers=                 undef;
unknown's avatar
unknown committed
107 108
our $glob_use_running_server=     0;
our $glob_use_running_ndbcluster= 0;
unknown's avatar
unknown committed
109
our $glob_use_running_ndbcluster_slave= 0;
unknown's avatar
unknown committed
110
our $glob_use_embedded_server=    0;
unknown's avatar
unknown committed
111
our @glob_test_mode;
unknown's avatar
unknown committed
112 113 114 115 116 117 118

our $glob_basedir;

our $path_charsetsdir;
our $path_client_bindir;
our $path_language;
our $path_timefile;
119
our $path_snapshot;
120
our $path_mysqltest_log;
121
our $path_current_test_log;
unknown's avatar
unknown committed
122
our $path_my_basedir;
unknown's avatar
unknown committed
123

124
our $opt_vardir;                 # A path but set directly on cmd line
unknown's avatar
unknown committed
125
our $path_vardir_trace;          # unix formatted opt_vardir for trace files
unknown's avatar
unknown committed
126 127
our $opt_tmpdir;                 # A path but set directly on cmd line

128 129 130 131 132 133
# Visual Studio produces executables in different sub-directories based on the
# configuration used to build them.  To make life easier, an environment
# variable or command-line option may be specified to control which set of
# executables will be used by the test suite.
our $opt_vs_config = $ENV{'MTR_VS_CONFIG'};

134 135
our $default_vardir;

unknown's avatar
unknown committed
136 137 138
our $opt_usage;
our $opt_suite;

unknown's avatar
unknown committed
139
our $opt_script_debug= 0;  # Script debugging, enable with --script-debug
140
our $opt_verbose= 0;  # Verbose output, enable with --verbose
unknown's avatar
unknown committed
141 142 143 144

our $exe_master_mysqld;
our $exe_mysql;
our $exe_mysqladmin;
145
our $exe_mysql_upgrade;
unknown's avatar
unknown committed
146
our $exe_mysqlbinlog;
unknown's avatar
unknown committed
147
our $exe_mysql_client_test;
unknown's avatar
unknown committed
148
our $exe_mysqld;
unknown's avatar
unknown committed
149 150 151 152 153
our $exe_mysqlcheck;
our $exe_mysqldump;
our $exe_mysqlslap;
our $exe_mysqlimport;
our $exe_mysqlshow;
unknown's avatar
unknown committed
154
our $exe_mysql_fix_system_tables;
unknown's avatar
unknown committed
155
our $exe_mysqltest;
unknown's avatar
unknown committed
156 157
our $exe_ndbd;
our $exe_ndb_mgmd;
unknown's avatar
unknown committed
158
our $exe_slave_mysqld;
159
our $exe_im;
160
our $exe_my_print_defaults;
161
our $exe_perror;
162
our $lib_udf_example;
163
our $exe_libtool;
unknown's avatar
unknown committed
164 165 166 167 168

our $opt_bench= 0;
our $opt_small_bench= 0;
our $opt_big_test= 0;            # Send --big-test to mysqltest

unknown's avatar
unknown committed
169
our @opt_extra_mysqld_opt;
unknown's avatar
unknown committed
170 171

our $opt_compress;
172 173 174 175
our $opt_ssl;
our $opt_skip_ssl;
our $opt_ssl_supported;
our $opt_ps_protocol;
176 177 178
our $opt_sp_protocol;
our $opt_cursor_protocol;
our $opt_view_protocol;
179

unknown's avatar
unknown committed
180 181
our $opt_debug;
our $opt_do_test;
unknown's avatar
unknown committed
182
our @opt_cases;                  # The test cases names in argv
unknown's avatar
unknown committed
183 184 185 186
our $opt_embedded_server;
our $opt_extern;
our $opt_fast;
our $opt_force;
unknown's avatar
unknown committed
187
our $opt_reorder= 0;
188
our $opt_enable_disabled;
189
our $opt_mem= $ENV{'MTR_MEM'};
unknown's avatar
unknown committed
190 191 192 193 194

our $opt_gcov;
our $opt_gcov_err;
our $opt_gcov_msg;

unknown's avatar
unknown committed
195
our $glob_debugger= 0;
unknown's avatar
unknown committed
196 197
our $opt_gdb;
our $opt_client_gdb;
unknown's avatar
unknown committed
198 199
our $opt_ddd;
our $opt_client_ddd;
unknown's avatar
unknown committed
200
our $opt_manual_gdb;
unknown's avatar
unknown committed
201 202
our $opt_manual_ddd;
our $opt_manual_debug;
203 204
our $opt_debugger;
our $opt_client_debugger;
unknown's avatar
unknown committed
205 206 207 208 209 210

our $opt_gprof;
our $opt_gprof_dir;
our $opt_gprof_master;
our $opt_gprof_slave;

unknown's avatar
unknown committed
211
our $master;
unknown's avatar
unknown committed
212
our $slave;
unknown's avatar
unknown committed
213
our $clusters;
unknown's avatar
unknown committed
214

215 216
our $instance_manager;

unknown's avatar
unknown committed
217 218
our $opt_ndbcluster_port;
our $opt_ndbconnectstring;
unknown's avatar
unknown committed
219 220
our $opt_ndbcluster_port_slave;
our $opt_ndbconnectstring_slave;
unknown's avatar
unknown committed
221 222

our $opt_record;
223
our $opt_report_features;
224
our $opt_check_testcases;
unknown's avatar
unknown committed
225 226 227

our $opt_skip;
our $opt_skip_rpl;
228
our $max_slave_num= 0;
229
our $use_innodb;
unknown's avatar
unknown committed
230
our $opt_skip_test;
unknown's avatar
unknown committed
231
our $opt_skip_im;
unknown's avatar
unknown committed
232 233

our $opt_sleep;
unknown's avatar
unknown committed
234

235
our $opt_sleep_time_after_restart=  1;
unknown's avatar
unknown committed
236
our $opt_sleep_time_for_delete=    10;
unknown's avatar
unknown committed
237 238
our $opt_testcase_timeout;
our $opt_suite_timeout;
unknown's avatar
unknown committed
239
my  $default_testcase_timeout=     15; # 15 min max
240
my  $default_suite_timeout=       180; # 3 hours max
unknown's avatar
unknown committed
241 242 243 244 245 246

our $opt_socket;

our $opt_source_dist;

our $opt_start_and_exit;
247
our $opt_start_dirty;
unknown's avatar
unknown committed
248 249 250 251
our $opt_start_from;

our $opt_strace_client;

252
our $opt_timer= 1;
unknown's avatar
unknown committed
253

unknown's avatar
unknown committed
254
our $opt_user;
unknown's avatar
unknown committed
255 256
our $opt_user_test;

unknown's avatar
unknown committed
257 258 259
our $opt_valgrind= 0;
our $opt_valgrind_mysqld= 0;
our $opt_valgrind_mysqltest= 0;
260
our $default_valgrind_options= "--show-reachable=yes";
unknown's avatar
unknown committed
261
our $opt_valgrind_options;
unknown's avatar
unknown committed
262
our $opt_valgrind_path;
263
our $opt_callgrind;
unknown's avatar
unknown committed
264

265 266 267 268
our $opt_stress=               "";
our $opt_stress_suite=     "main";
our $opt_stress_mode=    "random";
our $opt_stress_threads=        5;
269 270 271
our $opt_stress_test_count=     0;
our $opt_stress_loop_count=     0;
our $opt_stress_test_duration=  0;
272 273 274
our $opt_stress_init_file=     "";
our $opt_stress_test_file=     "";

unknown's avatar
unknown committed
275 276 277 278 279 280
our $opt_wait_for_master;
our $opt_wait_for_slave;
our $opt_wait_timeout=  10;

our $opt_warnings;

unknown's avatar
unknown committed
281 282
our $opt_udiff;

283 284
our $opt_skip_ndbcluster= 0;
our $opt_skip_ndbcluster_slave= 0;
unknown's avatar
unknown committed
285
our $opt_with_ndbcluster= 0;
286
our $opt_with_ndbcluster_only= 0;
287
our $glob_ndbcluster_supported= 0;
288
our $opt_ndb_extra_test= 0;
289 290
our $opt_skip_master_binlog= 0;
our $opt_skip_slave_binlog= 0;
unknown's avatar
unknown committed
291

292
our $exe_ndb_mgm;
unknown's avatar
unknown committed
293
our $exe_ndb_waiter;
294
our $path_ndb_tools_dir;
295 296
our $path_ndb_examples_dir;
our $exe_ndb_example;
unknown's avatar
unknown committed
297
our $path_ndb_testrun_log;
unknown's avatar
unknown committed
298

299 300
our @data_dir_lst;

301
our $used_binlog_format;
unknown's avatar
unknown committed
302 303
our $debug_compiled_binaries;
our $glob_tot_real_time= 0;
304

305 306
our %mysqld_variables;

unknown's avatar
unknown committed
307 308 309 310 311 312 313 314 315 316

######################################################################
#
#  Function declarations
#
######################################################################

sub main ();
sub initial_setup ();
sub command_line_setup ();
317
sub datadir_setup ();
unknown's avatar
unknown committed
318
sub executable_setup ();
unknown's avatar
unknown committed
319
sub environment_setup ();
320
sub kill_running_servers ();
unknown's avatar
unknown committed
321
sub cleanup_stale_files ();
unknown's avatar
unknown committed
322
sub check_ssl_support ($);
323
sub check_running_as_root();
unknown's avatar
unknown committed
324
sub check_ndbcluster_support ($);
unknown's avatar
unknown committed
325
sub rm_ndbcluster_tables ($);
unknown's avatar
unknown committed
326 327
sub ndbcluster_start_install ($);
sub ndbcluster_start ($$);
328
sub ndbcluster_wait_started ($$);
329
sub mysqld_wait_started($);
unknown's avatar
unknown committed
330
sub run_benchmarks ($);
331
sub initialize_servers ();
unknown's avatar
unknown committed
332 333
sub mysql_install_db ();
sub install_db ($$);
334
sub copy_install_db ($$);
unknown's avatar
unknown committed
335
sub run_testcase ($);
336
sub run_testcase_stop_servers ($$$);
unknown's avatar
unknown committed
337
sub run_testcase_start_servers ($);
338
sub run_testcase_check_skip_test($);
unknown's avatar
unknown committed
339
sub report_failure_and_restart ($);
340 341
sub do_before_start_master ($);
sub do_before_start_slave ($);
unknown's avatar
unknown committed
342 343 344 345 346
sub ndbd_start ($$$);
sub ndb_mgmd_start ($);
sub mysqld_start ($$$);
sub mysqld_arguments ($$$$$);
sub stop_all_servers ();
unknown's avatar
unknown committed
347
sub run_mysqltest ($);
unknown's avatar
unknown committed
348
sub usage ($);
unknown's avatar
unknown committed
349 350 351 352 353 354 355 356 357 358 359 360

######################################################################
#
#  Main program
#
######################################################################

main();

sub main () {

  command_line_setup();
361

362 363 364 365
  check_ndbcluster_support(\%mysqld_variables);
  check_ssl_support(\%mysqld_variables);
  check_debug_support(\%mysqld_variables);

unknown's avatar
unknown committed
366
  executable_setup();
367

unknown's avatar
unknown committed
368
  environment_setup();
unknown's avatar
unknown committed
369 370 371 372 373 374 375 376 377 378 379 380
  signal_setup();

  if ( $opt_gcov )
  {
    gcov_prepare();
  }

  if ( $opt_gprof )
  {
    gprof_prepare();
  }

381
  if ( $opt_bench )
unknown's avatar
unknown committed
382
  {
383
    initialize_servers();
unknown's avatar
unknown committed
384 385
    run_benchmarks(shift);      # Shift what? Extra arguments?!
  }
386 387
  elsif ( $opt_stress )
  {
388
    initialize_servers();
389 390
    run_stress_test()
  }
unknown's avatar
unknown committed
391 392
  else
  {
393 394 395 396
    # Figure out which tests we are going to run
    my $tests= collect_test_cases($opt_suite);

    # Turn off NDB and other similar options if no tests use it
397
    my ($need_ndbcluster,$need_im);
398 399
    foreach my $test (@$tests)
    {
400 401
      next if $test->{skip};

402 403
      $need_ndbcluster||= $test->{ndb_test};
      $need_im||= $test->{component_id} eq 'im';
404 405 406 407 408 409 410

      # Count max number of slaves used by a test case
      if ( $test->{slave_num} > $max_slave_num)
      {
	$max_slave_num= $test->{slave_num};
	mtr_error("Too many slaves") if $max_slave_num > 3;
      }
411
      $use_innodb||= $test->{'innodb_test'};
412 413
    }

414 415 416 417 418 419
    # Check if cluster can be skipped
    if ( !$need_ndbcluster )
    {
      $opt_skip_ndbcluster= 1;
      $opt_skip_ndbcluster_slave= 1;
    }
unknown's avatar
unknown committed
420

421 422 423 424 425
    # Check if slave cluster can be skipped
    if ($max_slave_num == 0)
    {
      $opt_skip_ndbcluster_slave= 1;
    }
unknown's avatar
unknown committed
426

427 428 429 430
    # Check if im can be skipped
    if ( ! $need_im )
    {
     $opt_skip_im= 1;
431
    }
unknown's avatar
unknown committed
432

unknown's avatar
unknown committed
433
    initialize_servers();
unknown's avatar
unknown committed
434

435 436 437 438
    if ( $opt_report_features ) {
      run_report_features();
    }

unknown's avatar
unknown committed
439
    run_suite($opt_suite, $tests);
unknown's avatar
unknown committed
440
  }
441

unknown's avatar
unknown committed
442
  mtr_exit(0);
unknown's avatar
unknown committed
443 444 445 446 447 448 449 450 451 452 453 454 455
}


##############################################################################
#
#  Default settings
#
##############################################################################

sub command_line_setup () {

  # These are defaults for things that are set on the command line

unknown's avatar
unknown committed
456
  $opt_suite=        "main";    # Special default suite
unknown's avatar
unknown committed
457 458 459 460
  my $opt_comment;

  my $opt_master_myport=       9306;
  my $opt_slave_myport=        9308;
461 462 463 464
  $opt_ndbcluster_port=        9310;
  $opt_ndbcluster_port_slave=  9311;
  my $im_port=                 9312;
  my $im_mysqld1_port=         9313;
unknown's avatar
unknown committed
465
  my $im_mysqld2_port=         9314;
unknown's avatar
unknown committed
466

unknown's avatar
unknown committed
467 468 469 470 471 472 473 474 475 476
  #
  # To make it easier for different devs to work on the same host,
  # an environment variable can be used to control all ports. A small
  # number is to be used, 0 - 16 or similar.
  #
  # Note the MASTER_MYPORT has to be set the same in all 4.x and 5.x
  # versions of this script, else a 4.0 test run might conflict with a
  # 5.1 test run, even if different MTR_BUILD_THREAD is used. This means
  # all port numbers might not be used in this version of the script.
  #
unknown's avatar
unknown committed
477 478 479 480
  # Also note the limiteation of ports we are allowed to hand out. This
  # differs between operating systems and configuration, see
  # http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html
  # But a fairly safe range seems to be 5001 - 32767
unknown's avatar
unknown committed
481 482
  if ( $ENV{'MTR_BUILD_THREAD'} )
  {
unknown's avatar
Merge  
unknown committed
483
    # Up to two masters, up to three slaves
unknown's avatar
Merge  
unknown committed
484 485 486 487 488 489 490
    $opt_master_myport=         $ENV{'MTR_BUILD_THREAD'} * 10 + 10000; # and 1
    $opt_slave_myport=          $opt_master_myport + 2;  # and 3 4
    $opt_ndbcluster_port=       $opt_master_myport + 5;
    $opt_ndbcluster_port_slave= $opt_master_myport + 6;
    $im_port=                   $opt_master_myport + 7;
    $im_mysqld1_port=           $opt_master_myport + 8;
    $im_mysqld2_port=           $opt_master_myport + 9;
unknown's avatar
unknown committed
491 492
  }

unknown's avatar
unknown committed
493 494 495 496 497 498 499
  if ( $opt_master_myport < 5001 or $opt_master_myport + 10 >= 32767 )
  {
    mtr_error("MTR_BUILD_THREAD number results in a port",
              "outside 5001 - 32767",
              "($opt_master_myport - $opt_master_myport + 10)");
  }

500 501 502 503 504
  # This is needed for test log evaluation in "gen-build-status-page"
  # in all cases where the calling tool does not log the commands
  # directly before it executes them, like "make test-force-pl" in RPM builds.
  print "Logging: $0 ", join(" ", @ARGV), "\n";

unknown's avatar
unknown committed
505
  # Read the command line
unknown's avatar
unknown committed
506
  # Note: Keep list, and the order, in sync with usage at end of this file
unknown's avatar
unknown committed
507

unknown's avatar
unknown committed
508
  Getopt::Long::Configure("pass_through");
unknown's avatar
unknown committed
509
  GetOptions(
unknown's avatar
unknown committed
510
             # Control what engine/variation to run
unknown's avatar
unknown committed
511
             'embedded-server'          => \$opt_embedded_server,
unknown's avatar
unknown committed
512
             'ps-protocol'              => \$opt_ps_protocol,
513 514 515
             'sp-protocol'              => \$opt_sp_protocol,
             'view-protocol'            => \$opt_view_protocol,
             'cursor-protocol'          => \$opt_cursor_protocol,
unknown's avatar
unknown committed
516
             'ssl|with-openssl'         => \$opt_ssl,
517 518
             'skip-ssl'                 => \$opt_skip_ssl,
             'compress'                 => \$opt_compress,
unknown's avatar
unknown committed
519 520
             'bench'                    => \$opt_bench,
             'small-bench'              => \$opt_small_bench,
521
             'with-ndbcluster'          => \$opt_with_ndbcluster,
522
             'vs-config'            => \$opt_vs_config,
unknown's avatar
unknown committed
523 524

             # Control what test suites or cases to run
unknown's avatar
unknown committed
525
             'force'                    => \$opt_force,
unknown's avatar
unknown committed
526
             'with-ndbcluster-only'     => \$opt_with_ndbcluster_only,
unknown's avatar
unknown committed
527
             'skip-ndbcluster|skip-ndb' => \$opt_skip_ndbcluster,
unknown's avatar
unknown committed
528 529 530
             'skip-ndbcluster-slave|skip-ndb-slave'
                                        => \$opt_skip_ndbcluster_slave,
             'ndb-extra-test'           => \$opt_ndb_extra_test,
531 532
             'skip-master-binlog'       => \$opt_skip_master_binlog,
             'skip-slave-binlog'        => \$opt_skip_slave_binlog,
unknown's avatar
unknown committed
533
             'do-test=s'                => \$opt_do_test,
534
             'start-from=s'             => \$opt_start_from,
unknown's avatar
unknown committed
535 536
             'suite=s'                  => \$opt_suite,
             'skip-rpl'                 => \$opt_skip_rpl,
unknown's avatar
unknown committed
537
             'skip-im'                  => \$opt_skip_im,
unknown's avatar
unknown committed
538
             'skip-test=s'              => \$opt_skip_test,
539
             'big-test'                 => \$opt_big_test,
unknown's avatar
unknown committed
540 541 542 543

             # Specify ports
             'master_port=i'            => \$opt_master_myport,
             'slave_port=i'             => \$opt_slave_myport,
unknown's avatar
unknown committed
544
             'ndbcluster-port|ndbcluster_port=i' => \$opt_ndbcluster_port,
545
             'ndbcluster-port-slave=i'  => \$opt_ndbcluster_port_slave,
546 547 548
             'im-port=i'                => \$im_port, # Instance Manager port.
             'im-mysqld1-port=i'        => \$im_mysqld1_port, # Port of mysqld, controlled by IM
             'im-mysqld2-port=i'        => \$im_mysqld2_port, # Port of mysqld, controlled by IM
unknown's avatar
unknown committed
549 550 551

             # Test case authoring
             'record'                   => \$opt_record,
552
             'check-testcases'          => \$opt_check_testcases,
unknown's avatar
unknown committed
553

554
             # Extra options used when starting mysqld
unknown's avatar
unknown committed
555
             'mysqld=s'                 => \@opt_extra_mysqld_opt,
unknown's avatar
unknown committed
556 557 558

             # Run test on running server
             'extern'                   => \$opt_extern,
559 560
             'ndb-connectstring=s'       => \$opt_ndbconnectstring,
             'ndb-connectstring-slave=s' => \$opt_ndbconnectstring_slave,
unknown's avatar
unknown committed
561 562

             # Debugging
unknown's avatar
unknown committed
563
             'gdb'                      => \$opt_gdb,
unknown's avatar
unknown committed
564
             'client-gdb'               => \$opt_client_gdb,
unknown's avatar
unknown committed
565 566
             'manual-gdb'               => \$opt_manual_gdb,
             'manual-debug'             => \$opt_manual_debug,
unknown's avatar
unknown committed
567
             'ddd'                      => \$opt_ddd,
unknown's avatar
unknown committed
568
             'client-ddd'               => \$opt_client_ddd,
569 570
	     'debugger=s'               => \$opt_debugger,
	     'client-debugger=s'        => \$opt_client_debugger,
unknown's avatar
unknown committed
571 572 573 574 575 576
             'strace-client'            => \$opt_strace_client,
             'master-binary=s'          => \$exe_master_mysqld,
             'slave-binary=s'           => \$exe_slave_mysqld,

             # Coverage, profiling etc
             'gcov'                     => \$opt_gcov,
unknown's avatar
unknown committed
577
             'gprof'                    => \$opt_gprof,
578
             'valgrind|valgrind-all'    => \$opt_valgrind,
unknown's avatar
unknown committed
579 580
             'valgrind-mysqltest'       => \$opt_valgrind_mysqltest,
             'valgrind-mysqld'          => \$opt_valgrind_mysqld,
unknown's avatar
unknown committed
581
             'valgrind-options=s'       => \$opt_valgrind_options,
unknown's avatar
unknown committed
582
             'valgrind-path=s'          => \$opt_valgrind_path,
583
	     'callgrind'                => \$opt_callgrind,
unknown's avatar
unknown committed
584

585 586 587 588 589 590 591 592 593 594 595
             # Stress testing 
             'stress'                   => \$opt_stress,
             'stress-suite=s'           => \$opt_stress_suite,
             'stress-threads=i'         => \$opt_stress_threads,
             'stress-test-file=s'       => \$opt_stress_test_file,
             'stress-init-file=s'       => \$opt_stress_init_file,
             'stress-mode=s'            => \$opt_stress_mode,
             'stress-loop-count=i'      => \$opt_stress_loop_count,
             'stress-test-count=i'      => \$opt_stress_test_count,
             'stress-test-duration=i'   => \$opt_stress_test_duration,

596 597 598
	     # Directories
             'tmpdir=s'                 => \$opt_tmpdir,
             'vardir=s'                 => \$opt_vardir,
599
             'benchdir=s'               => \$glob_mysql_bench_dir,
600
             'mem'                      => \$opt_mem,
601

unknown's avatar
unknown committed
602
             # Misc
603
             'report-features'          => \$opt_report_features,
unknown's avatar
unknown committed
604
             'comment=s'                => \$opt_comment,
unknown's avatar
unknown committed
605 606
             'debug'                    => \$opt_debug,
             'fast'                     => \$opt_fast,
unknown's avatar
unknown committed
607
             'reorder'                  => \$opt_reorder,
608
             'enable-disabled'          => \$opt_enable_disabled,
unknown's avatar
unknown committed
609
             'script-debug'             => \$opt_script_debug,
610
             'verbose'                  => \$opt_verbose,
unknown's avatar
unknown committed
611 612
             'sleep=i'                  => \$opt_sleep,
             'socket=s'                 => \$opt_socket,
613
             'start-dirty'              => \$opt_start_dirty,
unknown's avatar
unknown committed
614
             'start-and-exit'           => \$opt_start_and_exit,
615
             'timer!'                   => \$opt_timer,
unknown's avatar
unknown committed
616
             'unified-diff|udiff'       => \$opt_udiff,
unknown's avatar
unknown committed
617 618 619
             'user-test=s'              => \$opt_user_test,
             'user=s'                   => \$opt_user,
             'wait-timeout=i'           => \$opt_wait_timeout,
620 621
             'testcase-timeout=i'       => \$opt_testcase_timeout,
             'suite-timeout=i'          => \$opt_suite_timeout,
unknown's avatar
unknown committed
622
             'warnings|log-warnings'    => \$opt_warnings,
unknown's avatar
unknown committed
623 624

             'help|h'                   => \$opt_usage,
unknown's avatar
unknown committed
625 626
            ) or usage("Can't read options");

unknown's avatar
unknown committed
627 628
  usage("") if $opt_usage;

629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649
  $glob_scriptname=  basename($0);

  # We require that we are in the "mysql-test" directory
  # to run mysql-test-run
  if (! -f $glob_scriptname)
  {
    mtr_error("Can't find the location for the mysql-test-run script\n" .
              "Go to to the mysql-test directory and execute the script " .
              "as follows:\n./$glob_scriptname");
  }

  if ( -d "../sql" )
  {
    $opt_source_dist=  1;
  }

  $glob_hostname=  mtr_short_hostname();

  # 'basedir' is always parent of "mysql-test" directory
  $glob_mysql_test_dir=  cwd();
  if ( $glob_cygwin_perl )
unknown's avatar
unknown committed
650
  {
651 652 653
    # Windows programs like 'mysqld' needs Windows paths
    $glob_mysql_test_dir= `cygpath -m "$glob_mysql_test_dir"`;
    chomp($glob_mysql_test_dir);
unknown's avatar
unknown committed
654
  }
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
  $glob_basedir=         dirname($glob_mysql_test_dir);

  # Expect mysql-bench to be located adjacent to the source tree, by default
  $glob_mysql_bench_dir= "$glob_basedir/../mysql-bench"
    unless defined $glob_mysql_bench_dir;

  $path_my_basedir=
    $opt_source_dist ? $glob_mysql_test_dir : $glob_basedir;

  $glob_timers= mtr_init_timers();

  #
  # Find the mysqld executable to be able to find the mysqld version
  # number as early as possible
  #

  # Look for the client binaries
  $path_client_bindir= mtr_path_exists(vs_config_dirs('client', ''),
				       "$glob_basedir/client_release",
				       "$glob_basedir/client_debug",
675 676
				       "$glob_basedir/client",
				       "$glob_basedir/bin");
677 678 679 680 681 682 683 684 685 686 687 688 689 690

  $exe_mysqld=         mtr_exe_exists (vs_config_dirs('sql', 'mysqld'),
				       "$glob_basedir/sql/mysqld",
				       "$path_client_bindir/mysqld-max-nt",
				       "$path_client_bindir/mysqld-max",
				       "$path_client_bindir/mysqld-nt",
				       "$path_client_bindir/mysqld",
				       "$path_client_bindir/mysqld-debug",
				       "$path_client_bindir/mysqld-max",
				       "$glob_basedir/libexec/mysqld",
				       "$glob_basedir/bin/mysqld");

  # Use the mysqld found above to find out what features are available
  collect_mysqld_features();
unknown's avatar
unknown committed
691

unknown's avatar
unknown committed
692
  if ( $opt_comment )
unknown's avatar
unknown committed
693
  {
unknown's avatar
unknown committed
694 695 696 697
    print "\n";
    print '#' x 78, "\n";
    print "# $opt_comment\n";
    print '#' x 78, "\n\n";
unknown's avatar
unknown committed
698
  }
unknown's avatar
unknown committed
699

unknown's avatar
unknown committed
700 701 702 703 704 705
  foreach my $arg ( @ARGV )
  {
    if ( $arg =~ /^--skip-/ )
    {
      push(@opt_extra_mysqld_opt, $arg);
    }
706 707 708 709 710 711
    elsif ( $arg =~ /^--$/ )
    {
      # It is an effect of setting 'pass_through' in option processing
      # that the lone '--' separating options from arguments survives,
      # simply ignore it.
    }
unknown's avatar
unknown committed
712 713 714 715 716 717 718 719 720
    elsif ( $arg =~ /^-/ )
    {
      usage("Invalid option \"$arg\"");
    }
    else
    {
      push(@opt_cases, $arg);
    }
  }
unknown's avatar
unknown committed
721

722 723 724 725 726
  # --------------------------------------------------------------------------
  # Find out type of logging that are being used
  # --------------------------------------------------------------------------
  # NOTE if the default binlog format is changed, this has to be changed
  $used_binlog_format= "stmt";
727
  if ( $mysql_version_id >= 50100 )
728
  {
729 730 731
    $used_binlog_format= "mixed"; # Default value for binlog format

    foreach my $arg ( @opt_extra_mysqld_opt )
732
    {
733 734 735 736
      if ( $arg =~ /binlog-format=(\S+)/ )
      {
	$used_binlog_format= $1;
      }
737
    }
738
    mtr_report("Using binlog format '$used_binlog_format'");
739 740
  }

741
  # --------------------------------------------------------------------------
742
  # Check if we should speed up tests by trying to run on tmpfs
743
  # --------------------------------------------------------------------------
744
  if ( defined $opt_mem )
745 746 747 748 749 750
  {
    mtr_error("Can't use --mem and --vardir at the same time ")
      if $opt_vardir;
    mtr_error("Can't use --mem and --tmpdir at the same time ")
      if $opt_tmpdir;

751 752 753 754 755
    # Search through list of locations that are known
    # to be "fast disks" to list to find a suitable location
    # Use --mem=<dir> as first location to look.
    my @tmpfs_locations= ($opt_mem, "/dev/shm", "/tmp");

756 757 758 759 760 761 762 763 764 765 766
    foreach my $fs (@tmpfs_locations)
    {
      if ( -d $fs )
      {
	mtr_report("Using tmpfs in $fs");
	$opt_mem= "$fs/var";
	$opt_mem .= $ENV{'MTR_BUILD_THREAD'} if $ENV{'MTR_BUILD_THREAD'};
	last;
      }
    }
  }
767

768 769 770
  # --------------------------------------------------------------------------
  # Set the "var/" directory, as it is the base for everything else
  # --------------------------------------------------------------------------
771
  $default_vardir= "$glob_mysql_test_dir/var";
772 773
  if ( ! $opt_vardir )
  {
774
    $opt_vardir= $default_vardir;
775
  }
776
  elsif ( $mysql_version_id < 50000 and
777
	  $opt_vardir ne $default_vardir)
unknown's avatar
unknown committed
778
  {
779 780 781
    # Version 4.1 and --vardir was specified
    # Only supported as a symlink from var/
    # by setting up $opt_mem that symlink will be created
782 783 784 785 786 787 788
    if ( ! $glob_win32 )
    {
      # Only platforms that have native symlinks can use the vardir trick
      $opt_mem= $opt_vardir;
      mtr_report("Using 4.1 vardir trick");
    }

789
    $opt_vardir= $default_vardir;
790
  }
unknown's avatar
unknown committed
791 792

  $path_vardir_trace= $opt_vardir;
unknown's avatar
unknown committed
793
  # Chop off any "c:", DBUG likes a unix path ex: c:/src/... => /src/...
unknown's avatar
unknown committed
794
  $path_vardir_trace=~ s/^\w://;
unknown's avatar
unknown committed
795

unknown's avatar
unknown committed
796 797 798
  # We make the path absolute, as the server will do a chdir() before usage
  unless ( $opt_vardir =~ m,^/, or
           ($glob_win32 and $opt_vardir =~ m,^[a-z]:/,i) )
799 800 801 802
  {
    # Make absolute path, relative test dir
    $opt_vardir= "$glob_mysql_test_dir/$opt_vardir";
  }
unknown's avatar
unknown committed
803

804
  # --------------------------------------------------------------------------
805
  # Set tmpdir
806 807
  # --------------------------------------------------------------------------
  $opt_tmpdir=       "$opt_vardir/tmp" unless $opt_tmpdir;
unknown's avatar
unknown committed
808
  $opt_tmpdir =~ s,/+$,,;       # Remove ending slash if any
unknown's avatar
unknown committed
809

810
  # --------------------------------------------------------------------------
811
  # Set socket
812
  # --------------------------------------------------------------------------
813 814 815
  if (!$opt_socket)
  {
    $opt_socket=  $mysqld_variables{'socket'};
unknown's avatar
unknown committed
816 817 818
  }

  # --------------------------------------------------------------------------
819
  # Check im suport
unknown's avatar
unknown committed
820
  # --------------------------------------------------------------------------
821
  if ( $mysql_version_id < 50000 )
unknown's avatar
unknown committed
822
  {
823 824 825
    # Instance manager is not supported until 5.0
    $opt_skip_im= 1;

unknown's avatar
unknown committed
826 827
  }

828 829 830 831
  if ( $glob_win32 )
  {
    mtr_report("Disable Instance manager - not supported on Windows");
    $opt_skip_im= 1;
unknown's avatar
unknown committed
832 833 834
  }

  # --------------------------------------------------------------------------
835
  # Record flag
unknown's avatar
unknown committed
836
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
837
  if ( $opt_record and ! @opt_cases )
unknown's avatar
unknown committed
838 839 840 841
  {
    mtr_error("Will not run in record mode without a specific test case");
  }

842 843 844
  # --------------------------------------------------------------------------
  # Embedded server flag
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
845 846 847
  if ( $opt_embedded_server )
  {
    $glob_use_embedded_server= 1;
unknown's avatar
unknown committed
848
    push(@glob_test_mode, "embedded");
unknown's avatar
unknown committed
849
    $opt_skip_rpl= 1;              # We never run replication with embedded
unknown's avatar
unknown committed
850 851
    $opt_skip_ndbcluster= 1;       # Turn off use of NDB cluster
    $opt_skip_ssl= 1;              # Turn off use of SSL
unknown's avatar
unknown committed
852 853 854

    if ( $opt_extern )
    {
unknown's avatar
unknown committed
855
      mtr_error("Can't use --extern with --embedded-server");
unknown's avatar
unknown committed
856 857 858
    }
  }

859 860 861 862

  # --------------------------------------------------------------------------
  # ps protcol flag
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
863 864 865 866 867
  if ( $opt_ps_protocol )
  {
    push(@glob_test_mode, "ps-protocol");
  }

868 869 870
  # --------------------------------------------------------------------------
  # Ndb cluster flags
  # --------------------------------------------------------------------------
871
  if ( $opt_with_ndbcluster and !$opt_bench)
unknown's avatar
unknown committed
872
  {
873
    mtr_error("Can only use --with-ndbcluster togheter with --bench");
unknown's avatar
unknown committed
874 875
  }

unknown's avatar
unknown committed
876 877 878
  if ( $opt_ndbconnectstring )
  {
    $glob_use_running_ndbcluster= 1;
unknown's avatar
unknown committed
879 880 881 882
    mtr_error("Can't specify --ndb-connectstring and --skip-ndbcluster")
      if $opt_skip_ndbcluster;
    mtr_error("Can't specify --ndb-connectstring and --ndbcluster-port")
      if $opt_ndbcluster_port;
unknown's avatar
unknown committed
883 884 885
  }
  else
  {
unknown's avatar
unknown committed
886
    # Set default connect string
unknown's avatar
unknown committed
887 888 889
    $opt_ndbconnectstring= "host=localhost:$opt_ndbcluster_port";
  }

unknown's avatar
unknown committed
890
  if ( $opt_ndbconnectstring_slave )
unknown's avatar
unknown committed
891
  {
unknown's avatar
unknown committed
892 893 894 895 896 897 898
      $glob_use_running_ndbcluster_slave= 1;
      mtr_error("Can't specify ndb-connectstring_slave and " .
		"--skip-ndbcluster-slave")
	if $opt_skip_ndbcluster;
      mtr_error("Can't specify --ndb-connectstring-slave and " .
		"--ndbcluster-port-slave")
	if $opt_ndbcluster_port_slave;
unknown's avatar
unknown committed
899 900 901
  }
  else
  {
unknown's avatar
unknown committed
902 903
    # Set default connect string
    $opt_ndbconnectstring_slave= "host=localhost:$opt_ndbcluster_port_slave";
unknown's avatar
unknown committed
904
  }
unknown's avatar
unknown committed
905

906 907 908
  # --------------------------------------------------------------------------
  # Bench flags
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
909 910 911 912 913
  if ( $opt_small_bench )
  {
    $opt_bench=  1;
  }

914 915 916
  # --------------------------------------------------------------------------
  # Sleep flag
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
917 918
  if ( $opt_sleep )
  {
unknown's avatar
unknown committed
919
    $opt_sleep_time_after_restart= $opt_sleep;
unknown's avatar
unknown committed
920 921
  }

922 923 924
  # --------------------------------------------------------------------------
  # Gcov flag
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
925
  if ( $opt_gcov and ! $opt_source_dist )
unknown's avatar
unknown committed
926
  {
unknown's avatar
unknown committed
927 928 929
    mtr_error("Coverage test needs the source - please use source dist");
  }

930
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
931
  # Check debug related options
932
  # --------------------------------------------------------------------------
933
  if ( $opt_gdb || $opt_client_gdb || $opt_ddd || $opt_client_ddd ||
934 935
       $opt_manual_gdb || $opt_manual_ddd || $opt_manual_debug ||
       $opt_debugger || $opt_client_debugger )
unknown's avatar
unknown committed
936
  {
937
    # Indicate that we are using debugger
unknown's avatar
unknown committed
938 939
    $glob_debugger= 1;
    # Increase timeouts
unknown's avatar
unknown committed
940 941 942
    $opt_wait_timeout=  300;
    if ( $opt_extern )
    {
unknown's avatar
unknown committed
943
      mtr_error("Can't use --extern when using debugger");
unknown's avatar
unknown committed
944 945 946
    }
  }

947 948 949 950 951
  # --------------------------------------------------------------------------
  # Check if special exe was selected for master or slave
  # --------------------------------------------------------------------------
  $exe_master_mysqld= $exe_master_mysqld || $exe_mysqld;
  $exe_slave_mysqld=  $exe_slave_mysqld  || $exe_mysqld;
952

953
  # --------------------------------------------------------------------------
954
  # Check valgrind arguments
955
  # --------------------------------------------------------------------------
956
  if ( $opt_valgrind or $opt_valgrind_path or defined $opt_valgrind_options)
unknown's avatar
unknown committed
957
  {
unknown's avatar
unknown committed
958 959 960 961
    mtr_report("Turning on valgrind for all executables");
    $opt_valgrind= 1;
    $opt_valgrind_mysqld= 1;
    $opt_valgrind_mysqltest= 1;
unknown's avatar
unknown committed
962
  }
963
  elsif ( $opt_valgrind_mysqld )
unknown's avatar
unknown committed
964
  {
965
    mtr_report("Turning on valgrind for mysqld(s) only");
unknown's avatar
unknown committed
966
    $opt_valgrind= 1;
967 968 969
  }
  elsif ( $opt_valgrind_mysqltest )
  {
970
    mtr_report("Turning on valgrind for mysqltest and mysql_client_test only");
unknown's avatar
unknown committed
971
    $opt_valgrind= 1;
972 973
  }

974 975 976 977 978 979 980 981 982 983 984
  if ( $opt_callgrind )
  {
    mtr_report("Turning on valgrind with callgrind for mysqld(s)");
    $opt_valgrind= 1;
    $opt_valgrind_mysqld= 1;

    # Set special valgrind options unless options passed on command line
    $opt_valgrind_options="--trace-children=yes"
      unless defined $opt_valgrind_options;
  }

985 986 987 988 989 990 991
  if ( $opt_valgrind )
  {
    # Set valgrind_options to default unless already defined
    $opt_valgrind_options=$default_valgrind_options
      unless defined $opt_valgrind_options;

    mtr_report("Running valgrind with options \"$opt_valgrind_options\"");
unknown's avatar
unknown committed
992 993 994 995 996
  }

  if ( ! $opt_testcase_timeout )
  {
    $opt_testcase_timeout= $default_testcase_timeout;
997
    $opt_testcase_timeout*= 10 if $opt_valgrind;
unknown's avatar
unknown committed
998 999 1000 1001 1002
  }

  if ( ! $opt_suite_timeout )
  {
    $opt_suite_timeout= $default_suite_timeout;
1003
    $opt_suite_timeout*= 6 if $opt_valgrind;
unknown's avatar
unknown committed
1004
  }
unknown's avatar
unknown committed
1005

unknown's avatar
unknown committed
1006 1007
  # Increase times to wait for executables to start if using valgrind
  if ( $opt_valgrind )
unknown's avatar
unknown committed
1008 1009 1010 1011
  {
    $opt_sleep_time_after_restart= 10;
    $opt_sleep_time_for_delete= 60;
  }
unknown's avatar
unknown committed
1012

unknown's avatar
unknown committed
1013
  if ( ! $opt_user )
unknown's avatar
unknown committed
1014
  {
unknown's avatar
unknown committed
1015 1016 1017 1018 1019 1020 1021 1022
    if ( $glob_use_running_server )
    {
      $opt_user= "test";
    }
    else
    {
      $opt_user= "root"; # We want to do FLUSH xxx commands
    }
unknown's avatar
unknown committed
1023 1024
  }

1025 1026 1027 1028 1029 1030
  # On QNX, /tmp/dir/master.sock and /tmp/dir//master.sock seem to be
  # considered different, so avoid the extra slash (/) in the socket
  # paths.
  my $sockdir = $opt_tmpdir;
  $sockdir =~ s|/+$||;

1031 1032
  # Put this into a hash, will be a C struct

unknown's avatar
unknown committed
1033 1034
  $master->[0]=
  {
unknown's avatar
unknown committed
1035
   pid           => 0,
unknown's avatar
unknown committed
1036 1037
   type          => "master",
   idx           => 0,
unknown's avatar
unknown committed
1038 1039 1040
   path_myddir   => "$opt_vardir/master-data",
   path_myerr    => "$opt_vardir/log/master.err",
   path_mylog    => "$opt_vardir/log/master.log",
unknown's avatar
unknown committed
1041 1042 1043
   path_pid    => "$opt_vardir/run/master.pid",
   path_sock   => "$sockdir/master.sock",
   port   =>  $opt_master_myport,
unknown's avatar
unknown committed
1044
   start_timeout =>  400, # enough time create innodb tables
unknown's avatar
unknown committed
1045
   cluster       =>  0, # index in clusters list
1046
   start_opts    => [],
unknown's avatar
unknown committed
1047 1048 1049 1050
  };

  $master->[1]=
  {
unknown's avatar
unknown committed
1051
   pid           => 0,
unknown's avatar
unknown committed
1052 1053
   type          => "master",
   idx           => 1,
unknown's avatar
unknown committed
1054 1055 1056
   path_myddir   => "$opt_vardir/master1-data",
   path_myerr    => "$opt_vardir/log/master1.err",
   path_mylog    => "$opt_vardir/log/master1.log",
unknown's avatar
unknown committed
1057 1058 1059
   path_pid    => "$opt_vardir/run/master1.pid",
   path_sock   => "$sockdir/master1.sock",
   port   => $opt_master_myport + 1,
unknown's avatar
unknown committed
1060
   start_timeout => 400, # enough time create innodb tables
unknown's avatar
unknown committed
1061
   cluster       =>  0, # index in clusters list
1062
   start_opts    => [],
unknown's avatar
unknown committed
1063 1064 1065 1066
  };

  $slave->[0]=
  {
unknown's avatar
unknown committed
1067
   pid           => 0,
unknown's avatar
unknown committed
1068 1069
   type          => "slave",
   idx           => 0,
unknown's avatar
unknown committed
1070 1071 1072
   path_myddir   => "$opt_vardir/slave-data",
   path_myerr    => "$opt_vardir/log/slave.err",
   path_mylog    => "$opt_vardir/log/slave.log",
unknown's avatar
unknown committed
1073 1074 1075
   path_pid    => "$opt_vardir/run/slave.pid",
   path_sock   => "$sockdir/slave.sock",
   port   => $opt_slave_myport,
unknown's avatar
unknown committed
1076
   start_timeout => 400,
unknown's avatar
unknown committed
1077

unknown's avatar
unknown committed
1078
   cluster       =>  1, # index in clusters list
1079
   start_opts    => [],
unknown's avatar
unknown committed
1080 1081 1082 1083
  };

  $slave->[1]=
  {
unknown's avatar
unknown committed
1084
   pid           => 0,
unknown's avatar
unknown committed
1085 1086
   type          => "slave",
   idx           => 1,
unknown's avatar
unknown committed
1087 1088 1089
   path_myddir   => "$opt_vardir/slave1-data",
   path_myerr    => "$opt_vardir/log/slave1.err",
   path_mylog    => "$opt_vardir/log/slave1.log",
unknown's avatar
unknown committed
1090 1091 1092
   path_pid    => "$opt_vardir/run/slave1.pid",
   path_sock   => "$sockdir/slave1.sock",
   port   => $opt_slave_myport + 1,
unknown's avatar
unknown committed
1093
   start_timeout => 300,
unknown's avatar
unknown committed
1094
   cluster       =>  -1, # index in clusters list
1095
   start_opts    => [],
unknown's avatar
unknown committed
1096 1097 1098 1099
  };

  $slave->[2]=
  {
unknown's avatar
unknown committed
1100
   pid           => 0,
unknown's avatar
unknown committed
1101 1102
   type          => "slave",
   idx           => 2,
unknown's avatar
unknown committed
1103 1104 1105
   path_myddir   => "$opt_vardir/slave2-data",
   path_myerr    => "$opt_vardir/log/slave2.err",
   path_mylog    => "$opt_vardir/log/slave2.log",
unknown's avatar
unknown committed
1106 1107 1108
   path_pid    => "$opt_vardir/run/slave2.pid",
   path_sock   => "$sockdir/slave2.sock",
   port   => $opt_slave_myport + 2,
unknown's avatar
unknown committed
1109
   start_timeout => 300,
unknown's avatar
unknown committed
1110
   cluster       =>  -1, # index in clusters list
1111
   start_opts    => [],
unknown's avatar
unknown committed
1112
  };
1113

unknown's avatar
Merge  
unknown committed
1114 1115 1116 1117 1118
  $instance_manager=
  {
   path_err =>        "$opt_vardir/log/im.err",
   path_log =>        "$opt_vardir/log/im.log",
   path_pid =>        "$opt_vardir/run/im.pid",
1119
   path_angel_pid =>  "$opt_vardir/run/im.angel.pid",
1120
   path_sock =>       "$sockdir/im.sock",
unknown's avatar
Merge  
unknown committed
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
   port =>            $im_port,
   start_timeout =>   $master->[0]->{'start_timeout'},
   admin_login =>     'im_admin',
   admin_password =>  'im_admin_secret',
   admin_sha1 =>      '*598D51AD2DFF7792045D6DF3DDF9AA1AF737B295',
   password_file =>   "$opt_vardir/im.passwd",
   defaults_file =>   "$opt_vardir/im.cnf",
  };

  $instance_manager->{'instances'}->[0]=
  {
   server_id    => 1,
   port         => $im_mysqld1_port,
   path_datadir => "$opt_vardir/im_mysqld_1.data",
1135
   path_sock    => "$sockdir/mysqld_1.sock",
unknown's avatar
unknown committed
1136
   path_pid     => "$opt_vardir/run/mysqld_1.pid",
1137
   start_timeout  => 400, # enough time create innodb tables
1138
   old_log_format => 1
unknown's avatar
Merge  
unknown committed
1139 1140 1141 1142 1143 1144 1145
  };

  $instance_manager->{'instances'}->[1]=
  {
   server_id    => 2,
   port         => $im_mysqld2_port,
   path_datadir => "$opt_vardir/im_mysqld_2.data",
1146
   path_sock    => "$sockdir/mysqld_2.sock",
unknown's avatar
unknown committed
1147
   path_pid     => "$opt_vardir/run/mysqld_2.pid",
unknown's avatar
Merge  
unknown committed
1148
   nonguarded   => 1,
1149
   start_timeout  => 400, # enough time create innodb tables
1150
   old_log_format => 1
unknown's avatar
Merge  
unknown committed
1151
  };
1152

unknown's avatar
unknown committed
1153 1154 1155 1156 1157 1158 1159 1160 1161 1162
  my $data_dir= "$opt_vardir/ndbcluster-$opt_ndbcluster_port";
  $clusters->[0]=
  {
   name            => "Master",
   nodes           => 2,
   port            => "$opt_ndbcluster_port",
   data_dir        => "$data_dir",
   connect_string  => "$opt_ndbconnectstring",
   path_pid        => "$data_dir/ndb_3.pid", # Nodes + 1
   pid             => 0, # pid of ndb_mgmd
1163
   installed_ok    => 0,
unknown's avatar
unknown committed
1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
  };

  $data_dir= "$opt_vardir/ndbcluster-$opt_ndbcluster_port_slave";
  $clusters->[1]=
  {
   name            => "Slave",
   nodes           => 1,
   port            => "$opt_ndbcluster_port_slave",
   data_dir        => "$data_dir",
   connect_string  => "$opt_ndbconnectstring_slave",
   path_pid        => "$data_dir/ndb_2.pid", # Nodes + 1
   pid             => 0, # pid of ndb_mgmd
1176
   installed_ok    => 0,
unknown's avatar
unknown committed
1177 1178 1179 1180 1181 1182 1183
  };

  # Init pids of ndbd's
  foreach my $cluster ( @{$clusters} )
  {
    for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
    {
1184
      my $nodeid= $idx+1;
unknown's avatar
unknown committed
1185 1186 1187
      $cluster->{'ndbds'}->[$idx]=
	{
	 pid      => 0,
1188 1189 1190
	 nodeid => $nodeid,
	 path_pid => "$cluster->{'data_dir'}/ndb_${nodeid}.pid",
	 path_fs => "$cluster->{'data_dir'}/ndb_${nodeid}_fs",
unknown's avatar
unknown committed
1191 1192 1193 1194
	};
    }
  }

1195 1196 1197 1198
  if ( $opt_extern )
  {
    $glob_use_running_server=  1;
    $opt_skip_rpl= 1;                   # We don't run rpl test cases
unknown's avatar
unknown committed
1199
    $master->[0]->{'path_sock'}=  $opt_socket;
1200 1201 1202
  }

  $path_timefile=  "$opt_vardir/log/mysqltest-time";
1203
  $path_mysqltest_log=  "$opt_vardir/log/mysqltest.log";
1204
  $path_current_test_log= "$opt_vardir/log/current_test";
unknown's avatar
unknown committed
1205
  $path_ndb_testrun_log= "$opt_vardir/log/ndb_testrun.log";
1206 1207

  $path_snapshot= "$opt_tmpdir/snapshot_$opt_master_myport/";
1208 1209
}

1210
sub datadir_setup () {
1211 1212 1213 1214

  # Make a list of all data_dirs
  @data_dir_lst = (
    $master->[0]->{'path_myddir'},
1215
    $master->[1]->{'path_myddir'});
1216

1217
  for (my $idx= 0; $idx < $max_slave_num; $idx++)
1218
  {
1219
    push(@data_dir_lst, $slave->[$idx]->{'path_myddir'});
1220 1221
  }

1222 1223 1224 1225 1226 1227 1228
  unless ($opt_skip_im)
  {
    foreach my $instance (@{$instance_manager->{'instances'}})
    {
      push(@data_dir_lst, $instance->{'path_datadir'});
    }
  }
unknown's avatar
unknown committed
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238
}


##############################################################################
#
#  Set paths to various executable programs
#
##############################################################################


1239
sub collect_mysqld_features () {
1240
  #
unknown's avatar
unknown committed
1241 1242
  # Execute "mysqld --no-defaults --help --verbose", that will
  # print out version and a list of all features and settings
1243
  #
unknown's avatar
unknown committed
1244
  my $found_variable_list_start= 0;
1245
  my $spec_file= "$glob_mysql_test_dir/mysqld.spec.$$";
unknown's avatar
unknown committed
1246 1247 1248 1249 1250
  if ( mtr_run($exe_mysqld,
	       ["--no-defaults",
	        "--verbose",
	        "--help"],
	       "", "$spec_file", "$spec_file", "") != 0 )
1251
  {
unknown's avatar
unknown committed
1252 1253
    mtr_error("Failed to get version and list of features from %s",
	      $exe_mysqld);
1254 1255
  }

unknown's avatar
unknown committed
1256 1257
  my $F= IO::File->new($spec_file) or
    mtr_error("can't open file \"$spec_file\": $!");
unknown's avatar
unknown committed
1258

unknown's avatar
unknown committed
1259
  while ( my $line= <$F> )
unknown's avatar
unknown committed
1260
  {
unknown's avatar
unknown committed
1261 1262
    # First look for version
    if ( !$mysql_version_id )
unknown's avatar
unknown committed
1263
    {
unknown's avatar
unknown committed
1264
      # Look for version
1265 1266 1267
      my $exe_name= basename($exe_mysqld);
      mtr_verbose("exe_name: $exe_name");
      if ( $line =~ /^\S*$exe_name\s\sVer\s([0-9]*)\.([0-9]*)\.([0-9]*)/ )
unknown's avatar
unknown committed
1268
      {
1269
	#print "Major: $1 Minor: $2 Build: $3\n";
unknown's avatar
unknown committed
1270
	$mysql_version_id= $1*10000 + $2*100 + $3;
1271 1272
	#print "mysql_version_id: $mysql_version_id\n";
	mtr_report("MySQL Version $1.$2.$3");
unknown's avatar
unknown committed
1273
      }
unknown's avatar
unknown committed
1274 1275 1276
    }
    else
    {
unknown's avatar
unknown committed
1277
      if (!$found_variable_list_start)
unknown's avatar
unknown committed
1278
      {
unknown's avatar
unknown committed
1279
	# Look for start of variables list
1280
	if ( $line =~ /[\-]+\s[\-]+/ )
unknown's avatar
unknown committed
1281 1282 1283
	{
	  $found_variable_list_start= 1;
	}
1284 1285 1286
      }
      else
      {
unknown's avatar
unknown committed
1287
	# Put variables into hash
1288
	if ( $line =~ /^([\S]+)[ \t]+(.*?)\r?$/ )
unknown's avatar
unknown committed
1289
	{
1290
	  # print "$1=\"$2\"\n";
unknown's avatar
unknown committed
1291 1292
	  $mysqld_variables{$1}= $2;
	}
1293 1294
	else
	{
1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
	  # The variable list is ended with a blank line
	  if ( $line =~ /^[\s]*$/ )
	  {
	    last;
	  }
	  else
	  {
	    # Send out a warning, we should fix the variables that has no
	    # space between variable name and it's value
	    # or should it be fixed width column parsing? It does not
	    # look like that in function my_print_variables in my_getopt.c
	    mtr_warning("Could not parse variable list line : $line");
	  }
1308
	}
unknown's avatar
unknown committed
1309
      }
unknown's avatar
unknown committed
1310
    }
unknown's avatar
unknown committed
1311
  }
1312
  unlink($spec_file);
unknown's avatar
unknown committed
1313
  mtr_error("Could not find version of MySQL") unless $mysql_version_id;
1314
  mtr_error("Could not find variabes list") unless $found_variable_list_start;
unknown's avatar
unknown committed
1315 1316 1317 1318

}


1319 1320 1321 1322 1323 1324
sub executable_setup_im () {

  # Look for instance manager binary - mysqlmanager
  $exe_im=
    mtr_exe_maybe_exists(
      "$glob_basedir/server-tools/instance-manager/mysqlmanager",
1325 1326
      "$glob_basedir/libexec/mysqlmanager",
      "$glob_basedir/bin/mysqlmanager");
1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367

  return ($exe_im eq "");
}

sub executable_setup_ndb () {

  # Look for ndb tols and binaries
  my $ndb_path= mtr_file_exists("$glob_basedir/ndb",
				"$glob_basedir/storage/ndb",
				"$glob_basedir/bin");

  $exe_ndbd=
    mtr_exe_maybe_exists("$ndb_path/src/kernel/ndbd",
			 "$ndb_path/ndbd");
  $exe_ndb_mgm=
    mtr_exe_maybe_exists("$ndb_path/src/mgmclient/ndb_mgm",
			 "$ndb_path/ndb_mgm");
  $exe_ndb_mgmd=
    mtr_exe_maybe_exists("$ndb_path/src/mgmsrv/ndb_mgmd",
			 "$ndb_path/ndb_mgmd");
  $exe_ndb_waiter=
    mtr_exe_maybe_exists("$ndb_path/tools/ndb_waiter",
			 "$ndb_path/ndb_waiter");

  # May not exist
  $path_ndb_tools_dir= mtr_file_exists("$ndb_path/tools",
				       "$ndb_path");
  # May not exist
  $path_ndb_examples_dir=
    mtr_file_exists("$ndb_path/ndbapi-examples",
		    "$ndb_path/examples");
  # May not exist
  $exe_ndb_example=
    mtr_file_exists("$path_ndb_examples_dir/ndbapi_simple/ndbapi_simple");

  return ( $exe_ndbd eq "" or
	   $exe_ndb_mgm eq "" or
	   $exe_ndb_mgmd eq "" or
	   $exe_ndb_waiter eq "");
}

unknown's avatar
unknown committed
1368 1369
sub executable_setup () {

1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384
  #
  # Check if libtool is available in this distribution/clone
  # we need it when valgrinding or debugging non installed binary
  # Otherwise valgrind will valgrind the libtool wrapper or bash
  # and gdb will not find the real executable to debug
  #
  if ( -x "../libtool")
  {
    $exe_libtool= "../libtool";
    if ($opt_valgrind or $glob_debugger)
    {
      mtr_report("Using \"$exe_libtool\" when running valgrind or debugger");
    }
  }

unknown's avatar
unknown committed
1385
  # Look for language files and charsetsdir, use same share
1386
  my $path_share=      mtr_path_exists("$glob_basedir/share/mysql",
unknown's avatar
unknown committed
1387 1388
				       "$glob_basedir/sql/share",
				       "$glob_basedir/share");
unknown's avatar
unknown committed
1389

unknown's avatar
unknown committed
1390 1391
  $path_language=      mtr_path_exists("$path_share/english");
  $path_charsetsdir=   mtr_path_exists("$path_share/charsets");
unknown's avatar
unknown committed
1392

unknown's avatar
unknown committed
1393 1394
  # Look for my_print_defaults
  $exe_my_print_defaults=
1395 1396 1397
    mtr_exe_exists(vs_config_dirs('extra', 'my_print_defaults'),
		           "$path_client_bindir/my_print_defaults",
		           "$glob_basedir/extra/my_print_defaults");
unknown's avatar
unknown committed
1398

unknown's avatar
unknown committed
1399
  # Look for perror
1400 1401 1402
  $exe_perror= mtr_exe_exists(vs_config_dirs('extra', 'perror'),
			                  "$glob_basedir/extra/perror",
			                  "$path_client_bindir/perror");
unknown's avatar
unknown committed
1403

unknown's avatar
unknown committed
1404 1405 1406 1407 1408 1409 1410 1411
  # Look for the client binaries
  $exe_mysqlcheck=     mtr_exe_exists("$path_client_bindir/mysqlcheck");
  $exe_mysqldump=      mtr_exe_exists("$path_client_bindir/mysqldump");
  $exe_mysqlimport=    mtr_exe_exists("$path_client_bindir/mysqlimport");
  $exe_mysqlshow=      mtr_exe_exists("$path_client_bindir/mysqlshow");
  $exe_mysqlbinlog=    mtr_exe_exists("$path_client_bindir/mysqlbinlog");
  $exe_mysqladmin=     mtr_exe_exists("$path_client_bindir/mysqladmin");
  $exe_mysql=          mtr_exe_exists("$path_client_bindir/mysql");
1412
  if ( $mysql_version_id >= 50100 )
unknown's avatar
unknown committed
1413
  {
1414 1415 1416 1417 1418 1419 1420 1421 1422
    $exe_mysqlslap=    mtr_exe_exists("$path_client_bindir/mysqlslap");
  }
  if ( $mysql_version_id >= 50000 and !$glob_use_embedded_server )
  {
    $exe_mysql_upgrade= mtr_exe_exists("$path_client_bindir/mysql_upgrade")
  }
  else
  {
    $exe_mysql_upgrade= "";
1423
  }
unknown's avatar
unknown committed
1424

1425 1426 1427
  if ( ! $glob_win32 )
  {
    # Look for mysql_fix_system_table script
unknown's avatar
unknown committed
1428
    $exe_mysql_fix_system_tables=
1429
      mtr_script_exists("$glob_basedir/scripts/mysql_fix_privilege_tables",
1430
			"$path_client_bindir/mysql_fix_privilege_tables");
unknown's avatar
unknown committed
1431
  }
unknown's avatar
unknown committed
1432

unknown's avatar
unknown committed
1433

1434
  if ( ! $opt_skip_ndbcluster and executable_setup_ndb())
unknown's avatar
unknown committed
1435
  {
1436 1437 1438 1439 1440
    mtr_warning("Could not find all required ndb binaries, " .
		"all ndb tests will fail, use --skip-ndbcluster to " .
		"skip testing it.");

    foreach my $cluster (@{$clusters})
unknown's avatar
unknown committed
1441
    {
1442
      $cluster->{"executable_setup_failed"}= 1;
unknown's avatar
unknown committed
1443
    }
1444
  }
1445

1446 1447 1448 1449 1450 1451
  if ( ! $opt_skip_im and executable_setup_im())
  {
    mtr_warning("Could not find all required instance manager binaries, " .
		"all im tests will fail, use --skip-im to " .
		"continue without instance manager");
    $instance_manager->{"executable_setup_failed"}= 1;
unknown's avatar
unknown committed
1452 1453
  }

unknown's avatar
unknown committed
1454 1455
  # Look for the udf_example library
  $lib_udf_example=
1456 1457
    mtr_file_exists(vs_config_dirs('sql', 'udf_example.dll'),
                    "$glob_basedir/sql/.libs/udf_example.so",);
1458

unknown's avatar
unknown committed
1459 1460
  # Look for mysqltest executable
  if ( $glob_use_embedded_server )
unknown's avatar
unknown committed
1461
  {
unknown's avatar
unknown committed
1462
    $exe_mysqltest=
1463 1464
      mtr_exe_exists(vs_config_dirs('libmysqld/examples','mysqltest_embedded'),
                     "$glob_basedir/libmysqld/examples/mysqltest_embedded",
1465
                     "$path_client_bindir/mysqltest_embedded");
unknown's avatar
unknown committed
1466
  }
unknown's avatar
unknown committed
1467 1468
  else
  {
1469
    $exe_mysqltest= mtr_exe_exists("$path_client_bindir/mysqltest");
unknown's avatar
unknown committed
1470
  }
1471

1472 1473 1474
  # Look for mysql_client_test executable which may _not_ exist in
  # some versions, test using it should be skipped
  if ( $glob_use_embedded_server )
unknown's avatar
unknown committed
1475
  {
1476
    $exe_mysql_client_test=
1477
      mtr_exe_maybe_exists(
1478
        vs_config_dirs('libmysqld/examples', 'mysql_client_test_embedded'),
1479
        "$glob_basedir/libmysqld/examples/mysql_client_test_embedded");
unknown's avatar
unknown committed
1480 1481 1482
  }
  else
  {
1483
    $exe_mysql_client_test=
1484 1485
      mtr_exe_maybe_exists(vs_config_dirs('tests', 'mysql_client_test'),
                           "$glob_basedir/tests/mysql_client_test",
1486
                           "$glob_basedir/bin/mysql_client_test");
unknown's avatar
unknown committed
1487
  }
unknown's avatar
unknown committed
1488 1489 1490
}


1491 1492 1493 1494 1495 1496 1497 1498 1499
sub generate_cmdline_mysqldump ($) {
  my($mysqld) = @_;
  return
    "$exe_mysqldump --no-defaults -uroot " .
      "--port=$mysqld->{'port'} " .
      "--socket=$mysqld->{'path_sock'} --password=";
}


unknown's avatar
unknown committed
1500 1501
##############################################################################
#
1502 1503
#  Set environment to be used by childs of this process for
#  things that are constant duting the whole lifetime of mysql-test-run.pl
unknown's avatar
unknown committed
1504 1505 1506
#
##############################################################################

1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
sub mysql_client_test_arguments()
{
  my $exe= $exe_mysql_client_test;

  my $args;
  mtr_init_args(\$args);
  if ( $opt_valgrind_mysqltest )
  {
    valgrind_arguments($args, \$exe);
  }

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--testcase");
  mtr_add_arg($args, "--user=root");
  mtr_add_arg($args, "--port=$master->[0]->{'port'}");
  mtr_add_arg($args, "--socket=$master->[0]->{'path_sock'}");

  if ( $mysql_version_id >= 50000 )
  {
    mtr_add_arg($args, "--vardir=$opt_vardir")
  }

  if ( $opt_debug )
  {
    mtr_add_arg($args,
      "--debug=d:t:A,$path_vardir_trace/log/mysql_client_test.trace");
  }

  if ( $glob_use_embedded_server )
  {
    mtr_add_arg($args,
      " -A --language=$path_language");
    mtr_add_arg($args,
      " -A --datadir=$slave->[0]->{'path_myddir'}");
    mtr_add_arg($args,
      " -A --character-sets-dir=$path_charsetsdir");
  }

  return join(" ", $exe, @$args);
}

1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574
sub mysql_upgrade_arguments()
{
  my $exe= $exe_mysql_upgrade;

  my $args;
  mtr_init_args(\$args);
#  if ( $opt_valgrind_mysql_ugrade )
#  {
#    valgrind_arguments($args, \$exe);
#  }

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--user=root");
  mtr_add_arg($args, "--port=$master->[0]->{'port'}");
  mtr_add_arg($args, "--socket=$master->[0]->{'path_sock'}");
  mtr_add_arg($args, "--datadir=$master->[0]->{'path_myddir'}");
  mtr_add_arg($args, "--basedir=$glob_basedir");

  if ( $opt_debug )
  {
    mtr_add_arg($args,
      "--debug=d:t:A,$path_vardir_trace/log/mysql_upgrade.trace");
  }

  return join(" ", $exe, @$args);
}

unknown's avatar
unknown committed
1575 1576 1577 1578
# Note that some env is setup in spawn/run, in "mtr_process.pl"

sub environment_setup () {

unknown's avatar
unknown committed
1579 1580
  umask(022);

1581
  my @ld_library_paths;
1582

unknown's avatar
unknown committed
1583
  # --------------------------------------------------------------------------
1584 1585
  # Setup LD_LIBRARY_PATH so the libraries from this distro/clone
  # are used in favor of the system installed ones
unknown's avatar
unknown committed
1586
  # --------------------------------------------------------------------------
1587
  if ( $opt_source_dist )
unknown's avatar
unknown committed
1588
  {
1589 1590
    push(@ld_library_paths, "$glob_basedir/libmysql/.libs/",
                            "$glob_basedir/libmysql_r/.libs/");
1591 1592
  }
  else
unknown's avatar
unknown committed
1593
  {
1594 1595 1596 1597 1598 1599
    push(@ld_library_paths, "$glob_basedir/lib");
  }

 # --------------------------------------------------------------------------
  # Add the path where libndbclient can be found
  # --------------------------------------------------------------------------
1600
  if ( $glob_ndbcluster_supported )
1601 1602
  {
    push(@ld_library_paths,  "$glob_basedir/storage/ndb/src/.libs");
unknown's avatar
unknown committed
1603
  }
unknown's avatar
unknown committed
1604

1605 1606 1607
  # --------------------------------------------------------------------------
  # Add the path where mysqld will find udf_example.so
  # --------------------------------------------------------------------------
1608 1609 1610 1611
  if ( $lib_udf_example )
  {
    push(@ld_library_paths, dirname($lib_udf_example));
  }
1612

1613
  # --------------------------------------------------------------------------
1614
  # Valgrind need to be run with debug libraries otherwise it's almost
1615 1616 1617
  # impossible to add correct supressions, that means if "/usr/lib/debug"
  # is available, it should be added to
  # LD_LIBRARY_PATH
1618
  # --------------------------------------------------------------------------
1619 1620
  my $debug_libraries_path= "/usr/lib/debug";
  if (  $opt_valgrind and -d $debug_libraries_path )
1621
  {
1622
    push(@ld_library_paths, $debug_libraries_path);
1623
  }
1624

1625
  $ENV{'LD_LIBRARY_PATH'}= join(":", @ld_library_paths,
1626 1627
				$ENV{'LD_LIBRARY_PATHS'} ?
				split(':', $ENV{'LD_LIBRARY_PATH'}) : ());
1628 1629 1630
  mtr_debug("LD_LIBRARY_PATH: $ENV{'LD_LIBRARY_PATH'}");

  $ENV{'DYLD_LIBRARY_PATH'}= join(":", @ld_library_paths,
1631 1632
				  $ENV{'DYLD_LIBRARY_PATH'} ?
				  split(':', $ENV{'DYLD_LIBRARY_PATH'}) : ());
1633
  mtr_debug("DYLD_LIBRARY_PATH: $ENV{'DYLD_LIBRARY_PATH'}");
1634 1635


unknown's avatar
unknown committed
1636 1637 1638 1639
  # --------------------------------------------------------------------------
  # Also command lines in .opt files may contain env vars
  # --------------------------------------------------------------------------

1640
  $ENV{'CHARSETSDIR'}=              $path_charsetsdir;
unknown's avatar
unknown committed
1641 1642 1643 1644 1645
  $ENV{'UMASK'}=              "0660"; # The octal *string*
  $ENV{'UMASK_DIR'}=          "0770"; # The octal *string*
  $ENV{'LC_COLLATE'}=         "C";
  $ENV{'USE_RUNNING_SERVER'}= $glob_use_running_server;
  $ENV{'MYSQL_TEST_DIR'}=     $glob_mysql_test_dir;
1646
  $ENV{'MYSQLTEST_VARDIR'}=   $opt_vardir;
1647
  $ENV{'MYSQL_TMP_DIR'}=      $opt_tmpdir;
unknown's avatar
unknown committed
1648 1649 1650 1651
  $ENV{'MASTER_MYSOCK'}=      $master->[0]->{'path_sock'};
  $ENV{'MASTER_MYSOCK1'}=     $master->[1]->{'path_sock'};
  $ENV{'MASTER_MYPORT'}=      $master->[0]->{'port'};
  $ENV{'MASTER_MYPORT1'}=     $master->[1]->{'port'};
1652
  $ENV{'SLAVE_MYSOCK'}=       $slave->[0]->{'path_sock'};
unknown's avatar
unknown committed
1653 1654 1655
  $ENV{'SLAVE_MYPORT'}=       $slave->[0]->{'port'};
  $ENV{'SLAVE_MYPORT1'}=      $slave->[1]->{'port'};
  $ENV{'SLAVE_MYPORT2'}=      $slave->[2]->{'port'};
1656
  $ENV{'MYSQL_TCP_PORT'}=     $mysqld_variables{'port'};
unknown's avatar
unknown committed
1657

1658 1659 1660
  $ENV{'IM_PATH_SOCK'}=       $instance_manager->{path_sock};
  $ENV{'IM_USERNAME'}=        $instance_manager->{admin_login};
  $ENV{'IM_PASSWORD'}=        $instance_manager->{admin_password};
1661 1662
  $ENV{MTR_BUILD_THREAD}= 0 unless $ENV{MTR_BUILD_THREAD}; # Set if not set

1663 1664 1665
  $ENV{'EXE_MYSQL'}=          $exe_mysql;


1666 1667 1668
  # ----------------------------------------------------
  # Setup env for NDB
  # ----------------------------------------------------
1669 1670 1671
  if ( ! $opt_skip_ndbcluster )
  {
    $ENV{'NDB_MGM'}=                  $exe_ndb_mgm;
1672

1673 1674
    $ENV{'NDBCLUSTER_PORT'}=          $opt_ndbcluster_port;
    $ENV{'NDBCLUSTER_PORT_SLAVE'}=    $opt_ndbcluster_port_slave;
1675

1676
    $ENV{'NDB_EXTRA_TEST'}=           $opt_ndb_extra_test;
1677

1678 1679 1680 1681 1682
    $ENV{'NDB_BACKUP_DIR'}=           $clusters->[0]->{'data_dir'};
    $ENV{'NDB_DATA_DIR'}=             $clusters->[0]->{'data_dir'};
    $ENV{'NDB_TOOLS_DIR'}=            $path_ndb_tools_dir;
    $ENV{'NDB_TOOLS_OUTPUT'}=         $path_ndb_testrun_log;
    $ENV{'NDB_CONNECTSTRING'}=        $opt_ndbconnectstring;
1683

1684 1685 1686 1687 1688
    if ( $mysql_version_id >= 50000 )
    {
      $ENV{'NDB_EXAMPLES_DIR'}=         $path_ndb_examples_dir;
      $ENV{'MY_NDB_EXAMPLES_BINARY'}=   $exe_ndb_example;
    }
1689 1690
    $ENV{'NDB_EXAMPLES_OUTPUT'}=      $path_ndb_testrun_log;
  }
1691

1692 1693 1694
  # ----------------------------------------------------
  # Setup env for IM
  # ----------------------------------------------------
1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
  if ( ! $opt_skip_im )
  {
    $ENV{'IM_EXE'}=             $exe_im;
    $ENV{'IM_PATH_PID'}=        $instance_manager->{path_pid};
    $ENV{'IM_PATH_ANGEL_PID'}=  $instance_manager->{path_angel_pid};
    $ENV{'IM_PORT'}=            $instance_manager->{port};
    $ENV{'IM_DEFAULTS_PATH'}=   $instance_manager->{defaults_file};
    $ENV{'IM_PASSWORD_PATH'}=   $instance_manager->{password_file};

    $ENV{'IM_MYSQLD1_SOCK'}=
      $instance_manager->{instances}->[0]->{path_sock};
    $ENV{'IM_MYSQLD1_PORT'}=
      $instance_manager->{instances}->[0]->{port};
    $ENV{'IM_MYSQLD1_PATH_PID'}=
      $instance_manager->{instances}->[0]->{path_pid};
    $ENV{'IM_MYSQLD2_SOCK'}=
      $instance_manager->{instances}->[1]->{path_sock};
    $ENV{'IM_MYSQLD2_PORT'}=
      $instance_manager->{instances}->[1]->{port};
    $ENV{'IM_MYSQLD2_PATH_PID'}=
      $instance_manager->{instances}->[1]->{path_pid};
  }
1717

unknown's avatar
unknown committed
1718 1719 1720
  # ----------------------------------------------------
  # Setup env so childs can execute mysqlcheck
  # ----------------------------------------------------
1721 1722 1723 1724 1725 1726 1727 1728
  my $cmdline_mysqlcheck=
    "$exe_mysqlcheck --no-defaults -uroot " .
    "--port=$master->[0]->{'port'} " .
    "--socket=$master->[0]->{'path_sock'} --password=";

  if ( $opt_debug )
  {
    $cmdline_mysqlcheck .=
unknown's avatar
unknown committed
1729
      " --debug=d:t:A,$path_vardir_trace/log/mysqlcheck.trace";
1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741
  }
  $ENV{'MYSQL_CHECK'}=              $cmdline_mysqlcheck;

  # ----------------------------------------------------
  # Setup env to childs can execute myqldump
  # ----------------------------------------------------
  my $cmdline_mysqldump= generate_cmdline_mysqldump($master->[0]);
  my $cmdline_mysqldumpslave= generate_cmdline_mysqldump($slave->[0]);

  if ( $opt_debug )
  {
    $cmdline_mysqldump .=
unknown's avatar
unknown committed
1742
      " --debug=d:t:A,$path_vardir_trace/log/mysqldump-master.trace";
1743
    $cmdline_mysqldumpslave .=
unknown's avatar
unknown committed
1744
      " --debug=d:t:A,$path_vardir_trace/log/mysqldump-slave.trace";
1745 1746 1747 1748 1749 1750 1751 1752
  }
  $ENV{'MYSQL_DUMP'}= $cmdline_mysqldump;
  $ENV{'MYSQL_DUMP_SLAVE'}= $cmdline_mysqldumpslave;


  # ----------------------------------------------------
  # Setup env so childs can execute mysqlslap
  # ----------------------------------------------------
1753
  if ( $exe_mysqlslap )
1754 1755 1756 1757 1758 1759 1760 1761
  {
    my $cmdline_mysqlslap=
      "$exe_mysqlslap -uroot " .
      "--port=$master->[0]->{'port'} " .
      "--socket=$master->[0]->{'path_sock'} --password= " .
      "--lock-directory=$opt_tmpdir";

    if ( $opt_debug )
1762
   {
1763
      $cmdline_mysqlslap .=
1764
	" --debug=d:t:A,$path_vardir_trace/log/mysqlslap.trace";
1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
    }
    $ENV{'MYSQL_SLAP'}= $cmdline_mysqlslap;
  }

  # ----------------------------------------------------
  # Setup env so childs can execute mysqlimport
  # ----------------------------------------------------
  my $cmdline_mysqlimport=
    "$exe_mysqlimport -uroot " .
    "--port=$master->[0]->{'port'} " .
    "--socket=$master->[0]->{'path_sock'} --password=";

  if ( $opt_debug )
  {
    $cmdline_mysqlimport .=
unknown's avatar
unknown committed
1780
      " --debug=d:t:A,$path_vardir_trace/log/mysqlimport.trace";
1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795
  }
  $ENV{'MYSQL_IMPORT'}= $cmdline_mysqlimport;


  # ----------------------------------------------------
  # Setup env so childs can execute mysqlshow
  # ----------------------------------------------------
  my $cmdline_mysqlshow=
    "$exe_mysqlshow -uroot " .
    "--port=$master->[0]->{'port'} " .
    "--socket=$master->[0]->{'path_sock'} --password=";

  if ( $opt_debug )
  {
    $cmdline_mysqlshow .=
unknown's avatar
unknown committed
1796
      " --debug=d:t:A,$path_vardir_trace/log/mysqlshow.trace";
1797 1798 1799 1800 1801 1802 1803 1804
  }
  $ENV{'MYSQL_SHOW'}= $cmdline_mysqlshow;

  # ----------------------------------------------------
  # Setup env so childs can execute mysqlbinlog
  # ----------------------------------------------------
  my $cmdline_mysqlbinlog=
    "$exe_mysqlbinlog" .
unknown's avatar
unknown committed
1805 1806 1807 1808 1809
      " --no-defaults --local-load=$opt_tmpdir";
  if ( $mysql_version_id >= 50000 )
  {
    $cmdline_mysqlbinlog .=" --character-sets-dir=$path_charsetsdir";
  }
1810 1811 1812 1813

  if ( $opt_debug )
  {
    $cmdline_mysqlbinlog .=
unknown's avatar
unknown committed
1814
      " --debug=d:t:A,$path_vardir_trace/log/mysqlbinlog.trace";
1815 1816 1817 1818 1819 1820 1821 1822 1823
  }
  $ENV{'MYSQL_BINLOG'}= $cmdline_mysqlbinlog;

  # ----------------------------------------------------
  # Setup env so childs can execute mysql
  # ----------------------------------------------------
  my $cmdline_mysql=
    "$exe_mysql --no-defaults --host=localhost  --user=root --password= " .
    "--port=$master->[0]->{'port'} " .
1824
    "--socket=$master->[0]->{'path_sock'} ".
1825
    "--character-sets-dir=$path_charsetsdir";
1826 1827 1828 1829 1830 1831

  $ENV{'MYSQL'}= $cmdline_mysql;

  # ----------------------------------------------------
  # Setup env so childs can execute mysql_client_test
  # ----------------------------------------------------
1832
  $ENV{'MYSQL_CLIENT_TEST'}=  mysql_client_test_arguments();
1833

1834 1835 1836 1837 1838 1839 1840 1841
  # ----------------------------------------------------
  # Setup env so childs can execute mysql_upgrade
  # ----------------------------------------------------
  if ( $mysql_version_id >= 50000 )
  {
    $ENV{'MYSQL_UPGRADE'}= mysql_upgrade_arguments();
  }

1842 1843 1844
  # ----------------------------------------------------
  # Setup env so childs can execute mysql_fix_system_tables
  # ----------------------------------------------------
1845 1846 1847 1848 1849 1850 1851 1852 1853 1854
  if ( ! $glob_win32 )
  {
    my $cmdline_mysql_fix_system_tables=
      "$exe_mysql_fix_system_tables --no-defaults --host=localhost " .
      "--user=root --password= " .
      "--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " .
      "--port=$master->[0]->{'port'} " .
      "--socket=$master->[0]->{'path_sock'}";
    $ENV{'MYSQL_FIX_SYSTEM_TABLES'}=  $cmdline_mysql_fix_system_tables;
  }
1855 1856 1857 1858 1859 1860

  # ----------------------------------------------------
  # Setup env so childs can execute my_print_defaults
  # ----------------------------------------------------
  $ENV{'MYSQL_MY_PRINT_DEFAULTS'}=  $exe_my_print_defaults;

1861 1862 1863 1864 1865 1866

  # ----------------------------------------------------
  # Setup env so childs can execute perror  
  # ----------------------------------------------------
  $ENV{'MY_PERROR'}=                 $exe_perror;

1867 1868 1869 1870 1871 1872 1873 1874 1875
  # ----------------------------------------------------
  # Add the path where mysqld will find udf_example.so
  # ----------------------------------------------------
  $ENV{'UDF_EXAMPLE_LIB'}=
    ($lib_udf_example ? basename($lib_udf_example) : "");

  $ENV{'LD_LIBRARY_PATH'}=
    ($lib_udf_example ?  dirname($lib_udf_example) : "") .
      ($ENV{'LD_LIBRARY_PATH'} ? ":$ENV{'LD_LIBRARY_PATH'}" : "");
unknown's avatar
Merge  
unknown committed
1876

1877

unknown's avatar
unknown committed
1878
  # ----------------------------------------------------
unknown's avatar
unknown committed
1879
  # We are nice and report a bit about our settings
unknown's avatar
unknown committed
1880
  # ----------------------------------------------------
1881
  if (!$opt_extern && $opt_verbose)
1882 1883 1884 1885 1886 1887 1888
  {
    print "Using MTR_BUILD_THREAD      = $ENV{MTR_BUILD_THREAD}\n";
    print "Using MASTER_MYPORT         = $ENV{MASTER_MYPORT}\n";
    print "Using MASTER_MYPORT1        = $ENV{MASTER_MYPORT1}\n";
    print "Using SLAVE_MYPORT          = $ENV{SLAVE_MYPORT}\n";
    print "Using SLAVE_MYPORT1         = $ENV{SLAVE_MYPORT1}\n";
    print "Using SLAVE_MYPORT2         = $ENV{SLAVE_MYPORT2}\n";
unknown's avatar
unknown committed
1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
    if ( ! $opt_skip_ndbcluster )
    {
      print "Using NDBCLUSTER_PORT       = $ENV{NDBCLUSTER_PORT}\n";
      if ( ! $opt_skip_ndbcluster_slave )
      {
	print "Using NDBCLUSTER_PORT_SLAVE = $ENV{NDBCLUSTER_PORT_SLAVE}\n";
      }
    }
    if ( ! $opt_skip_im )
    {
      print "Using IM_PORT               = $ENV{IM_PORT}\n";
      print "Using IM_MYSQLD1_PORT       = $ENV{IM_MYSQLD1_PORT}\n";
      print "Using IM_MYSQLD2_PORT       = $ENV{IM_MYSQLD2_PORT}\n";
    }
1903
  }
1904 1905 1906 1907 1908

  # Create an environment variable to make it possible
  # to detect that valgrind is being used from test cases
  $ENV{'VALGRIND_TEST'}= $opt_valgrind;

unknown's avatar
unknown committed
1909 1910 1911
}


unknown's avatar
unknown committed
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922
##############################################################################
#
#  If we get a ^C, we try to clean up before termination
#
##############################################################################
# FIXME check restrictions what to do in a signal handler

sub signal_setup () {
  $SIG{INT}= \&handle_int_signal;
}

unknown's avatar
unknown committed
1923

unknown's avatar
unknown committed
1924 1925 1926
sub handle_int_signal () {
  $SIG{INT}= 'DEFAULT';         # If we get a ^C again, we die...
  mtr_warning("got INT signal, cleaning up.....");
unknown's avatar
unknown committed
1927
  stop_all_servers();
unknown's avatar
unknown committed
1928
  mtr_error("We die from ^C signal from user");
unknown's avatar
unknown committed
1929 1930 1931 1932 1933 1934 1935 1936 1937
}


##############################################################################
#
#  Handle left overs from previous runs
#
##############################################################################

1938
sub kill_running_servers () {
unknown's avatar
unknown committed
1939 1940 1941 1942

  if ( $opt_fast or $glob_use_embedded_server )
  {
    # FIXME is embedded server really using PID files?!
unknown's avatar
unknown committed
1943 1944 1945 1946 1947
    unlink($master->[0]->{'path_pid'});
    unlink($master->[1]->{'path_pid'});
    unlink($slave->[0]->{'path_pid'});
    unlink($slave->[1]->{'path_pid'});
    unlink($slave->[2]->{'path_pid'});
unknown's avatar
unknown committed
1948 1949 1950 1951 1952
  }
  else
  {
    # Ensure that no old mysqld test servers are running
    # This is different from terminating processes we have
unknown's avatar
unknown committed
1953
    # started from this run of the script, this is terminating
unknown's avatar
unknown committed
1954 1955
    # leftovers from previous runs.

1956 1957
    if ( ! -d $opt_vardir )
    {
1958 1959 1960 1961 1962
      if ( -l $opt_vardir and ! -d readlink($opt_vardir) )
      {
	mtr_report("Removing $opt_vardir symlink without destination");
	unlink($opt_vardir);
      }
1963 1964 1965 1966 1967
      # The "var" dir does not exist already
      # the processes that mtr_kill_leftovers start will write
      # their log files to var/log so it should be created
      mkpath("$opt_vardir/log");
    }
unknown's avatar
unknown committed
1968
    mtr_kill_leftovers();
unknown's avatar
unknown committed
1969
   }
1970 1971
}

unknown's avatar
unknown committed
1972
sub cleanup_stale_files () {
unknown's avatar
unknown committed
1973

1974 1975
  my $created_by_mem_file= "$glob_mysql_test_dir/var/created_by_mem";

unknown's avatar
unknown committed
1976 1977
  mtr_report("Removing Stale Files");

1978
  if ( $opt_vardir eq $default_vardir )
1979 1980 1981 1982
  {
    #
    # Running with "var" in mysql-test dir
    #
1983
    if ( -l $opt_vardir)
1984
    {
1985 1986 1987 1988 1989 1990 1991
      # var is a symlink
      if (-f $created_by_mem_file)
      {
	# Remove the directory which the link points at
	rmtree(readlink($opt_vardir));
	# Remove the entire "var" dir
	rmtree("$opt_vardir/");
1992 1993
	# Remove the "var" symlink
	unlink($opt_vardir);
1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
      }
      else
      {
	# Some users creates a soft link in mysql-test/var to another area
	# - allow it
	mtr_report("WARNING: Using the 'mysql-test/var' symlink");
	rmtree("$opt_vardir/log");
	rmtree("$opt_vardir/ndbcluster-$opt_ndbcluster_port");
	rmtree("$opt_vardir/run");
	rmtree("$opt_vardir/tmp");
      }
2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
    }
    else
    {
      # Remove the entire "var" dir
      rmtree("$opt_vardir/");
    }
  }
  else
  {
    #
    # Running with "var" in some other place
    #

    # Remove the var/ dir in mysql-test dir if any
    # this could be an old symlink that shouldn't be there
2020
    rmtree($default_vardir);
2021 2022 2023 2024

    # Remove the "var" dir
    rmtree("$opt_vardir/");
  }
unknown's avatar
unknown committed
2025

2026 2027 2028 2029 2030
  if ( $opt_mem )
  {
    # Runinng with var as a link to some "memory" location, normally tmpfs
    rmtree($opt_mem);
    mkpath($opt_mem);
2031
    mtr_report("Creating symlink from $opt_vardir to $opt_mem");
2032 2033 2034 2035 2036
    symlink($opt_mem, $opt_vardir);
    # Put a small file to recognize this dir was created by --mem
    mtr_tofile($created_by_mem_file, $opt_mem);
  }

2037 2038 2039
  mkpath("$opt_vardir/log");
  mkpath("$opt_vardir/run");
  mkpath("$opt_vardir/tmp");
unknown's avatar
unknown committed
2040
  mkpath($opt_tmpdir) if $opt_tmpdir ne "$opt_vardir/tmp";
unknown's avatar
unknown committed
2041

2042
  # Remove old and create new data dirs
2043 2044 2045 2046 2047 2048
  foreach my $data_dir (@data_dir_lst)
  {
    rmtree("$data_dir");
    mkpath("$data_dir/mysql");
    mkpath("$data_dir/test");
  }
2049

2050 2051
  # Make a link std_data_ln in var/ that points to std_data
  if ( ! $glob_win32 )
2052
  {
2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065
    symlink("$glob_mysql_test_dir/std_data", "$opt_vardir/std_data_ln");
  }
  else
  {
    # on windows, copy all files from std_data into var/std_data_ln
    mkpath("$opt_vardir/std_data_ln");
    opendir(DIR, "$glob_mysql_test_dir/std_data")
      or mtr_error("Can't find the std_data directory: $!");
    for(readdir(DIR)) {
      next if -d "$glob_mysql_test_dir/std_data/$_";
      copy("$glob_mysql_test_dir/std_data/$_", "$opt_vardir/std_data_ln/$_");
    }
    closedir(DIR);
2066
  }
unknown's avatar
unknown committed
2067 2068 2069
}


2070 2071 2072
sub  check_running_as_root () {
  # Check if running as root
  # i.e a file can be read regardless what mode we set it to
2073
  my $test_file= "$opt_vardir/test_running_as_root.txt";
2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096
  mtr_tofile($test_file, "MySQL");
  chmod(oct("0000"), $test_file);

  my $result="";
  if (open(FILE,"<",$test_file))
  {
    $result= join('', <FILE>);
    close FILE;
  }

  chmod(oct("0755"), $test_file);
  unlink($test_file);

  $ENV{'MYSQL_TEST_ROOT'}= "NO";
  if ($result eq "MySQL")
  {
    mtr_warning("running this script as _root_ will cause some " .
                "tests to be skipped");
    $ENV{'MYSQL_TEST_ROOT'}= "YES";
  }
}


unknown's avatar
unknown committed
2097 2098
sub check_ssl_support ($) {
  my $mysqld_variables= shift;
2099

2100
  if ($opt_skip_ssl || $opt_extern)
2101 2102 2103 2104 2105 2106 2107
  {
    mtr_report("Skipping SSL");
    $opt_ssl_supported= 0;
    $opt_ssl= 0;
    return;
  }

2108
  if ( ! $mysqld_variables->{'ssl'} )
2109 2110 2111 2112 2113 2114
  {
    if ( $opt_ssl)
    {
      mtr_error("Couldn't find support for SSL");
      return;
    }
unknown's avatar
unknown committed
2115
    mtr_report("Skipping SSL, mysqld not compiled with SSL");
2116 2117 2118 2119 2120 2121 2122 2123 2124
    $opt_ssl_supported= 0;
    $opt_ssl= 0;
    return;
  }
  mtr_report("Setting mysqld to support SSL connections");
  $opt_ssl_supported= 1;
}


unknown's avatar
unknown committed
2125 2126
sub check_debug_support ($) {
  my $mysqld_variables= shift;
unknown's avatar
unknown committed
2127

2128
  if ( ! $mysqld_variables->{'debug'} )
unknown's avatar
unknown committed
2129
  {
unknown's avatar
unknown committed
2130
    #mtr_report("Binaries are not debug compiled");
unknown's avatar
unknown committed
2131
    $debug_compiled_binaries= 0;
2132 2133 2134 2135 2136

    if ( $opt_debug )
    {
      mtr_error("Can't use --debug, binaries does not support it");
    }
unknown's avatar
unknown committed
2137 2138 2139 2140 2141 2142
    return;
  }
  mtr_report("Binaries are debug compiled");
  $debug_compiled_binaries= 1;
}

2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167
##############################################################################
#
# Helper function to handle configuration-based subdirectories which Visual
# Studio uses for storing binaries.  If opt_vs_config is set, this returns
# a path based on that setting; if not, it returns paths for the default
# /release/ and /debug/ subdirectories.
#
# $exe can be undefined, if the directory itself will be used
#
###############################################################################

sub vs_config_dirs ($$) {
  my ($path_part, $exe) = @_;

  $exe = "" if not defined $exe;

  if ($opt_vs_config)
  {
    return ("$glob_basedir/$path_part/$opt_vs_config/$exe");
  }

  return ("$glob_basedir/$path_part/release/$exe",
          "$glob_basedir/$path_part/debug/$exe");
}

unknown's avatar
unknown committed
2168 2169 2170 2171 2172 2173
##############################################################################
#
#  Start the ndb cluster
#
##############################################################################

unknown's avatar
unknown committed
2174 2175
sub check_ndbcluster_support ($) {
  my $mysqld_variables= shift;
2176 2177 2178 2179

  if ($opt_skip_ndbcluster)
  {
    mtr_report("Skipping ndbcluster");
2180
    $opt_skip_ndbcluster_slave= 1;
2181 2182
    return;
  }
2183

2184
  if ( ! $mysqld_variables->{'ndb-connectstring'} )
2185
  {
unknown's avatar
unknown committed
2186
    mtr_report("Skipping ndbcluster, mysqld not compiled with ndbcluster");
2187 2188
    $opt_skip_ndbcluster= 1;
    $opt_skip_ndbcluster_slave= 1;
2189
    return;
2190
  }
2191
  $glob_ndbcluster_supported= 1;
unknown's avatar
unknown committed
2192
  mtr_report("Using ndbcluster when necessary, mysqld supports it");
2193 2194 2195 2196 2197 2198 2199 2200

  if ( $mysql_version_id < 50100 )
  {
    # Slave cluster is not supported until 5.1
    $opt_skip_ndbcluster_slave= 1;

  }

2201
  return;
2202 2203
}

unknown's avatar
unknown committed
2204

unknown's avatar
unknown committed
2205 2206
sub ndbcluster_start_install ($) {
  my $cluster= shift;
unknown's avatar
unknown committed
2207

unknown's avatar
unknown committed
2208
  mtr_report("Installing $cluster->{'name'} Cluster");
2209

unknown's avatar
unknown committed
2210
  mkdir($cluster->{'data_dir'});
unknown's avatar
unknown committed
2211

unknown's avatar
unknown committed
2212 2213 2214 2215 2216 2217 2218 2219 2220 2221
  # Create a config file from template
  my $ndb_no_ord=512;
  my $ndb_no_attr=2048;
  my $ndb_con_op=105000;
  my $ndb_dmem="80M";
  my $ndb_imem="24M";
  my $ndb_pbmem="32M";
  my $nodes= $cluster->{'nodes'};
  my $ndb_host= "localhost";
  my $ndb_diskless= 0;
2222

unknown's avatar
unknown committed
2223
  if (!$opt_bench)
2224
  {
unknown's avatar
unknown committed
2225
    # Use a smaller configuration
2226
    if (  $mysql_version_id < 50100 )
2227
    {
2228
      # 4.1 and 5.0 is using a "larger" --small configuration
2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241
      $ndb_no_ord=128;
      $ndb_con_op=10000;
      $ndb_dmem="40M";
      $ndb_imem="12M";
    }
    else
    {
      $ndb_no_ord=32;
      $ndb_con_op=5000;
      $ndb_dmem="20M";
      $ndb_imem="1M";
      $ndb_pbmem="4M";
    }
2242
  }
unknown's avatar
unknown committed
2243 2244 2245 2246 2247 2248 2249 2250 2251

  my $config_file_template=     "ndb/ndb_config_${nodes}_node.ini";
  my $config_file= "$cluster->{'data_dir'}/config.ini";

  open(IN, $config_file_template)
    or mtr_error("Can't open $config_file_template: $!");
  open(OUT, ">", $config_file)
    or mtr_error("Can't write to $config_file: $!");
  while (<IN>)
2252
  {
unknown's avatar
unknown committed
2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263
    chomp;

    s/CHOOSE_MaxNoOfAttributes/$ndb_no_attr/;
    s/CHOOSE_MaxNoOfOrderedIndexes/$ndb_no_ord/;
    s/CHOOSE_MaxNoOfConcurrentOperations/$ndb_con_op/;
    s/CHOOSE_DataMemory/$ndb_dmem/;
    s/CHOOSE_IndexMemory/$ndb_imem/;
    s/CHOOSE_Diskless/$ndb_diskless/;
    s/CHOOSE_HOSTNAME_.*/$ndb_host/;
    s/CHOOSE_FILESYSTEM/$cluster->{'data_dir'}/;
    s/CHOOSE_PORT_MGM/$cluster->{'port'}/;
2264 2265 2266 2267 2268
    if ( $mysql_version_id < 50000 )
    {
      my $base_port= $cluster->{'port'} + 1;
      s/CHOOSE_PORT_TRANSPORTER/$base_port/;
    }
unknown's avatar
unknown committed
2269 2270
    s/CHOOSE_DiskPageBufferMemory/$ndb_pbmem/;

unknown's avatar
unknown committed
2271
    print OUT "$_ \n";
2272
  }
unknown's avatar
unknown committed
2273 2274 2275 2276 2277 2278 2279
  close OUT;
  close IN;


  # Start cluster with "--initial"

  ndbcluster_start($cluster, "--initial");
2280 2281

  return 0;
unknown's avatar
unknown committed
2282 2283
}

unknown's avatar
unknown committed
2284

2285
sub ndbcluster_wait_started($$){
unknown's avatar
unknown committed
2286
  my $cluster= shift;
2287
  my $ndb_waiter_extra_opt= shift;
2288
  my $path_waiter_log= "$cluster->{'data_dir'}/ndb_waiter.log";
2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301
  my $args;

  mtr_init_args(\$args);

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--core");
  mtr_add_arg($args, "--ndb-connectstring=%s", $cluster->{'connect_string'});
  mtr_add_arg($args, "--timeout=60");

  if ($ndb_waiter_extra_opt)
  {
    mtr_add_arg($args, "$ndb_waiter_extra_opt");
  }
unknown's avatar
unknown committed
2302 2303 2304 2305

  # Start the ndb_waiter which will connect to the ndb_mgmd
  # and poll it for state of the ndbd's, will return when
  # all nodes in the cluster is started
2306 2307
  my $res= mtr_run($exe_ndb_waiter, $args,
		   "", $path_waiter_log, $path_waiter_log, "");
2308
  mtr_verbose("ndbcluster_wait_started, returns: $res") if $res;
unknown's avatar
unknown committed
2309
  return $res;
unknown's avatar
unknown committed
2310 2311
}

2312

2313

2314 2315 2316 2317 2318 2319 2320
sub mysqld_wait_started($){
  my $mysqld= shift;

  my $res= sleep_until_file_created($mysqld->{'path_pid'},
				    $mysqld->{'start_timeout'},
				    $mysqld->{'pid'});
  return $res == 0;
unknown's avatar
unknown committed
2321 2322 2323
}


2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340
sub ndb_mgmd_wait_started($) {
  my ($cluster)= @_;

  my $retries= 100;
  while (ndbcluster_wait_started($cluster, "--no-contact") and
	 $retries)
  {
    # Millisceond sleep emulated with select
    select(undef, undef, undef, (0.1));

    $retries--;
  }

  return $retries == 0;

}

unknown's avatar
unknown committed
2341 2342
sub ndb_mgmd_start ($) {
  my $cluster= shift;
unknown's avatar
unknown committed
2343

unknown's avatar
unknown committed
2344 2345
  my $args;                             # Arg vector
  my $pid= -1;
unknown's avatar
unknown committed
2346

unknown's avatar
unknown committed
2347 2348 2349
  mtr_init_args(\$args);
  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--core");
2350
  mtr_add_arg($args, "--nodaemon");
unknown's avatar
unknown committed
2351 2352 2353
  mtr_add_arg($args, "--config-file=%s", "$cluster->{'data_dir'}/config.ini");


2354
  my $path_ndb_mgmd_log= "$cluster->{'data_dir'}/\l$cluster->{'name'}_ndb_mgmd.log";
unknown's avatar
unknown committed
2355 2356 2357 2358 2359 2360
  $pid= mtr_spawn($exe_ndb_mgmd, $args, "",
		  $path_ndb_mgmd_log,
		  $path_ndb_mgmd_log,
		  "",
		  { append_log_file => 1 });

2361 2362 2363
  # FIXME Should not be needed
  # Unfortunately the cluster nodes will fail to start
  # if ndb_mgmd has not started properly
2364
  if (ndb_mgmd_wait_started($cluster))
2365
  {
2366
    mtr_error("Failed to wait for start of ndb_mgmd");
2367
  }
2368

unknown's avatar
unknown committed
2369 2370
  # Remember pid of ndb_mgmd
  $cluster->{'pid'}= $pid;
2371

2372 2373
  mtr_verbose("ndb_mgmd_start, pid: $pid");

unknown's avatar
unknown committed
2374
  return $pid;
unknown's avatar
unknown committed
2375 2376 2377
}


unknown's avatar
unknown committed
2378 2379 2380 2381
sub ndbd_start ($$$) {
  my $cluster= shift;
  my $idx= shift;
  my $extra_args= shift;
unknown's avatar
unknown committed
2382

unknown's avatar
unknown committed
2383 2384
  my $args;                             # Arg vector
  my $pid= -1;
unknown's avatar
unknown committed
2385

unknown's avatar
unknown committed
2386 2387 2388 2389
  mtr_init_args(\$args);
  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--core");
  mtr_add_arg($args, "--ndb-connectstring=%s", "$cluster->{'connect_string'}");
2390
  if ( $mysql_version_id >= 50000)
2391
  {
2392
    mtr_add_arg($args, "--character-sets-dir=%s", "$path_charsetsdir");
2393
  }
unknown's avatar
unknown committed
2394 2395 2396
  mtr_add_arg($args, "--nodaemon");
  mtr_add_arg($args, "$extra_args");

2397 2398
  my $nodeid= $cluster->{'ndbds'}->[$idx]->{'nodeid'};
  my $path_ndbd_log= "$cluster->{'data_dir'}/ndb_${nodeid}.log";
unknown's avatar
unknown committed
2399 2400 2401 2402 2403 2404 2405 2406 2407
  $pid= mtr_spawn($exe_ndbd, $args, "",
		  $path_ndbd_log,
		  $path_ndbd_log,
		  "",
		  { append_log_file => 1 });

  # Add pid to list of pids for this cluster
  $cluster->{'ndbds'}->[$idx]->{'pid'}= $pid;

2408 2409 2410 2411
  # Rememeber options used when starting
  $cluster->{'ndbds'}->[$idx]->{'start_extra_args'}= $extra_args;
  $cluster->{'ndbds'}->[$idx]->{'idx'}= $idx;

2412
  mtr_verbose("ndbd_start, pid: $pid");
unknown's avatar
unknown committed
2413 2414

  return $pid;
unknown's avatar
unknown committed
2415 2416 2417
}


unknown's avatar
unknown committed
2418 2419 2420 2421
sub ndbcluster_start ($$) {
  my $cluster= shift;
  my $extra_args= shift;

2422
  mtr_verbose("ndbcluster_start '$cluster->{'name'}'");
unknown's avatar
unknown committed
2423 2424

  if ( $glob_use_running_ndbcluster )
unknown's avatar
unknown committed
2425 2426 2427
  {
    return 0;
  }
unknown's avatar
unknown committed
2428 2429

  if ( $cluster->{'pid'} )
2430
  {
unknown's avatar
unknown committed
2431
    mtr_error("Cluster '$cluster->{'name'}' already started");
2432 2433
  }

2434
  ndb_mgmd_start($cluster);
unknown's avatar
unknown committed
2435 2436 2437 2438 2439 2440

  for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
  {
    ndbd_start($cluster, $idx, $extra_args);
  }

unknown's avatar
unknown committed
2441 2442 2443 2444
  return 0;
}


unknown's avatar
unknown committed
2445 2446 2447 2448
sub rm_ndbcluster_tables ($) {
  my $dir=       shift;
  foreach my $bin ( glob("$dir/cluster/apply_status*"),
                    glob("$dir/cluster/schema*") )
unknown's avatar
unknown committed
2449
  {
unknown's avatar
unknown committed
2450
    unlink($bin);
unknown's avatar
unknown committed
2451
  }
unknown's avatar
unknown committed
2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465
}


##############################################################################
#
#  Run the benchmark suite
#
##############################################################################

sub run_benchmarks ($) {
  my $benchmark=  shift;

  my $args;

unknown's avatar
unknown committed
2466
  if ( ! $glob_use_embedded_server )
unknown's avatar
unknown committed
2467
  {
unknown's avatar
unknown committed
2468
    mysqld_start($master->[0],[],[]);
unknown's avatar
unknown committed
2469 2470 2471 2472
    if ( ! $master->[0]->{'pid'} )
    {
      mtr_error("Can't start the mysqld server");
    }
unknown's avatar
unknown committed
2473 2474 2475 2476
  }

  mtr_init_args(\$args);

unknown's avatar
unknown committed
2477
  mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
unknown's avatar
unknown committed
2478
  mtr_add_arg($args, "--user=%s", $opt_user);
unknown's avatar
unknown committed
2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490

  if ( $opt_small_bench )
  {
    mtr_add_arg($args, "--small-test");
    mtr_add_arg($args, "--small-tables");
  }

  if ( $opt_with_ndbcluster )
  {
    mtr_add_arg($args, "--create-options=TYPE=ndb");
  }

2491 2492
  chdir($glob_mysql_bench_dir)
    or mtr_error("Couldn't chdir to '$glob_mysql_bench_dir': $!");
unknown's avatar
unknown committed
2493 2494 2495 2496

  if ( ! $benchmark )
  {
    mtr_add_arg($args, "--log");
unknown's avatar
unknown committed
2497
    mtr_run("$glob_mysql_bench_dir/run-all-tests", $args, "", "", "", "");
unknown's avatar
unknown committed
2498 2499 2500 2501
    # FIXME check result code?!
  }
  elsif ( -x $benchmark )
  {
unknown's avatar
unknown committed
2502
    mtr_run("$glob_mysql_bench_dir/$benchmark", $args, "", "", "", "");
unknown's avatar
unknown committed
2503 2504 2505 2506
    # FIXME check result code?!
  }
  else
  {
unknown's avatar
unknown committed
2507
    mtr_error("Benchmark $benchmark not found");
unknown's avatar
unknown committed
2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524
  }

  chdir($glob_mysql_test_dir);          # Go back

  if ( ! $glob_use_embedded_server )
  {
    stop_masters();
  }
}


##############################################################################
#
#  Run the test suite
#
##############################################################################

unknown's avatar
unknown committed
2525
sub run_suite () {
2526
  my ($suite, $tests)= @_;
unknown's avatar
unknown committed
2527 2528

  mtr_print_thick_line();
unknown's avatar
unknown committed
2529

2530 2531
  mtr_timer_start($glob_timers,"suite", 60 * $opt_suite_timeout);

unknown's avatar
unknown committed
2532
  mtr_report("Starting Tests in the '$suite' suite");
unknown's avatar
unknown committed
2533

2534 2535
  mtr_report_tests_not_skipped_though_disabled($tests);

unknown's avatar
unknown committed
2536 2537 2538 2539
  mtr_print_header();

  foreach my $tinfo ( @$tests )
  {
2540 2541 2542 2543
    if (run_testcase_check_skip_test($tinfo))
    {
      next;
    }
2544

2545
    mtr_timer_start($glob_timers,"testcase", 60 * $opt_testcase_timeout);
unknown's avatar
unknown committed
2546
    run_testcase($tinfo);
2547
    mtr_timer_stop($glob_timers,"testcase");
unknown's avatar
unknown committed
2548 2549 2550 2551
  }

  mtr_print_line();

2552
  if ( ! $glob_debugger and
unknown's avatar
unknown committed
2553 2554
       ! $glob_use_running_server and
       ! $glob_use_embedded_server )
unknown's avatar
unknown committed
2555
  {
unknown's avatar
unknown committed
2556
    stop_all_servers();
unknown's avatar
unknown committed
2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
  }

  if ( $opt_gcov )
  {
    gcov_collect(); # collect coverage information
  }
  if ( $opt_gprof )
  {
    gprof_collect(); # collect coverage information
  }

  mtr_report_stats($tests);
2569 2570

  mtr_timer_stop($glob_timers,"suite");
unknown's avatar
unknown committed
2571 2572 2573 2574 2575 2576 2577 2578 2579
}


##############################################################################
#
#  Initiate the test databases
#
##############################################################################

2580
sub initialize_servers () {
2581 2582 2583

  datadir_setup();

2584 2585
  if ( ! $glob_use_running_server )
  {
2586
    kill_running_servers();
unknown's avatar
unknown committed
2587

2588
    if ( ! $opt_start_dirty )
2589
    {
unknown's avatar
unknown committed
2590
      cleanup_stale_files();
2591 2592 2593 2594 2595 2596
      mysql_install_db();
      if ( $opt_force )
      {
	save_installed_db();
      }
    }
2597
    check_running_as_root();
2598
  }
2599 2600 2601 2602 2603
  else
  {
    # We have to create the 'var' and related directories
    cleanup_stale_files();
  }
2604 2605
}

unknown's avatar
unknown committed
2606 2607 2608
sub mysql_install_db () {

  install_db('master', $master->[0]->{'path_myddir'});
2609 2610

  # FIXME check if testcase really is using second master
2611
  copy_install_db('master', $master->[1]->{'path_myddir'});
2612

2613 2614
  # Install the number of slave databses needed
  for (my $idx= 0; $idx < $max_slave_num; $idx++)
2615
  {
2616
    copy_install_db("slave".($idx+1), $slave->[$idx]->{'path_myddir'});
2617
  }
unknown's avatar
unknown committed
2618

unknown's avatar
unknown committed
2619
  if ( ! $opt_skip_im )
2620 2621 2622 2623
  {
    im_prepare_env($instance_manager);
  }

unknown's avatar
unknown committed
2624 2625
  my $cluster_started_ok= 1; # Assume it can be started

2626 2627
  if ($opt_skip_ndbcluster || $glob_use_running_ndbcluster ||
      $clusters->[0]->{executable_setup_failed})
2628
  {
2629 2630 2631 2632 2633 2634 2635 2636 2637
    # Don't install master cluster
  }
  elsif (ndbcluster_start_install($clusters->[0]))
  {
    mtr_warning("Failed to start install of $clusters->[0]->{name}");
    $cluster_started_ok= 0;
  }

  if ($max_slave_num == 0 ||
2638 2639
      $opt_skip_ndbcluster_slave || $glob_use_running_ndbcluster_slave ||
      $clusters->[1]->{executable_setup_failed})
unknown's avatar
unknown committed
2640
  {
2641 2642 2643
    # Don't install slave cluster
  }
  elsif (ndbcluster_start_install($clusters->[1]))
2644
  {
2645
    mtr_warning("Failed to start install of $clusters->[1]->{name}");
unknown's avatar
unknown committed
2646 2647 2648 2649 2650 2651 2652 2653
    $cluster_started_ok= 0;
  }

  foreach my $cluster (@{$clusters})
  {

    next if !$cluster->{'pid'};

2654
    $cluster->{'installed_ok'}= 1; # Assume install suceeds
unknown's avatar
unknown committed
2655

2656
    if (ndbcluster_wait_started($cluster, ""))
2657 2658
    {
      # failed to install, disable usage and flag that its no ok
2659
      mtr_report("ndbcluster_install of $cluster->{'name'} failed");
2660
      $cluster->{"installed_ok"}= 0;
unknown's avatar
unknown committed
2661 2662

      $cluster_started_ok= 0;
2663
    }
2664 2665
  }

unknown's avatar
unknown committed
2666
  if ( ! $cluster_started_ok )
unknown's avatar
unknown committed
2667
  {
2668 2669
    if ( $opt_force)
    {
unknown's avatar
unknown committed
2670
      # Continue without cluster
2671 2672 2673
    }
    else
    {
unknown's avatar
unknown committed
2674
      mtr_error("To continue, re-run with '--force'.");
2675
    }
unknown's avatar
unknown committed
2676 2677
  }

unknown's avatar
unknown committed
2678 2679 2680 2681
  return 0;
}


2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693
sub copy_install_db ($$) {
  my $type=      shift;
  my $data_dir=  shift;

  mtr_report("Installing \u$type Database");

  # Just copy the installed db from first master
  mtr_copy_dir($master->[0]->{'path_myddir'}, $data_dir);

}


unknown's avatar
unknown committed
2694 2695 2696 2697
sub install_db ($$) {
  my $type=      shift;
  my $data_dir=  shift;

unknown's avatar
unknown committed
2698 2699
  my $init_db_sql=     "lib/init_db.sql";
  my $init_db_sql_tmp= "/tmp/init_db.sql$$";
unknown's avatar
unknown committed
2700 2701
  my $args;

unknown's avatar
unknown committed
2702
  mtr_report("Installing \u$type Database");
unknown's avatar
unknown committed
2703

unknown's avatar
unknown committed
2704
  open(IN, $init_db_sql)
unknown's avatar
unknown committed
2705
    or mtr_error("Can't open $init_db_sql: $!");
unknown's avatar
unknown committed
2706
  open(OUT, ">", $init_db_sql_tmp)
unknown's avatar
unknown committed
2707
    or mtr_error("Can't write to $init_db_sql_tmp: $!");
unknown's avatar
unknown committed
2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721
  while (<IN>)
  {
    chomp;
    s/\@HOSTNAME\@/$glob_hostname/;
    if ( /^\s*$/ )
    {
      print OUT "\n";
    }
    elsif (/;$/)
    {
      print OUT "$_\n";
    }
    else
    {
unknown's avatar
unknown committed
2722
      print OUT "$_ ";
unknown's avatar
unknown committed
2723 2724 2725 2726 2727
    }
  }
  close OUT;
  close IN;

unknown's avatar
unknown committed
2728 2729 2730 2731
  mtr_init_args(\$args);

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--bootstrap");
2732
  mtr_add_arg($args, "--console");
unknown's avatar
unknown committed
2733 2734 2735 2736 2737
  mtr_add_arg($args, "--skip-grant-tables");
  mtr_add_arg($args, "--basedir=%s", $path_my_basedir);
  mtr_add_arg($args, "--datadir=%s", $data_dir);
  mtr_add_arg($args, "--skip-innodb");
  mtr_add_arg($args, "--skip-ndbcluster");
2738
  mtr_add_arg($args, "--tmpdir=.");
2739
  mtr_add_arg($args, "--core-file");
unknown's avatar
unknown committed
2740

2741 2742 2743
  if ( $opt_debug )
  {
    mtr_add_arg($args, "--debug=d:t:i:A,%s/log/bootstrap_%s.trace",
unknown's avatar
unknown committed
2744
		$path_vardir_trace, $type);
2745 2746
  }

unknown's avatar
unknown committed
2747
  if ( ! $glob_netware )
unknown's avatar
unknown committed
2748 2749 2750 2751 2752
  {
    mtr_add_arg($args, "--language=%s", $path_language);
    mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
  }

2753 2754 2755 2756 2757
  # Log bootstrap command
  my $path_bootstrap_log= "$opt_vardir/log/bootstrap.log";
  mtr_tofile($path_bootstrap_log,
	     "$exe_mysqld " . join(" ", @$args) . "\n");

unknown's avatar
unknown committed
2758
  if ( mtr_run($exe_mysqld, $args, $init_db_sql_tmp,
2759 2760 2761
               $path_bootstrap_log, $path_bootstrap_log,
	       "", { append_log_file => 1 }) != 0 )

unknown's avatar
unknown committed
2762
  {
unknown's avatar
unknown committed
2763
    unlink($init_db_sql_tmp);
unknown's avatar
unknown committed
2764
    mtr_error("Error executing mysqld --bootstrap\n" .
unknown's avatar
unknown committed
2765 2766
              "Could not install $type test DBs");
  }
unknown's avatar
unknown committed
2767
  unlink($init_db_sql_tmp);
unknown's avatar
unknown committed
2768 2769 2770
}


2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782
sub im_prepare_env($) {
  my $instance_manager = shift;

  im_create_passwd_file($instance_manager);
  im_prepare_data_dir($instance_manager);
}


sub im_create_passwd_file($) {
  my $instance_manager = shift;

  my $pwd_file_path = $instance_manager->{'password_file'};
unknown's avatar
unknown committed
2783

2784
  mtr_report("Creating IM password file ($pwd_file_path)");
unknown's avatar
unknown committed
2785

2786 2787
  open(OUT, ">", $pwd_file_path)
    or mtr_error("Can't write to $pwd_file_path: $!");
unknown's avatar
unknown committed
2788

2789 2790
  print OUT $instance_manager->{'admin_login'}, ":",
        $instance_manager->{'admin_sha1'}, "\n";
unknown's avatar
unknown committed
2791

2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802
  close(OUT);
}


sub im_create_defaults_file($) {
  my $instance_manager = shift;

  my $defaults_file = $instance_manager->{'defaults_file'};

  open(OUT, ">", $defaults_file)
    or mtr_error("Can't write to $defaults_file: $!");
unknown's avatar
unknown committed
2803

2804 2805 2806 2807 2808
  print OUT <<EOF
[mysql]

[manager]
pid-file            = $instance_manager->{path_pid}
2809
angel-pid-file      = $instance_manager->{path_angel_pid}
2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833
socket              = $instance_manager->{path_sock}
port                = $instance_manager->{port}
password-file       = $instance_manager->{password_file}
default-mysqld-path = $exe_mysqld

EOF
;

  foreach my $instance (@{$instance_manager->{'instances'}})
  {
    my $server_id = $instance->{'server_id'};

    print OUT <<EOF
[mysqld$server_id]
socket              = $instance->{path_sock}
pid-file            = $instance->{path_pid}
port                = $instance->{port}
datadir             = $instance->{path_datadir}
log                 = $instance->{path_datadir}/mysqld$server_id.log
log-error           = $instance->{path_datadir}/mysqld$server_id.err.log
log-slow-queries    = $instance->{path_datadir}/mysqld$server_id.slow.log
language            = $path_language
character-sets-dir  = $path_charsetsdir
basedir             = $path_my_basedir
2834
server_id           = $server_id
2835 2836 2837 2838 2839
skip-stack-trace
skip-innodb
skip-ndbcluster
EOF
;
2840 2841 2842 2843
    if ( $mysql_version_id < 50100 )
    {
      print OUT "skip-bdb\n";
    }
unknown's avatar
unknown committed
2844
    print OUT "nonguarded\n" if $instance->{'nonguarded'};
2845 2846 2847 2848
    if ( $mysql_version_id >= 50100 )
    {
      print OUT "log-output=FILE\n" if $instance->{'old_log_format'};
    }
2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860
    print OUT "\n";
  }

  close(OUT);
}


sub im_prepare_data_dir($) {
  my $instance_manager = shift;

  foreach my $instance (@{$instance_manager->{'instances'}})
  {
2861
    copy_install_db(
2862 2863 2864 2865 2866 2867
      'im_mysqld_' . $instance->{'server_id'},
      $instance->{'path_datadir'});
  }
}


2868

2869 2870 2871 2872
#
# Restore snapshot of the installed slave databases
# if the snapshot exists
#
2873 2874
sub restore_slave_databases ($) {
  my ($num_slaves)= @_;
2875 2876 2877

  if ( -d $path_snapshot)
  {
2878
    for (my $idx= 0; $idx < $num_slaves; $idx++)
2879 2880 2881 2882 2883 2884 2885 2886 2887 2888
    {
      my $data_dir= $slave->[$idx]->{'path_myddir'};
      my $name= basename($data_dir);
      rmtree($data_dir);
      mtr_copy_dir("$path_snapshot/$name", $data_dir);
    }
  }
}


2889 2890 2891
sub run_testcase_check_skip_test($)
{
  my ($tinfo)= @_;
2892

unknown's avatar
unknown committed
2893 2894 2895 2896 2897 2898 2899 2900 2901
  # ----------------------------------------------------------------------
  # If marked to skip, just print out and return.
  # Note that a test case not marked as 'skip' can still be
  # skipped later, because of the test case itself in cooperation
  # with the mysqltest program tells us so.
  # ----------------------------------------------------------------------

  if ( $tinfo->{'skip'} )
  {
unknown's avatar
unknown committed
2902
    mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
2903
    mtr_report_test_skipped($tinfo);
2904
    return 1;
unknown's avatar
unknown committed
2905 2906
  }

2907
  if ($tinfo->{'ndb_test'})
2908
  {
2909 2910 2911 2912
    foreach my $cluster (@{$clusters})
    {
      last if ($opt_skip_ndbcluster_slave and
	       $cluster->{'name'} eq 'Slave');
2913

2914 2915 2916 2917 2918 2919 2920 2921 2922
      # If test needs this cluster, check binaries was found ok
      if ( $cluster->{'executable_setup_failed'} )
      {
	mtr_report_test_name($tinfo);
	$tinfo->{comment}=
	  "Failed to find cluster binaries";
	mtr_report_test_failed($tinfo);
	return 1;
      }
unknown's avatar
unknown committed
2923

2924 2925 2926 2927
      # If test needs this cluster, check it was installed ok
      if ( !$cluster->{'installed_ok'} )
      {
	mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
2928 2929
	$tinfo->{comment}=
	  "Cluster $cluster->{'name'} was not installed ok";
2930 2931 2932
	mtr_report_test_failed($tinfo);
	return 1;
      }
unknown's avatar
unknown committed
2933 2934

    }
2935 2936
  }

2937
  if ( $tinfo->{'component_id'} eq 'im' )
unknown's avatar
unknown committed
2938
  {
2939 2940
      # If test needs im, check binaries was found ok
    if ( $instance_manager->{'executable_setup_failed'} )
unknown's avatar
unknown committed
2941
    {
2942 2943 2944 2945 2946
      mtr_report_test_name($tinfo);
      $tinfo->{comment}=
	"Failed to find MySQL manager binaries";
      mtr_report_test_failed($tinfo);
      return 1;
unknown's avatar
unknown committed
2947
    }
unknown's avatar
unknown committed
2948
  }
unknown's avatar
unknown committed
2949

2950 2951
  return 0;
}
unknown's avatar
unknown committed
2952

unknown's avatar
unknown committed
2953

2954 2955 2956 2957 2958
sub do_before_run_mysqltest($)
{
  my $tinfo= shift;
  my $tname= $tinfo->{'name'};

2959 2960
  # Remove old files produced by mysqltest
  my $result_dir= "r";
2961
  if ( $opt_suite ne "main" )
2962
  {
2963
    $result_dir= "suite/$opt_suite/r";
2964
  }
2965 2966 2967 2968
  unlink("$result_dir/$tname.reject");
  unlink("$result_dir/$tname.progress");
  unlink("$result_dir/$tname.log");
  unlink("$result_dir/$tname.warnings");
2969

2970 2971 2972
  if (!$opt_extern)
  {
    mtr_tonewfile($path_current_test_log,"$tname\n"); # Always tell where we are
2973

2974
    # output current test to ndbcluster log file to enable diagnostics
2975
    mtr_tofile($path_ndb_testrun_log,"CURRENT TEST $tname\n");
unknown's avatar
unknown committed
2976

2977
    mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
2978 2979
    if ( $master->[1]->{'pid'} )
    {
2980 2981
      mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");
    }
2982
  }
2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995

  if ( $mysql_version_id < 50000 )
  {
    # Set envirnoment variable NDB_STATUS_OK to 1
    # if script decided to run mysqltest cluster _is_ installed ok
    $ENV{'NDB_STATUS_OK'} = "1";
  }
  elsif ( $mysql_version_id < 50100 )
  {
    # Set envirnoment variable NDB_STATUS_OK to YES
    # if script decided to run mysqltest cluster _is_ installed ok
    $ENV{'NDB_STATUS_OK'} = "YES";
  }
2996
}
unknown's avatar
unknown committed
2997

2998 2999 3000 3001
sub do_after_run_mysqltest($)
{
  my $tinfo= shift;
  my $tname= $tinfo->{'name'};
unknown's avatar
unknown committed
3002

3003
  mtr_tofile($path_mysqltest_log,"CURRENT TEST $tname\n");
unknown's avatar
unknown committed
3004

unknown's avatar
unknown committed
3005 3006 3007
  # Save info from this testcase run to mysqltest.log
  mtr_appendfile_to_file($path_timefile, $path_mysqltest_log)
    if -f $path_timefile;
unknown's avatar
unknown committed
3008

3009 3010
  # Remove the file that mysqltest writes info to
  unlink($path_timefile);
unknown's avatar
unknown committed
3011

unknown's avatar
unknown committed
3012
}
unknown's avatar
unknown committed
3013

3014

3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027
sub find_testcase_skipped_reason($)
{
  my ($tinfo)= @_;

  # Open mysqltest.log
  my $F= IO::File->new($path_timefile) or
    mtr_error("can't open file \"$path_timefile\": $!");
  my $reason;

  while ( my $line= <$F> )
  {
    # Look for "reason: <reason fo skiping test>"
    if ( $line =~ /reason: (.*)/ )
unknown's avatar
unknown committed
3028
    {
3029 3030 3031
      $reason= $1;
    }
  }
3032

3033 3034 3035 3036
  if ( ! $reason )
  {
    mtr_warning("Could not find reason for skipping test in $path_timefile");
    $reason= "Detected by testcase(reason unknown) ";
3037
  }
3038 3039 3040 3041
  $tinfo->{'comment'}= $reason;
}


3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052
sub analyze_testcase_failure_sync_with_master($)
{
  my ($tinfo)= @_;

  my $args;
  mtr_init_args(\$args);

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--silent");
  mtr_add_arg($args, "--skip-safemalloc");
  mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
3053
  mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065

  mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
  mtr_add_arg($args, "--port=%d", $master->[0]->{'port'});
  mtr_add_arg($args, "--database=test");
  mtr_add_arg($args, "--user=%s", $opt_user);
  mtr_add_arg($args, "--password=");

  # Run the test file and append output to log file
  mtr_run_test($exe_mysqltest,$args,
	       "include/analyze_failure_sync_with_master.test",
	       "$path_timefile", "$path_timefile","",
	       { append_log_file => 1 });
unknown's avatar
unknown committed
3066

3067 3068 3069 3070 3071
}

sub analyze_testcase_failure($)
{
  my ($tinfo)= @_;
unknown's avatar
unknown committed
3072

3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084
  # Open mysqltest.log
  my $F= IO::File->new($path_timefile) or
    mtr_error("can't open file \"$path_timefile\": $!");

  while ( my $line= <$F> )
  {
    # Look for "mysqltest: At line nnn: <error>
    if ( $line =~ /mysqltest: At line [0-9]*: (.*)/ )
    {
      my $error= $1;
      # Look for "could not sync with master"
      if ( $error =~ /could not sync with master/ )
unknown's avatar
unknown committed
3085
      {
3086
	analyze_testcase_failure_sync_with_master($tinfo);
unknown's avatar
unknown committed
3087 3088
      }
    }
3089 3090
  }
}
unknown's avatar
unknown committed
3091

3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110
##############################################################################
#
#  Run a single test case
#
##############################################################################

# When we get here, we have already filtered out test cases that doesn't
# apply to the current setup, for example if we use a running server, test
# cases that restart the server are dropped. So this function should mostly
# be about doing things, not a lot of logic.

# We don't start and kill the servers for each testcase. But some
# testcases needs a restart, because they specify options to start
# mysqld with. After that testcase, we need to restart again, to set
# back the normal options.

sub run_testcase ($) {
  my $tinfo=  shift;

3111 3112 3113 3114 3115
  # -------------------------------------------------------
  # Init variables that can change between each test case
  # -------------------------------------------------------

  $ENV{'TZ'}= $tinfo->{'timezone'};
3116
  mtr_verbose("Setting timezone: $tinfo->{'timezone'}");
3117

3118 3119 3120 3121 3122
  my $master_restart= run_testcase_need_master_restart($tinfo);
  my $slave_restart= run_testcase_need_slave_restart($tinfo);

  if ($master_restart or $slave_restart)
  {
3123 3124 3125 3126
    # Can't restart a running server that may be in use
    if ( $glob_use_running_server )
    {
      mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
3127
      $tinfo->{comment}= "Can't restart a running server";
3128 3129
      mtr_report_test_skipped($tinfo);
      return;
3130
    }
unknown's avatar
unknown committed
3131

3132 3133 3134 3135 3136
    run_testcase_stop_servers($tinfo, $master_restart, $slave_restart);
  }
  my $died= mtr_record_dead_children();
  if ($died or $master_restart or $slave_restart)
  {
3137
    if (run_testcase_start_servers($tinfo))
unknown's avatar
unknown committed
3138
    {
3139 3140 3141
      mtr_report_test_name($tinfo);
      report_failure_and_restart($tinfo);
      return 1;
unknown's avatar
unknown committed
3142
    }
3143
  }
unknown's avatar
unknown committed
3144

unknown's avatar
unknown committed
3145
  # ----------------------------------------------------------------------
3146 3147
  # If --start-and-exit or --start-dirty given, stop here to let user manually
  # run tests
unknown's avatar
unknown committed
3148
  # ----------------------------------------------------------------------
3149
  if ( $opt_start_and_exit or $opt_start_dirty )
unknown's avatar
unknown committed
3150
  {
3151
    mtr_timer_stop_all($glob_timers);
unknown's avatar
unknown committed
3152 3153 3154 3155
    mtr_report("\nServers started, exiting");
    exit(0);
  }

unknown's avatar
unknown committed
3156
  {
3157
    do_before_run_mysqltest($tinfo);
unknown's avatar
unknown committed
3158

unknown's avatar
unknown committed
3159
    my $res= run_mysqltest($tinfo);
3160
    mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
3161 3162 3163 3164
    if ( $res == 0 )
    {
      mtr_report_test_passed($tinfo);
    }
unknown's avatar
unknown committed
3165
    elsif ( $res == 62 )
unknown's avatar
unknown committed
3166 3167
    {
      # Testcase itself tell us to skip this one
3168 3169

      # Try to get reason from mysqltest.log
3170
      find_testcase_skipped_reason($tinfo);
unknown's avatar
unknown committed
3171 3172
      mtr_report_test_skipped($tinfo);
    }
3173 3174 3175 3176 3177
    elsif ( $res == 63 )
    {
      $tinfo->{'timeout'}= 1;           # Mark as timeout
      report_failure_and_restart($tinfo);
    }
unknown's avatar
unknown committed
3178
    elsif ( $res == 1 )
unknown's avatar
unknown committed
3179
    {
3180
      if ( $opt_force )
unknown's avatar
unknown committed
3181
      {
3182
	analyze_testcase_failure($tinfo);
unknown's avatar
unknown committed
3183
      }
unknown's avatar
unknown committed
3184 3185 3186
      # Test case failure reported by mysqltest
      report_failure_and_restart($tinfo);
    }
unknown's avatar
unknown committed
3187 3188
    else
    {
unknown's avatar
unknown committed
3189 3190 3191
      # mysqltest failed, probably crashed
      $tinfo->{comment}=
	"mysqltest returned unexpected code $res, it has probably crashed";
unknown's avatar
unknown committed
3192 3193
      report_failure_and_restart($tinfo);
    }
3194 3195

    do_after_run_mysqltest($tinfo);
unknown's avatar
unknown committed
3196
  }
3197 3198 3199 3200

  # ----------------------------------------------------------------------
  # Stop Instance Manager if we are processing an IM-test case.
  # ----------------------------------------------------------------------
3201
  if ( $tinfo->{'component_id'} eq 'im' and
3202
       !mtr_im_stop($instance_manager, $tinfo->{'name'}) )
3203
  {
3204
    mtr_error("Failed to stop Instance Manager.")
3205
  }
unknown's avatar
unknown committed
3206
}
unknown's avatar
unknown committed
3207

3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220

#
# Save a snapshot of the installed test db(s)
# I.e take a snapshot of the var/ dir
#
sub save_installed_db () {

  mtr_report("Saving snapshot of installed databases");
  rmtree($path_snapshot);

  foreach my $data_dir (@data_dir_lst)
  {
    my $name= basename($data_dir);
3221
    mtr_copy_dir("$data_dir", "$path_snapshot/$name");
3222 3223 3224
  }
}

3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244

#
# Save any interesting files in the data_dir
# before the data dir is removed.
#
sub save_files_before_restore($$) {
  my $test_name= shift;
  my $data_dir= shift;
  my $save_name= "$opt_vardir/log/$test_name";

  # Look for core files
  foreach my $core_file ( glob("$data_dir/core*") )
  {
    my $core_name= basename($core_file);
    mtr_report("Saving $core_name");
    mkdir($save_name) if ! -d $save_name;
    rename("$core_file", "$save_name/$core_name");
  }
}

unknown's avatar
unknown committed
3245

3246 3247 3248 3249
#
# Restore snapshot of the installed test db(s)
# if the snapshot exists
#
3250 3251
sub restore_installed_db ($) {
  my $test_name= shift;
3252 3253 3254 3255 3256 3257 3258 3259

  if ( -d $path_snapshot)
  {
    mtr_report("Restoring snapshot of databases");

    foreach my $data_dir (@data_dir_lst)
    {
      my $name= basename($data_dir);
3260
      save_files_before_restore($test_name, $data_dir);
3261
      rmtree("$data_dir");
3262
      mtr_copy_dir("$path_snapshot/$name", "$data_dir");
3263
    }
3264

3265 3266 3267 3268
    # Remove the ndb_*_fs dirs for all ndbd nodes
    # forcing a clean start of ndb
    foreach my $cluster (@{$clusters})
    {
3269
      foreach my $ndbd (@{$cluster->{'ndbds'}})
3270
      {
3271
	rmtree("$ndbd->{'path_fs'}" );
3272
      }
3273 3274 3275 3276
    }
  }
  else
  {
3277 3278
    # No snapshot existed
    mtr_error("No snapshot existed");
3279 3280 3281
  }
}

unknown's avatar
unknown committed
3282 3283 3284 3285 3286 3287
sub report_failure_and_restart ($) {
  my $tinfo= shift;

  mtr_report_test_failed($tinfo);
  mtr_show_failed_diff($tinfo->{'name'});
  print "\n";
3288
  if ( $opt_force )
unknown's avatar
unknown committed
3289
  {
3290 3291 3292
    # Stop all servers that are known to be running
    stop_all_servers();

3293
    # Restore the snapshot of the installed test db
3294
    restore_installed_db($tinfo->{'name'});
3295 3296
    print "Resuming Tests\n\n";
    return;
unknown's avatar
unknown committed
3297 3298
  }

3299 3300 3301
  my $test_mode= join(" ", @::glob_test_mode) || "default";
  print "Aborting: $tinfo->{'name'} failed in $test_mode mode. ";
  print "To continue, re-run with '--force'.\n";
unknown's avatar
unknown committed
3302 3303 3304
  if ( ! $glob_debugger and
       ! $glob_use_running_server and
       ! $glob_use_embedded_server )
unknown's avatar
unknown committed
3305
  {
unknown's avatar
unknown committed
3306
    stop_all_servers();
unknown's avatar
unknown committed
3307
  }
3308 3309
  mtr_exit(1);

unknown's avatar
unknown committed
3310 3311 3312 3313 3314 3315 3316 3317 3318
}


##############################################################################
#
#  Start and stop servers
#
##############################################################################

unknown's avatar
unknown committed
3319

3320 3321 3322 3323 3324
sub do_before_start_master ($) {
  my ($tinfo)= @_;

  my $tname= $tinfo->{'name'};
  my $init_script= $tinfo->{'master_sh'};
unknown's avatar
unknown committed
3325 3326 3327

  # FIXME what about second master.....

3328
  foreach my $bin ( glob("$opt_vardir/log/master*-bin*") )
unknown's avatar
unknown committed
3329
  {
3330
    unlink($bin);
unknown's avatar
unknown committed
3331 3332
  }

unknown's avatar
unknown committed
3333
  # FIXME only remove the ones that are tied to this master
unknown's avatar
unknown committed
3334
  # Remove old master.info and relay-log.info files
unknown's avatar
unknown committed
3335 3336 3337 3338
  unlink("$master->[0]->{'path_myddir'}/master.info");
  unlink("$master->[0]->{'path_myddir'}/relay-log.info");
  unlink("$master->[1]->{'path_myddir'}/master.info");
  unlink("$master->[1]->{'path_myddir'}/relay-log.info");
unknown's avatar
unknown committed
3339

unknown's avatar
unknown committed
3340
  # Run master initialization shell script if one exists
unknown's avatar
unknown committed
3341
  if ( $init_script )
unknown's avatar
unknown committed
3342
  {
unknown's avatar
unknown committed
3343 3344 3345 3346
    my $ret= mtr_run("/bin/sh", [$init_script], "", "", "", "");
    if ( $ret != 0 )
    {
      # FIXME rewrite those scripts to return 0 if successful
unknown's avatar
unknown committed
3347
      # mtr_warning("$init_script exited with code $ret");
unknown's avatar
unknown committed
3348
    }
unknown's avatar
unknown committed
3349 3350 3351
  }
}

unknown's avatar
unknown committed
3352

3353 3354
sub do_before_start_slave ($) {
  my ($tinfo)= @_;
unknown's avatar
unknown committed
3355

3356 3357
  my $tname= $tinfo->{'name'};
  my $init_script= $tinfo->{'master_sh'};
unknown's avatar
unknown committed
3358

3359
  foreach my $bin ( glob("$opt_vardir/log/slave*-bin*") )
unknown's avatar
unknown committed
3360
  {
3361
    unlink($bin);
unknown's avatar
unknown committed
3362 3363
  }

3364 3365 3366
  unlink("$slave->[0]->{'path_myddir'}/master.info");
  unlink("$slave->[0]->{'path_myddir'}/relay-log.info");

unknown's avatar
unknown committed
3367
  # Run slave initialization shell script if one exists
unknown's avatar
unknown committed
3368
  if ( $init_script )
unknown's avatar
unknown committed
3369
  {
unknown's avatar
unknown committed
3370 3371 3372 3373
    my $ret= mtr_run("/bin/sh", [$init_script], "", "", "", "");
    if ( $ret != 0 )
    {
      # FIXME rewrite those scripts to return 0 if successful
unknown's avatar
unknown committed
3374
      # mtr_warning("$init_script exited with code $ret");
unknown's avatar
unknown committed
3375
    }
unknown's avatar
unknown committed
3376 3377
  }

unknown's avatar
unknown committed
3378 3379 3380 3381
  foreach my $bin ( glob("$slave->[0]->{'path_myddir'}/log.*") )
  {
    unlink($bin);
  }
unknown's avatar
unknown committed
3382 3383
}

unknown's avatar
unknown committed
3384

unknown's avatar
unknown committed
3385
sub mysqld_arguments ($$$$$) {
unknown's avatar
unknown committed
3386
  my $args=              shift;
unknown's avatar
unknown committed
3387
  my $type=              shift;
unknown's avatar
unknown committed
3388 3389 3390 3391
  my $idx=               shift;
  my $extra_opt=         shift;
  my $slave_master_info= shift;

unknown's avatar
unknown committed
3392 3393 3394
  my $sidx= "";                 # Index as string, 0 is empty string
  if ( $idx > 0 )
  {
unknown's avatar
unknown committed
3395
    $sidx= "$idx";
unknown's avatar
unknown committed
3396 3397 3398 3399 3400 3401 3402
  }

  my $prefix= "";               # If mysqltest server arg

  if ( $glob_use_embedded_server )
  {
    $prefix= "--server-arg=";
unknown's avatar
unknown committed
3403 3404
  } else {
    # We can't pass embedded server --no-defaults
unknown's avatar
unknown committed
3405
    mtr_add_arg($args, "--no-defaults");
unknown's avatar
unknown committed
3406 3407
  }

3408
  mtr_add_arg($args, "%s--console", $prefix);
unknown's avatar
unknown committed
3409 3410
  mtr_add_arg($args, "%s--basedir=%s", $prefix, $path_my_basedir);
  mtr_add_arg($args, "%s--character-sets-dir=%s", $prefix, $path_charsetsdir);
unknown's avatar
unknown committed
3411

unknown's avatar
unknown committed
3412 3413 3414 3415 3416
  if ( $mysql_version_id >= 50000 )
  {
    mtr_add_arg($args, "%s--log-bin-trust-function-creators", $prefix);
  }

unknown's avatar
unknown committed
3417 3418 3419 3420
  mtr_add_arg($args, "%s--default-character-set=latin1", $prefix);
  mtr_add_arg($args, "%s--language=%s", $prefix, $path_language);
  mtr_add_arg($args, "%s--tmpdir=$opt_tmpdir", $prefix);

unknown's avatar
unknown committed
3421
  if ( $opt_valgrind_mysqld )
unknown's avatar
unknown committed
3422 3423
  {
    mtr_add_arg($args, "%s--skip-safemalloc", $prefix);
3424 3425 3426 3427 3428

    if ( $mysql_version_id < 50100 )
    {
      mtr_add_arg($args, "%s--skip-bdb", $prefix);
    }
unknown's avatar
unknown committed
3429 3430 3431 3432 3433 3434
  }

  my $pidfile;

  if ( $type eq 'master' )
  {
unknown's avatar
unknown committed
3435 3436
    my $id= $idx > 0 ? $idx + 101 : 1;

3437 3438 3439 3440 3441
    if (! $opt_skip_master_binlog)
    {
      mtr_add_arg($args, "%s--log-bin=%s/log/master-bin%s", $prefix,
                  $opt_vardir, $sidx);
    }
unknown's avatar
unknown committed
3442
    mtr_add_arg($args, "%s--pid-file=%s", $prefix,
unknown's avatar
unknown committed
3443
                $master->[$idx]->{'path_pid'});
unknown's avatar
unknown committed
3444
    mtr_add_arg($args, "%s--port=%d", $prefix,
unknown's avatar
unknown committed
3445
                $master->[$idx]->{'port'});
unknown's avatar
unknown committed
3446
    mtr_add_arg($args, "%s--server-id=%d", $prefix, $id);
unknown's avatar
unknown committed
3447
    mtr_add_arg($args, "%s--socket=%s", $prefix,
unknown's avatar
unknown committed
3448
                $master->[$idx]->{'path_sock'});
3449
    mtr_add_arg($args, "%s--innodb_data_file_path=ibdata1:10M:autoextend", $prefix);
unknown's avatar
unknown committed
3450 3451 3452
    mtr_add_arg($args, "%s--local-infile", $prefix);
    mtr_add_arg($args, "%s--datadir=%s", $prefix,
                $master->[$idx]->{'path_myddir'});
unknown's avatar
unknown committed
3453

3454
    if ( $idx > 0 or !$use_innodb)
unknown's avatar
unknown committed
3455 3456 3457 3458
    {
      mtr_add_arg($args, "%s--skip-innodb", $prefix);
    }

unknown's avatar
unknown committed
3459 3460 3461
    my $cluster= $clusters->[$master->[$idx]->{'cluster'}];
    if ( $opt_skip_ndbcluster ||
	 !$cluster->{'pid'})
unknown's avatar
unknown committed
3462 3463 3464
    {
      mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
    }
3465
    else
unknown's avatar
unknown committed
3466 3467 3468
    {
      mtr_add_arg($args, "%s--ndbcluster", $prefix);
      mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
unknown's avatar
unknown committed
3469
		  $cluster->{'connect_string'});
3470
      if ( $mysql_version_id >= 50100 )
3471 3472 3473
      {
	mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
      }
unknown's avatar
unknown committed
3474
    }
unknown's avatar
unknown committed
3475 3476 3477 3478 3479
  }

  if ( $type eq 'slave' )
  {
    my $slave_server_id=  2 + $idx;
unknown's avatar
unknown committed
3480
    my $slave_rpl_rank= $slave_server_id;
unknown's avatar
unknown committed
3481 3482 3483 3484

    mtr_add_arg($args, "%s--datadir=%s", $prefix,
                $slave->[$idx]->{'path_myddir'});
    mtr_add_arg($args, "%s--init-rpl-role=slave", $prefix);
3485 3486 3487 3488 3489 3490
    if (! $opt_skip_slave_binlog)
    {
      mtr_add_arg($args, "%s--log-bin=%s/log/slave%s-bin", $prefix,
                  $opt_vardir, $sidx); # FIXME use own dir for binlogs
      mtr_add_arg($args, "%s--log-slave-updates", $prefix);
    }
unknown's avatar
unknown committed
3491

unknown's avatar
unknown committed
3492
    mtr_add_arg($args, "%s--log=%s", $prefix,
unknown's avatar
unknown committed
3493
                $slave->[$idx]->{'path_mylog'});
unknown's avatar
unknown committed
3494 3495
    mtr_add_arg($args, "%s--master-retry-count=10", $prefix);
    mtr_add_arg($args, "%s--pid-file=%s", $prefix,
unknown's avatar
unknown committed
3496
                $slave->[$idx]->{'path_pid'});
unknown's avatar
unknown committed
3497
    mtr_add_arg($args, "%s--port=%d", $prefix,
unknown's avatar
unknown committed
3498
                $slave->[$idx]->{'port'});
3499 3500
    mtr_add_arg($args, "%s--relay-log=%s/log/slave%s-relay-bin", $prefix,
                $opt_vardir, $sidx);
unknown's avatar
unknown committed
3501 3502
    mtr_add_arg($args, "%s--report-host=127.0.0.1", $prefix);
    mtr_add_arg($args, "%s--report-port=%d", $prefix,
unknown's avatar
unknown committed
3503
                $slave->[$idx]->{'port'});
unknown's avatar
unknown committed
3504 3505 3506 3507
    mtr_add_arg($args, "%s--report-user=root", $prefix);
    mtr_add_arg($args, "%s--skip-innodb", $prefix);
    mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
    mtr_add_arg($args, "%s--skip-slave-start", $prefix);
3508 3509 3510 3511

    # Directory where slaves find the dumps generated by "load data"
    # on the server. The path need to have constant length otherwise
    # test results will vary, thus a relative path is used.
3512
    my $slave_load_path= "../tmp";
unknown's avatar
unknown committed
3513
    mtr_add_arg($args, "%s--slave-load-tmpdir=%s", $prefix,
3514
                $slave_load_path);
unknown's avatar
unknown committed
3515
    mtr_add_arg($args, "%s--socket=%s", $prefix,
unknown's avatar
unknown committed
3516
                $slave->[$idx]->{'path_sock'});
unknown's avatar
unknown committed
3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532
    mtr_add_arg($args, "%s--set-variable=slave_net_timeout=10", $prefix);

    if ( @$slave_master_info )
    {
      foreach my $arg ( @$slave_master_info )
      {
        mtr_add_arg($args, "%s%s", $prefix, $arg);
      }
    }
    else
    {
      mtr_add_arg($args, "%s--master-user=root", $prefix);
      mtr_add_arg($args, "%s--master-connect-retry=1", $prefix);
      mtr_add_arg($args, "%s--master-host=127.0.0.1", $prefix);
      mtr_add_arg($args, "%s--master-password=", $prefix);
      mtr_add_arg($args, "%s--master-port=%d", $prefix,
unknown's avatar
unknown committed
3533
                  $master->[0]->{'port'}); # First master
unknown's avatar
unknown committed
3534 3535 3536
      mtr_add_arg($args, "%s--server-id=%d", $prefix, $slave_server_id);
      mtr_add_arg($args, "%s--rpl-recovery-rank=%d", $prefix, $slave_rpl_rank);
    }
unknown's avatar
unknown committed
3537 3538 3539 3540

    if ( $opt_skip_ndbcluster_slave ||
         $slave->[$idx]->{'cluster'} == -1 ||
	 !$clusters->[$slave->[$idx]->{'cluster'}]->{'pid'} )
unknown's avatar
unknown committed
3541 3542 3543
    {
      mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
    }
unknown's avatar
unknown committed
3544
    else
unknown's avatar
unknown committed
3545 3546 3547
    {
      mtr_add_arg($args, "%s--ndbcluster", $prefix);
      mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
unknown's avatar
unknown committed
3548
		  $clusters->[$slave->[$idx]->{'cluster'}]->{'connect_string'});
3549
      if ( $mysql_version_id >= 50100 )
3550 3551 3552
      {
	mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
      }
unknown's avatar
unknown committed
3553
    }
unknown's avatar
unknown committed
3554 3555 3556 3557 3558 3559
  } # end slave

  if ( $opt_debug )
  {
    if ( $type eq 'master' )
    {
3560
      mtr_add_arg($args, "%s--debug=d:t:i:A,%s/log/master%s.trace",
unknown's avatar
unknown committed
3561
                  $prefix, $path_vardir_trace, $sidx);
unknown's avatar
unknown committed
3562 3563 3564
    }
    if ( $type eq 'slave' )
    {
3565
      mtr_add_arg($args, "%s--debug=d:t:i:A,%s/log/slave%s.trace",
unknown's avatar
unknown committed
3566
                  $prefix, $path_vardir_trace, $sidx);
unknown's avatar
unknown committed
3567 3568 3569 3570 3571 3572 3573 3574
    }
  }

  # FIXME always set nowdays??? SMALL_SERVER
  mtr_add_arg($args, "%s--key_buffer_size=1M", $prefix);
  mtr_add_arg($args, "%s--sort_buffer=256K", $prefix);
  mtr_add_arg($args, "%s--max_heap_table_size=1M", $prefix);

3575
  if ( $opt_ssl_supported )
unknown's avatar
unknown committed
3576
  {
3577 3578 3579 3580 3581 3582
    mtr_add_arg($args, "%s--ssl-ca=%s/std_data/cacert.pem", $prefix,
                $glob_mysql_test_dir);
    mtr_add_arg($args, "%s--ssl-cert=%s/std_data/server-cert.pem", $prefix,
                $glob_mysql_test_dir);
    mtr_add_arg($args, "%s--ssl-key=%s/std_data/server-key.pem", $prefix,
                $glob_mysql_test_dir);
unknown's avatar
unknown committed
3583 3584 3585 3586 3587 3588 3589
  }

  if ( $opt_warnings )
  {
    mtr_add_arg($args, "%s--log-warnings", $prefix);
  }

unknown's avatar
unknown committed
3590 3591
  # Indicate to "mysqld" it will be debugged in debugger
  if ( $glob_debugger )
unknown's avatar
unknown committed
3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603
  {
    mtr_add_arg($args, "%s--gdb", $prefix);
  }

  # If we should run all tests cases, we will use a local server for that

  if ( -w "/" )
  {
    # We are running as root;  We need to add the --root argument
    mtr_add_arg($args, "%s--user=root", $prefix);
  }

unknown's avatar
unknown committed
3604
  my $found_skip_core= 0;
unknown's avatar
unknown committed
3605
  foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt )
unknown's avatar
unknown committed
3606
  {
unknown's avatar
unknown committed
3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619
    # Allow --skip-core-file to be set in master.opt file
    if ($arg eq "--skip-core-file")
    {
      $found_skip_core= 1;
    }
    else
    {
      mtr_add_arg($args, "%s%s", $prefix, $arg);
    }
  }
  if ( !$found_skip_core )
  {
    mtr_add_arg($args, "%s%s", $prefix, "--core-file");
unknown's avatar
unknown committed
3620 3621 3622 3623 3624 3625 3626
  }

  if ( $opt_bench )
  {
    mtr_add_arg($args, "%s--rpl-recovery-rank=1", $prefix);
    mtr_add_arg($args, "%s--init-rpl-role=master", $prefix);
  }
unknown's avatar
unknown committed
3627
  elsif ( $type eq 'master' )
unknown's avatar
unknown committed
3628 3629
  {
    mtr_add_arg($args, "%s--open-files-limit=1024", $prefix);
unknown's avatar
unknown committed
3630
    mtr_add_arg($args, "%s--log=%s", $prefix, $master->[0]->{'path_mylog'});
unknown's avatar
unknown committed
3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642
  }

  return $args;
}


##############################################################################
#
#  Start mysqld and return the PID
#
##############################################################################

unknown's avatar
unknown committed
3643 3644
sub mysqld_start ($$$) {
  my $mysqld=            shift;
unknown's avatar
unknown committed
3645 3646
  my $extra_opt=         shift;
  my $slave_master_info= shift;
unknown's avatar
unknown committed
3647 3648 3649

  my $args;                             # Arg vector
  my $exe;
3650
  my $pid= -1;
unknown's avatar
unknown committed
3651 3652 3653 3654
  my $wait_for_pid_file= 1;

  my $type= $mysqld->{'type'};
  my $idx= $mysqld->{'idx'};
unknown's avatar
unknown committed
3655

3656 3657 3658
  mtr_error("Internal error: mysqld should never be started for embedded")
    if $glob_use_embedded_server;

unknown's avatar
unknown committed
3659
  if ( $type eq 'master' )
unknown's avatar
unknown committed
3660
  {
unknown's avatar
unknown committed
3661 3662
    $exe= $exe_master_mysqld;
  }
3663
  elsif ( $type eq 'slave' )
unknown's avatar
unknown committed
3664 3665
  {
    $exe= $exe_slave_mysqld;
unknown's avatar
unknown committed
3666 3667 3668
  }
  else
  {
3669
    mtr_error("Unknown 'type' \"$type\" passed to mysqld_start");
unknown's avatar
unknown committed
3670 3671 3672 3673
  }

  mtr_init_args(\$args);

unknown's avatar
unknown committed
3674
  if ( $opt_valgrind_mysqld )
unknown's avatar
unknown committed
3675
  {
unknown's avatar
unknown committed
3676
    valgrind_arguments($args, \$exe);
unknown's avatar
unknown committed
3677 3678
  }

unknown's avatar
unknown committed
3679
  mysqld_arguments($args,$type,$idx,$extra_opt,$slave_master_info);
unknown's avatar
unknown committed
3680

unknown's avatar
unknown committed
3681 3682
  if ( $opt_gdb || $opt_manual_gdb)
  {
3683
    gdb_arguments(\$args, \$exe, "$type"."_$idx");
unknown's avatar
unknown committed
3684 3685 3686
  }
  elsif ( $opt_ddd || $opt_manual_ddd )
  {
3687
    ddd_arguments(\$args, \$exe, "$type"."_$idx");
unknown's avatar
unknown committed
3688
  }
3689 3690 3691
  elsif ( $opt_debugger )
  {
    debugger_arguments(\$args, \$exe, "$type"."_$idx");
unknown's avatar
unknown committed
3692
  }
3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703
  elsif ( $opt_manual_debug )
  {
     print "\nStart $type in your debugger\n" .
           "dir: $glob_mysql_test_dir\n" .
           "exe: $exe\n" .
	   "args:  " . join(" ", @$args)  . "\n\n" .
	   "Waiting ....\n";

     # Indicate the exe should not be started
    $exe= undef;
  }
unknown's avatar
unknown committed
3704 3705 3706 3707 3708
  else
  {
    # Default to not wait until pid file has been created
    $wait_for_pid_file= 0;
  }
unknown's avatar
unknown committed
3709

unknown's avatar
unknown committed
3710
  if ( defined $exe )
unknown's avatar
unknown committed
3711
  {
unknown's avatar
unknown committed
3712 3713 3714 3715 3716
    $pid= mtr_spawn($exe, $args, "",
		    $mysqld->{'path_myerr'},
		    $mysqld->{'path_myerr'},
		    "",
		    { append_log_file => 1 });
unknown's avatar
unknown committed
3717 3718
  }

unknown's avatar
unknown committed
3719 3720 3721 3722

  if ( $wait_for_pid_file && !sleep_until_file_created($mysqld->{'path_pid'},
						       $mysqld->{'start_timeout'},
						       $pid))
unknown's avatar
unknown committed
3723
  {
unknown's avatar
unknown committed
3724 3725

    mtr_error("Failed to start mysqld $mysqld->{'type'}");
unknown's avatar
unknown committed
3726 3727
  }

unknown's avatar
unknown committed
3728 3729 3730

  # Remember pid of the started process
  $mysqld->{'pid'}= $pid;
3731 3732 3733

  # Remember options used when starting
  $mysqld->{'start_opts'}= $extra_opt;
3734
  $mysqld->{'start_slave_master_info'}= $slave_master_info;
3735

3736
  mtr_verbose("mysqld pid: $pid");
unknown's avatar
unknown committed
3737
  return $pid;
unknown's avatar
unknown committed
3738 3739
}

unknown's avatar
unknown committed
3740

unknown's avatar
unknown committed
3741
sub stop_all_servers () {
unknown's avatar
unknown committed
3742

unknown's avatar
unknown committed
3743
  print  "Stopping All Servers\n";
3744

unknown's avatar
unknown committed
3745
  if ( ! $opt_skip_im )
3746
  {
unknown's avatar
unknown committed
3747 3748 3749 3750 3751
    print  "Shutting-down Instance Manager\n";
    unless (mtr_im_stop($instance_manager, "stop_all_servers"))
    {
      mtr_error("Failed to stop Instance Manager.")
    }
3752
  }
unknown's avatar
unknown committed
3753

unknown's avatar
unknown committed
3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786
  my %admin_pids; # hash of admin processes that requests shutdown
  my @kill_pids;  # list of processes to shutdown/kill
  my $pid;

  # Start shutdown of all started masters
  foreach my $mysqld (@{$master}, @{$slave})
  {
    if ( $mysqld->{'pid'} )
    {
      $pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);
      $admin_pids{$pid}= 1;

      push(@kill_pids,{
		       pid      => $mysqld->{'pid'},
		       pidfile  => $mysqld->{'path_pid'},
		       sockfile => $mysqld->{'path_sock'},
		       port     => $mysqld->{'port'},
		      });

      $mysqld->{'pid'}= 0; # Assume we are done with it
    }
  }

  # Start shutdown of clusters
  foreach my $cluster (@{$clusters})
  {
    if ( $cluster->{'pid'} )
    {
      $pid= mtr_ndbmgm_start($cluster, "shutdown");
      $admin_pids{$pid}= 1;

      push(@kill_pids,{
		       pid      => $cluster->{'pid'},
3787
		       pidfile  => $cluster->{'path_pid'}
unknown's avatar
unknown committed
3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815
		      });

      $cluster->{'pid'}= 0; # Assume we are done with it

      foreach my $ndbd (@{$cluster->{'ndbds'}})
      {
        if ( $ndbd->{'pid'} )
	{
	  push(@kill_pids,{
			   pid      => $ndbd->{'pid'},
			   pidfile  => $ndbd->{'path_pid'},
			  });
	  $ndbd->{'pid'}= 0;
	}
      }
    }
  }

  # Wait blocking until all shutdown processes has completed
  mtr_wait_blocking(\%admin_pids);

  # Make sure that process has shutdown else try to kill them
  mtr_check_stop_servers(\@kill_pids);

  foreach my $mysqld (@{$master}, @{$slave})
  {
    rm_ndbcluster_tables($mysqld->{'path_myddir'});
  }
unknown's avatar
unknown committed
3816 3817
}

unknown's avatar
unknown committed
3818

3819 3820 3821
sub run_testcase_need_master_restart($)
{
  my ($tinfo)= @_;
unknown's avatar
unknown committed
3822

3823
  # We try to find out if we are to restart the master(s)
unknown's avatar
unknown committed
3824
  my $do_restart= 0;          # Assumes we don't have to
unknown's avatar
unknown committed
3825

unknown's avatar
unknown committed
3826 3827 3828 3829 3830 3831
  if ( $glob_use_embedded_server )
  {
    mtr_verbose("Never start or restart for embedded server");
    return $do_restart;
  }
  elsif ( $tinfo->{'master_sh'} )
unknown's avatar
unknown committed
3832 3833
  {
    $do_restart= 1;           # Always restart if script to run
3834 3835 3836 3837 3838 3839
    mtr_verbose("Restart master: Always restart if script to run");
  }
  if ( $tinfo->{'force_restart'} )
  {
    $do_restart= 1; # Always restart if --force-restart in -opt file
    mtr_verbose("Restart master: Restart forced with --force-restart");
unknown's avatar
unknown committed
3840
  }
unknown's avatar
unknown committed
3841
  elsif ( ! $opt_skip_ndbcluster and
3842
	  !$tinfo->{'ndb_test'} and
unknown's avatar
unknown committed
3843 3844 3845
	  $clusters->[0]->{'pid'} != 0 )
  {
    $do_restart= 1;           # Restart without cluster
3846
    mtr_verbose("Restart master: Test does not need cluster");
unknown's avatar
unknown committed
3847
  }
unknown's avatar
unknown committed
3848
  elsif ( ! $opt_skip_ndbcluster and
3849
	  $tinfo->{'ndb_test'} and
unknown's avatar
unknown committed
3850 3851 3852
	  $clusters->[0]->{'pid'} == 0 )
  {
    $do_restart= 1;           # Restart with cluster
3853
    mtr_verbose("Restart master: Test need cluster");
unknown's avatar
unknown committed
3854
  }
unknown's avatar
unknown committed
3855
  elsif( $tinfo->{'component_id'} eq 'im' )
3856 3857
  {
    $do_restart= 1;
3858
    mtr_verbose("Restart master: Always restart for im tests");
3859
  }
3860 3861 3862
  elsif ( $master->[0]->{'running_master_options'} and
	  $master->[0]->{'running_master_options'}->{'timezone'} ne
	  $tinfo->{'timezone'})
unknown's avatar
unknown committed
3863
  {
unknown's avatar
unknown committed
3864
    $do_restart= 1;
3865
    mtr_verbose("Restart master: Different timezone");
unknown's avatar
unknown committed
3866
  }
3867 3868
  # Check that running master was started with same options
  # as the current test requires
3869
  elsif (! mtr_same_opts($master->[0]->{'start_opts'},
3870 3871 3872
                         $tinfo->{'master_opt'}) )
  {
    $do_restart= 1;
3873
    mtr_verbose("Restart master: running with different options '" .
3874 3875
	       join(" ", @{$tinfo->{'master_opt'}}) . "' != '" .
		join(" ", @{$master->[0]->{'start_opts'}}) . "'" );
3876
  }
3877 3878 3879
  elsif( ! $master->[0]->{'pid'} )
  {
    $do_restart= 1;
3880
    mtr_verbose("Restart master: master is not started");
3881
  }
unknown's avatar
unknown committed
3882

3883 3884 3885 3886 3887 3888 3889 3890 3891 3892
  return $do_restart;
}

sub run_testcase_need_slave_restart($)
{
  my ($tinfo)= @_;

  # We try to find out if we are to restart the slaves
  my $do_slave_restart= 0;     # Assumes we don't have to

unknown's avatar
unknown committed
3893
  if ( $glob_use_embedded_server )
unknown's avatar
unknown committed
3894
  {
unknown's avatar
unknown committed
3895 3896
    mtr_verbose("Never start or restart for embedded server");
    return $do_slave_restart;
unknown's avatar
unknown committed
3897
  }
unknown's avatar
unknown committed
3898
  elsif ( $max_slave_num == 0)
unknown's avatar
unknown committed
3899
  {
3900
    mtr_verbose("Skip slave restart: No testcase use slaves");
unknown's avatar
unknown committed
3901
  }
3902 3903
  else
  {
unknown's avatar
unknown committed
3904

3905 3906 3907 3908 3909 3910 3911 3912 3913 3914
    # Check if any slave is currently started
    my $any_slave_started= 0;
    foreach my $mysqld (@{$slave})
    {
      if ( $mysqld->{'pid'} )
      {
	$any_slave_started= 1;
	last;
      }
    }
unknown's avatar
unknown committed
3915

3916 3917
    if ($any_slave_started)
    {
3918
      mtr_verbose("Restart slave: Slave is started, always restart");
3919 3920 3921 3922
      $do_slave_restart= 1;
    }
    elsif ( $tinfo->{'slave_num'} )
    {
3923
      mtr_verbose("Restart slave: Test need slave");
3924 3925
      $do_slave_restart= 1;
    }
unknown's avatar
unknown committed
3926
  }
3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944

  return $do_slave_restart;

}

# ----------------------------------------------------------------------
# If not using a running servers we may need to stop and restart.
# We restart in the case we have initiation scripts, server options
# etc to run. But we also restart again after the test first restart
# and test is run, to get back to normal server settings.
#
# To make the code a bit more clean, we actually only stop servers
# here, and mark this to be done. Then a generic "start" part will
# start up the needed servers again.
# ----------------------------------------------------------------------

sub run_testcase_stop_servers($$$) {
  my ($tinfo, $do_restart, $do_slave_restart)= @_;
unknown's avatar
unknown committed
3945 3946 3947 3948
  my $pid;
  my %admin_pids; # hash of admin processes that requests shutdown
  my @kill_pids;  # list of processes to shutdown/kill

3949
  # Remember if we restarted for this test case (count restarts)
unknown's avatar
unknown committed
3950
  $tinfo->{'restarted'}= $do_restart;
unknown's avatar
unknown committed
3951

unknown's avatar
unknown committed
3952
  if ( $do_restart )
unknown's avatar
unknown committed
3953
  {
3954
    delete $master->[0]->{'running_master_options'}; # Forget history
unknown's avatar
unknown committed
3955 3956 3957

    # Start shutdown of all started masters
    foreach my $mysqld (@{$master})
unknown's avatar
unknown committed
3958
    {
unknown's avatar
unknown committed
3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978
      if ( $mysqld->{'pid'} )
      {
	$pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);

	$admin_pids{$pid}= 1;

	push(@kill_pids,{
			 pid      => $mysqld->{'pid'},
			 pidfile  => $mysqld->{'path_pid'},
			 sockfile => $mysqld->{'path_sock'},
			 port     => $mysqld->{'port'},
			});

	$mysqld->{'pid'}= 0; # Assume we are done with it
      }
    }

    # Start shutdown of master cluster
    my $cluster= $clusters->[0];
    if ( $cluster->{'pid'} )
unknown's avatar
unknown committed
3979
    {
unknown's avatar
unknown committed
3980 3981 3982 3983 3984
      $pid= mtr_ndbmgm_start($cluster, "shutdown");
      $admin_pids{$pid}= 1;

      push(@kill_pids,{
		       pid      => $cluster->{'pid'},
3985
		       pidfile  => $cluster->{'path_pid'}
unknown's avatar
unknown committed
3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997
		      });

      $cluster->{'pid'}= 0; # Assume we are done with it

      foreach my $ndbd (@{$cluster->{'ndbds'}})
      {
	push(@kill_pids,{
			 pid      => $ndbd->{'pid'},
			 pidfile  => $ndbd->{'path_pid'},
			});
	$ndbd->{'pid'}= 0; # Assume we are done with it
      }
unknown's avatar
unknown committed
3998 3999 4000
    }
  }

4001
  if ( $do_restart || $do_slave_restart )
4002
  {
4003
    delete $slave->[0]->{'running_slave_options'}; # Forget history
4004 4005 4006

    # Start shutdown of all started slaves
    foreach my $mysqld (@{$slave})
unknown's avatar
unknown committed
4007
    {
4008 4009 4010
      if ( $mysqld->{'pid'} )
      {
	$pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);
unknown's avatar
unknown committed
4011

4012
	$admin_pids{$pid}= 1;
unknown's avatar
unknown committed
4013

4014 4015 4016 4017 4018 4019
	push(@kill_pids,{
			 pid      => $mysqld->{'pid'},
			 pidfile  => $mysqld->{'path_pid'},
			 sockfile => $mysqld->{'path_sock'},
			 port     => $mysqld->{'port'},
			});
unknown's avatar
unknown committed
4020 4021


4022 4023
	$mysqld->{'pid'}= 0; # Assume we are done with it
      }
unknown's avatar
unknown committed
4024
    }
unknown's avatar
unknown committed
4025

4026 4027 4028 4029 4030
    # Start shutdown of slave cluster
    my $cluster= $clusters->[1];
    if ( $cluster->{'pid'} )
    {
      $pid= mtr_ndbmgm_start($cluster, "shutdown");
unknown's avatar
unknown committed
4031

4032
      $admin_pids{$pid}= 1;
unknown's avatar
unknown committed
4033 4034

      push(@kill_pids,{
4035 4036
		       pid      => $cluster->{'pid'},
		       pidfile  => $cluster->{'path_pid'}
unknown's avatar
unknown committed
4037
		      });
4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048

      $cluster->{'pid'}= 0; # Assume we are done with it

      foreach my $ndbd (@{$cluster->{'ndbds'}} )
      {
	push(@kill_pids,{
			 pid      => $ndbd->{'pid'},
			 pidfile  => $ndbd->{'path_pid'},
			});
	$ndbd->{'pid'}= 0; # Assume we are done with it
      }
unknown's avatar
unknown committed
4049
    }
4050 4051
  }

unknown's avatar
unknown committed
4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067
  # ----------------------------------------------------------------------
  # Shutdown has now been started and lists for the shutdown processes
  # and the processes to be killed has been created
  # ----------------------------------------------------------------------

  # Wait blocking until all shutdown processes has completed
  mtr_wait_blocking(\%admin_pids);


  # Make sure that process has shutdown else try to kill them
  mtr_check_stop_servers(\@kill_pids);

  foreach my $mysqld (@{$master}, @{$slave})
  {
    if ( ! $mysqld->{'pid'} )
    {
4068
      # Remove ndbcluster tables if server is stopped
unknown's avatar
unknown committed
4069 4070 4071
      rm_ndbcluster_tables($mysqld->{'path_myddir'});
    }
  }
unknown's avatar
unknown committed
4072 4073
}

4074

4075 4076 4077
#
# run_testcase_start_servers
#
4078
# Start the servers needed by this test case
4079 4080 4081 4082 4083 4084
#
# RETURN
#  0 OK
#  1 Start failed
#

unknown's avatar
unknown committed
4085 4086 4087
sub run_testcase_start_servers($) {
  my $tinfo= shift;
  my $tname= $tinfo->{'name'};
unknown's avatar
unknown committed
4088

unknown's avatar
unknown committed
4089
  if ( $tinfo->{'component_id'} eq 'mysqld' )
unknown's avatar
unknown committed
4090
  {
unknown's avatar
unknown committed
4091
    if ( ! $opt_skip_ndbcluster and
unknown's avatar
unknown committed
4092 4093 4094 4095 4096 4097
	 !$clusters->[0]->{'pid'} and
	 $tinfo->{'ndb_test'} )
    {
      # Test need cluster, cluster is not started, start it
      ndbcluster_start($clusters->[0], "");
    }
unknown's avatar
unknown committed
4098

unknown's avatar
unknown committed
4099 4100 4101
    if ( !$master->[0]->{'pid'} )
    {
      # Master mysqld is not started
4102
      do_before_start_master($tinfo);
unknown's avatar
unknown committed
4103 4104

      mysqld_start($master->[0],$tinfo->{'master_opt'},[]);
unknown's avatar
unknown committed
4105

unknown's avatar
unknown committed
4106 4107 4108 4109 4110
    }

    if ( $clusters->[0]->{'pid'} and ! $master->[1]->{'pid'} )
    {
      # Test needs cluster, start an extra mysqld connected to cluster
4111

4112
      if ( $mysql_version_id >= 50100 )
unknown's avatar
unknown committed
4113
      {
4114 4115 4116 4117 4118 4119 4120 4121
	# First wait for first mysql server to have created ndb system
	# tables ok FIXME This is a workaround so that only one mysqld
	# create the tables
	if ( ! sleep_until_file_created(
		  "$master->[0]->{'path_myddir'}/cluster/apply_status.ndb",
					$master->[0]->{'start_timeout'},
					$master->[0]->{'pid'}))
	{
unknown's avatar
unknown committed
4122

4123 4124
	  $tinfo->{'comment'}= "Failed to create 'cluster/apply_status' table";
	  return 1;
4125
	}
unknown's avatar
unknown committed
4126 4127 4128 4129 4130
      }
      mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");

      mysqld_start($master->[1],$tinfo->{'master_opt'},[]);
    }
unknown's avatar
unknown committed
4131

4132 4133
    # Save this test case information, so next can examine it
    $master->[0]->{'running_master_options'}= $tinfo;
unknown's avatar
unknown committed
4134
  }
unknown's avatar
unknown committed
4135 4136 4137 4138 4139 4140 4141 4142 4143
  elsif ( ! $opt_skip_im and $tinfo->{'component_id'} eq 'im' )
  {
    # We have to create defaults file every time, in order to ensure that it
    # will be the same for each test. The problem is that test can change the
    # file (by SET/UNSET commands), so w/o recreating the file, execution of
    # one test can affect the other.

    im_create_defaults_file($instance_manager);

4144
    if  ( ! mtr_im_start($instance_manager, $tinfo->{im_opts}) )
unknown's avatar
unknown committed
4145
    {
4146 4147
      $tinfo->{'comment'}= "Failed to start Instance Manager. ";
      return 1;
unknown's avatar
unknown committed
4148
    }
unknown's avatar
unknown committed
4149
  }
unknown's avatar
unknown committed
4150

unknown's avatar
unknown committed
4151 4152 4153 4154
  # ----------------------------------------------------------------------
  # Start slaves - if needed
  # ----------------------------------------------------------------------
  if ( $tinfo->{'slave_num'} )
unknown's avatar
unknown committed
4155
  {
unknown's avatar
unknown committed
4156 4157
    mtr_tofile($slave->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");

4158 4159
    restore_slave_databases($tinfo->{'slave_num'});

4160
    do_before_start_slave($tinfo);
unknown's avatar
unknown committed
4161

unknown's avatar
unknown committed
4162
    if ( ! $opt_skip_ndbcluster_slave and
unknown's avatar
unknown committed
4163 4164
	 !$clusters->[1]->{'pid'} and
	 $tinfo->{'ndb_test'} )
unknown's avatar
unknown committed
4165
    {
unknown's avatar
unknown committed
4166 4167 4168 4169 4170
      # Test need slave cluster, cluster is not started, start it
      ndbcluster_start($clusters->[1], "");
    }

    for ( my $idx= 0; $idx <  $tinfo->{'slave_num'}; $idx++ )
unknown's avatar
unknown committed
4171
    {
unknown's avatar
unknown committed
4172 4173 4174 4175
      if ( ! $slave->[$idx]->{'pid'} )
      {
	mysqld_start($slave->[$idx],$tinfo->{'slave_opt'},
		     $tinfo->{'slave_mi'});
4176

unknown's avatar
unknown committed
4177
      }
unknown's avatar
unknown committed
4178
    }
4179

4180 4181
    # Save this test case information, so next can examine it
    $slave->[0]->{'running_slave_options'}= $tinfo;
unknown's avatar
unknown committed
4182 4183
  }

4184 4185
  # Wait for clusters to start
  foreach my $cluster (@{$clusters})
unknown's avatar
unknown committed
4186
  {
4187 4188 4189

    next if !$cluster->{'pid'};

4190
    if (ndbcluster_wait_started($cluster, ""))
4191 4192
    {
      # failed to start
4193 4194
      $tinfo->{'comment'}= "Start of $cluster->{'name'} cluster failed";
      return 1;
4195
    }
unknown's avatar
unknown committed
4196 4197
  }

4198 4199
  # Wait for mysqld's to start
  foreach my $mysqld (@{$master},@{$slave})
4200
  {
4201 4202 4203 4204 4205

    next if !$mysqld->{'pid'};

    if (mysqld_wait_started($mysqld))
    {
4206 4207 4208 4209
      # failed to start
      $tinfo->{'comment'}=
	"Failed to start $mysqld->{'type'} mysqld $mysqld->{'idx'}";
      return 1;
4210
    }
unknown's avatar
unknown committed
4211
  }
4212
  return 0;
unknown's avatar
unknown committed
4213 4214
}

4215 4216 4217 4218 4219
#
# Run include/check-testcase.test
# Before a testcase, run in record mode, save result file to var
# After testcase, run and compare with the recorded file, they should be equal!
#
4220 4221 4222 4223
# RETURN VALUE
#  0 OK
#  1 Check failed
#
4224
sub run_check_testcase ($$) {
4225 4226

  my $mode=     shift;
4227 4228 4229
  my $mysqld=   shift;

  my $name= "check-" . $mysqld->{'type'} . $mysqld->{'idx'};
4230 4231 4232 4233 4234 4235 4236 4237

  my $args;
  mtr_init_args(\$args);

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--silent");
  mtr_add_arg($args, "--skip-safemalloc");
  mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
4238
  mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
4239

4240 4241
  mtr_add_arg($args, "--socket=%s", $mysqld->{'path_sock'});
  mtr_add_arg($args, "--port=%d", $mysqld->{'port'});
4242 4243 4244 4245 4246
  mtr_add_arg($args, "--database=test");
  mtr_add_arg($args, "--user=%s", $opt_user);
  mtr_add_arg($args, "--password=");

  mtr_add_arg($args, "-R");
4247
  mtr_add_arg($args, "$opt_vardir/tmp/$name.result");
4248 4249 4250 4251 4252 4253 4254 4255 4256

  if ( $mode eq "before" )
  {
    mtr_add_arg($args, "--record");
  }

  my $res = mtr_run_test($exe_mysqltest,$args,
	        "include/check-testcase.test", "", "", "");

4257
  if ( $res == 1  and $mode eq "after")
4258 4259
  {
    mtr_run("diff",["-u",
4260 4261
		    "$opt_vardir/tmp/$name.result",
		    "$opt_vardir/tmp/$name.reject"],
4262 4263 4264 4265 4266 4267
	    "", "", "", "");
  }
  elsif ( $res )
  {
    mtr_error("Could not execute 'check-testcase' $mode testcase");
  }
4268
  return $res;
4269 4270
}

4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307
##############################################################################
#
#  Report the features that were compiled in
#
##############################################################################

sub run_report_features () {
  my $args;

  if ( ! $glob_use_embedded_server )
  {
    mysqld_start($master->[0],[],[]);
    if ( ! $master->[0]->{'pid'} )
    {
      mtr_error("Can't start the mysqld server");
    }
    mysqld_wait_started($master->[0]);
  }

  my $tinfo = {};
  $tinfo->{'name'} = 'report features';
  $tinfo->{'result_file'} = undef;
  $tinfo->{'component_id'} = 'mysqld';
  $tinfo->{'path'} = 'include/report-features.test';
  $tinfo->{'timezone'}=  "GMT-3";
  $tinfo->{'slave_num'} = 0;
  $tinfo->{'master_opt'} = [];
  $tinfo->{'slave_opt'} = [];
  $tinfo->{'slave_mi'} = [];
  $tinfo->{'comment'} = 'report server features';
  run_mysqltest($tinfo);

  if ( ! $glob_use_embedded_server )
  {
    stop_all_servers();
  }
}
unknown's avatar
unknown committed
4308

4309

unknown's avatar
unknown committed
4310
sub run_mysqltest ($) {
4311
  my ($tinfo)= @_;
unknown's avatar
unknown committed
4312 4313
  my $exe= $exe_mysqltest;
  my $args;
unknown's avatar
unknown committed
4314 4315 4316 4317 4318 4319 4320

  mtr_init_args(\$args);

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--silent");
  mtr_add_arg($args, "--skip-safemalloc");
  mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
4321
  mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
4322 4323 4324 4325 4326 4327 4328 4329 4330 4331

  if ($tinfo->{'component_id'} eq 'im')
  {
    mtr_add_arg($args, "--socket=%s", $instance_manager->{'path_sock'});
    mtr_add_arg($args, "--port=%d", $instance_manager->{'port'});
    mtr_add_arg($args, "--user=%s", $instance_manager->{'admin_login'});
    mtr_add_arg($args, "--password=%s", $instance_manager->{'admin_password'});
  }
  else # component_id == mysqld
  {
unknown's avatar
unknown committed
4332 4333
    mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
    mtr_add_arg($args, "--port=%d", $master->[0]->{'port'});
4334 4335 4336 4337
    mtr_add_arg($args, "--database=test");
    mtr_add_arg($args, "--user=%s", $opt_user);
    mtr_add_arg($args, "--password=");
  }
unknown's avatar
unknown committed
4338

unknown's avatar
unknown committed
4339 4340 4341 4342 4343
  if ( $opt_ps_protocol )
  {
    mtr_add_arg($args, "--ps-protocol");
  }

4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358
  if ( $opt_sp_protocol )
  {
    mtr_add_arg($args, "--sp-protocol");
  }

  if ( $opt_view_protocol )
  {
    mtr_add_arg($args, "--view-protocol");
  }

  if ( $opt_cursor_protocol )
  {
    mtr_add_arg($args, "--cursor-protocol");
  }

unknown's avatar
unknown committed
4359 4360 4361 4362
  if ( $opt_strace_client )
  {
    $exe=  "strace";            # FIXME there are ktrace, ....
    mtr_add_arg($args, "-o");
4363
    mtr_add_arg($args, "%s/log/mysqltest.strace", $opt_vardir);
unknown's avatar
unknown committed
4364 4365 4366
    mtr_add_arg($args, "$exe_mysqltest");
  }

unknown's avatar
unknown committed
4367 4368
  if ( $opt_timer )
  {
4369
    mtr_add_arg($args, "--timer-file=%s/log/timer", $opt_vardir);
unknown's avatar
unknown committed
4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388
  }

  if ( $opt_big_test )
  {
    mtr_add_arg($args, "--big-test");
  }

  if ( $opt_compress )
  {
    mtr_add_arg($args, "--compress");
  }

  if ( $opt_sleep )
  {
    mtr_add_arg($args, "--sleep=%d", $opt_sleep);
  }

  if ( $opt_debug )
  {
4389
    mtr_add_arg($args, "--debug=d:t:A,%s/log/mysqltest.trace",
unknown's avatar
unknown committed
4390
		$path_vardir_trace);
unknown's avatar
unknown committed
4391 4392
  }

4393
  if ( $opt_ssl_supported )
unknown's avatar
unknown committed
4394
  {
4395
    mtr_add_arg($args, "--ssl-ca=%s/std_data/cacert.pem",
4396
	        $glob_mysql_test_dir);
4397
    mtr_add_arg($args, "--ssl-cert=%s/std_data/client-cert.pem",
4398
	        $glob_mysql_test_dir);
4399
    mtr_add_arg($args, "--ssl-key=%s/std_data/client-key.pem",
4400 4401 4402 4403 4404
	        $glob_mysql_test_dir);
  }

  if ( $opt_ssl )
  {
4405
    # Turn on SSL for _all_ test cases if option --ssl was used
4406
    mtr_add_arg($args, "--ssl");
4407 4408 4409
  }
  elsif ( $opt_ssl_supported )
  {
4410
    mtr_add_arg($args, "--skip-ssl");
unknown's avatar
unknown committed
4411 4412
  }

unknown's avatar
unknown committed
4413 4414 4415 4416
  # ----------------------------------------------------------------------
  # If embedded server, we create server args to give mysqltest to pass on
  # ----------------------------------------------------------------------

unknown's avatar
unknown committed
4417 4418
  if ( $glob_use_embedded_server )
  {
unknown's avatar
unknown committed
4419
    mysqld_arguments($args,'master',0,$tinfo->{'master_opt'},[]);
unknown's avatar
unknown committed
4420 4421
  }

4422 4423 4424 4425 4426
  # ----------------------------------------------------------------------
  # export MYSQL_TEST variable containing <path>/mysqltest <args>
  # ----------------------------------------------------------------------
  $ENV{'MYSQL_TEST'}= "$exe_mysqltest " . join(" ", @$args);

4427
  # ----------------------------------------------------------------------
4428
  # Add arguments that should not go into the MYSQL_TEST env var
4429 4430
  # ----------------------------------------------------------------------

4431
  if ( $opt_valgrind_mysqltest )
4432 4433 4434 4435 4436 4437 4438 4439 4440 4441
  {
    # Prefix the Valgrind options to the argument list.
    # We do this here, since we do not want to Valgrind the nested invocations
    # of mysqltest; that would mess up the stderr output causing test failure.
    my @args_saved = @$args;
    mtr_init_args(\$args);
    valgrind_arguments($args, \$exe);
    mtr_add_arg($args, "%s", $_) for @args_saved;
  }

unknown's avatar
unknown committed
4442 4443 4444
  mtr_add_arg($args, "--test-file");
  mtr_add_arg($args, $tinfo->{'path'});

4445 4446 4447 4448
  if ( defined $tinfo->{'result_file'} ) {
    mtr_add_arg($args, "--result-file");
    mtr_add_arg($args, $tinfo->{'result_file'});
  }
4449 4450 4451 4452 4453 4454

  if ( $opt_record )
  {
    mtr_add_arg($args, "--record");
  }

unknown's avatar
unknown committed
4455 4456 4457 4458 4459 4460 4461 4462
  if ( $opt_client_gdb )
  {
    gdb_arguments(\$args, \$exe, "client");
  }
  elsif ( $opt_client_ddd )
  {
    ddd_arguments(\$args, \$exe, "client");
  }
4463 4464 4465 4466
  elsif ( $opt_client_debugger )
  {
    debugger_arguments(\$args, \$exe, "client");
  }
unknown's avatar
unknown committed
4467

4468 4469
  if ( $opt_check_testcases )
  {
4470 4471 4472 4473 4474 4475 4476
    foreach my $mysqld (@{$master}, @{$slave})
    {
      if ($mysqld->{'pid'})
      {
	run_check_testcase("before", $mysqld);
      }
    }
4477 4478
  }

4479
  my $res = mtr_run_test($exe,$args,"","",$path_timefile,"");
4480 4481 4482

  if ( $opt_check_testcases )
  {
4483 4484 4485 4486
    foreach my $mysqld (@{$master}, @{$slave})
    {
      if ($mysqld->{'pid'})
      {
4487 4488 4489 4490 4491
	if (run_check_testcase("after", $mysqld))
	{
	  # Check failed, mark the test case with that info
	  $tinfo->{'check_testcase_failed'}= 1;
	}
4492 4493
      }
    }
4494
  }
4495

4496
  return $res;
unknown's avatar
unknown committed
4497
}
unknown's avatar
unknown committed
4498

unknown's avatar
unknown committed
4499

unknown's avatar
unknown committed
4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511
#
# Modify the exe and args so that program is run in gdb in xterm
#
sub gdb_arguments {
  my $args= shift;
  my $exe=  shift;
  my $type= shift;

  # Write $args to gdb init file
  my $str= join(" ", @$$args);
  my $gdb_init_file= "$opt_tmpdir/gdbinit.$type";

4512 4513 4514
  # Remove the old gdbinit file
  unlink($gdb_init_file);

unknown's avatar
unknown committed
4515 4516 4517 4518
  if ( $type eq "client" )
  {
    # write init file for client
    mtr_tofile($gdb_init_file,
4519 4520
	       "set args $str\n" .
	       "break main\n");
unknown's avatar
unknown committed
4521 4522 4523 4524 4525 4526 4527 4528 4529 4530
  }
  else
  {
    # write init file for mysqld
    mtr_tofile($gdb_init_file,
	       "set args $str\n" .
	       "break mysql_parse\n" .
	       "commands 1\n" .
	       "disable 1\n" .
	       "end\n" .
4531 4532 4533 4534 4535
	       "run");
  }

  if ( $opt_manual_gdb )
  {
4536
     print "\nTo start gdb for $type, type in another window:\n";
4537 4538 4539 4540 4541 4542
     print "cd $glob_mysql_test_dir;\n";
     print "gdb -x $gdb_init_file $$exe\n";

     # Indicate the exe should not be started
     $$exe= undef;
     return;
unknown's avatar
unknown committed
4543 4544 4545 4546 4547 4548
  }

  $$args= [];
  mtr_add_arg($$args, "-title");
  mtr_add_arg($$args, "$type");
  mtr_add_arg($$args, "-e");
4549

4550
  if ( $exe_libtool )
unknown's avatar
unknown committed
4551
  {
4552
    mtr_add_arg($$args, $exe_libtool);
unknown's avatar
unknown committed
4553 4554 4555 4556 4557 4558 4559 4560 4561
    mtr_add_arg($$args, "--mode=execute");
  }

  mtr_add_arg($$args, "gdb");
  mtr_add_arg($$args, "-x");
  mtr_add_arg($$args, "$gdb_init_file");
  mtr_add_arg($$args, "$$exe");

  $$exe= "xterm";
unknown's avatar
unknown committed
4562
}
unknown's avatar
unknown committed
4563

unknown's avatar
unknown committed
4564

unknown's avatar
unknown committed
4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575
#
# Modify the exe and args so that program is run in ddd
#
sub ddd_arguments {
  my $args= shift;
  my $exe=  shift;
  my $type= shift;

  # Write $args to ddd init file
  my $str= join(" ", @$$args);
  my $gdb_init_file= "$opt_tmpdir/gdbinit.$type";
unknown's avatar
unknown committed
4576

4577 4578 4579
  # Remove the old gdbinit file
  unlink($gdb_init_file);

unknown's avatar
unknown committed
4580 4581 4582 4583 4584
  if ( $type eq "client" )
  {
    # write init file for client
    mtr_tofile($gdb_init_file,
	       "set args $str\n" .
4585
	       "break main\n");
unknown's avatar
unknown committed
4586 4587 4588 4589 4590 4591 4592 4593 4594 4595
  }
  else
  {
    # write init file for mysqld
    mtr_tofile($gdb_init_file,
	       "file $$exe\n" .
	       "set args $str\n" .
	       "break mysql_parse\n" .
	       "commands 1\n" .
	       "disable 1\n" .
4596
	       "end");
4597 4598 4599 4600
  }

  if ( $opt_manual_ddd )
  {
4601
     print "\nTo start ddd for $type, type in another window:\n";
4602 4603 4604 4605 4606 4607
     print "cd $glob_mysql_test_dir;\n";
     print "ddd -x $gdb_init_file $$exe\n";

     # Indicate the exe should not be started
     $$exe= undef;
     return;
unknown's avatar
unknown committed
4608
  }
unknown's avatar
unknown committed
4609

unknown's avatar
unknown committed
4610 4611
  my $save_exe= $$exe;
  $$args= [];
4612
  if ( $exe_libtool )
unknown's avatar
unknown committed
4613
  {
4614
    $$exe= $exe_libtool;
unknown's avatar
unknown committed
4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625
    mtr_add_arg($$args, "--mode=execute");
    mtr_add_arg($$args, "ddd");
  }
  else
  {
    $$exe= "ddd";
  }
  mtr_add_arg($$args, "--command=$gdb_init_file");
  mtr_add_arg($$args, "$save_exe");
}

4626 4627 4628 4629 4630 4631 4632 4633 4634

#
# Modify the exe and args so that program is run in the selected debugger
#
sub debugger_arguments {
  my $args= shift;
  my $exe=  shift;
  my $debugger= $opt_debugger || $opt_client_debugger;

4635 4636
  # FIXME Need to change the below "eq"'s to
  # "case unsensitive string contains"
4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663
  if ( $debugger eq "vcexpress" or $debugger eq "vc")
  {
    # vc[express] /debugexe exe arg1 .. argn

    # Add /debugexe and name of the exe before args
    unshift(@$$args, "/debugexe");
    unshift(@$$args, "$$exe");

  }
  elsif ( $debugger eq "windbg" )
  {
    # windbg exe arg1 .. argn

    # Add name of the exe before args
    unshift(@$$args, "$$exe");

  }
  else
  {
    mtr_error("Unknown argument \"$debugger\" passed to --debugger");
  }

  # Set exe to debuggername
  $$exe= $debugger;
}


unknown's avatar
unknown committed
4664 4665 4666
#
# Modify the exe and args so that program is run in valgrind
#
unknown's avatar
unknown committed
4667 4668 4669 4670
sub valgrind_arguments {
  my $args= shift;
  my $exe=  shift;

4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684
  if ( $opt_callgrind)
  {
    mtr_add_arg($args, "--tool=callgrind");
    mtr_add_arg($args, "--base=$opt_vardir/log");
  }
  else
  {
    mtr_add_arg($args, "--tool=memcheck"); # From >= 2.1.2 needs this option
    mtr_add_arg($args, "--alignment=8");
    mtr_add_arg($args, "--leak-check=yes");
    mtr_add_arg($args, "--num-callers=16");
    mtr_add_arg($args, "--suppressions=%s/valgrind.supp", $glob_mysql_test_dir)
      if -f "$glob_mysql_test_dir/valgrind.supp";
  }
unknown's avatar
unknown committed
4685

4686 4687
  # Add valgrind options, can be overriden by user
  mtr_add_arg($args, '%s', $_) for (split(' ', $opt_valgrind_options));
4688

unknown's avatar
unknown committed
4689 4690
  mtr_add_arg($args, $$exe);

unknown's avatar
unknown committed
4691
  $$exe= $opt_valgrind_path || "valgrind";
4692 4693 4694 4695 4696 4697 4698 4699

  if ($exe_libtool)
  {
    # Add "libtool --mode-execute" before the test to execute
    # if running in valgrind(to avoid valgrinding bash)
    unshift(@$args, "--mode=execute", $$exe);
    $$exe= $exe_libtool;
  }
unknown's avatar
unknown committed
4700 4701 4702
}


unknown's avatar
unknown committed
4703 4704 4705 4706 4707 4708
##############################################################################
#
#  Usage
#
##############################################################################

unknown's avatar
unknown committed
4709
sub usage ($) {
4710 4711 4712 4713 4714 4715 4716
  my $message= shift;

  if ( $message )
  {
    print STDERR "$message \n";
  }

unknown's avatar
unknown committed
4717 4718
  print STDERR <<HERE;

unknown's avatar
unknown committed
4719
$0 [ OPTIONS ] [ TESTCASE ]
unknown's avatar
unknown committed
4720 4721 4722 4723 4724

Options to control what engine/variation to run

  embedded-server       Use the embedded server, i.e. no mysqld daemons
  ps-protocol           Use the binary protocol between client and server
4725 4726 4727 4728
  cursor-protocol       Use the cursor protocol between client and server
                        (implies --ps-protocol)
  view-protocol         Create a view to execute all non updating queries
  sp-protocol           Create a stored procedure to execute all queries
4729 4730
  compress              Use the compressed protocol between client and server
  ssl                   Use ssl protocol between client and server
4731
  skip-ssl              Dont start server with support for ssl connections
4732 4733
  bench                 Run the benchmark suite
  small-bench           Run the benchmarks with --small-tests --small-tables
4734
  with-ndbcluster       Use cluster as default table type for benchmark
4735 4736
  vs-config             Visual Studio configuration used to create executables
                        (default: MTR_VS_CONFIG environment variable)
unknown's avatar
unknown committed
4737

4738
Options to control directories to use
4739 4740
  benchdir=DIR          The directory where the benchmark suite is stored
                        (default: ../../mysql-bench)
4741 4742
  tmpdir=DIR            The directory where temporary files are stored
                        (default: ./var/tmp).
4743 4744 4745
  vardir=DIR            The directory where files generated from the test run
                        is stored (default: ./var). Specifying a ramdisk or
                        tmpfs will speed up tests.
4746 4747 4748
  mem                   Run testsuite in "memory" using tmpfs or ramdisk
                        Attempts to find a suitable location
                        using a builtin list of standard locations
4749 4750 4751
                        for tmpfs (/dev/shm)
                        The option can also be set using environment
                        variable MTR_MEM=[DIR]
4752

unknown's avatar
unknown committed
4753 4754 4755
Options to control what test suites or cases to run

  force                 Continue to run the suite after failure
4756
  with-ndbcluster-only  Run only tests that include "ndb" in the filename
unknown's avatar
unknown committed
4757 4758 4759
  skip-ndb[cluster]     Skip all tests that need cluster
  skip-ndb[cluster]-slave Skip all tests that need a slave cluster
  ndb-extra             Run extra tests from ndb directory
unknown's avatar
unknown committed
4760 4761 4762 4763
  do-test=PREFIX        Run test cases which name are prefixed with PREFIX
  start-from=PREFIX     Run test cases starting from test prefixed with PREFIX
  suite=NAME            Run the test suite named NAME. The default is "main"
  skip-rpl              Skip the replication test cases.
unknown's avatar
unknown committed
4764
  skip-im               Don't start IM, and skip the IM test cases
unknown's avatar
unknown committed
4765
  skip-test=PREFIX      Skip test cases which name are prefixed with PREFIX
4766 4767 4768
  big-test              Pass "--big-test" to mysqltest which will set the
                        environment variable BIG_TEST, which can be checked
                        from test cases.
unknown's avatar
unknown committed
4769 4770 4771 4772 4773

Options that specify ports

  master_port=PORT      Specify the port number used by the first master
  slave_port=PORT       Specify the port number used by the first slave
4774 4775
  ndbcluster-port=PORT  Specify the port number used by cluster
  ndbcluster-port-slave=PORT  Specify the port number used by slave cluster
unknown's avatar
unknown committed
4776 4777 4778 4779

Options for test case authoring

  record TESTNAME       (Re)genereate the result file for TESTNAME
4780
  check-testcases       Check testcases for sideeffects
unknown's avatar
unknown committed
4781 4782 4783 4784 4785 4786 4787 4788

Options that pass on options

  mysqld=ARGS           Specify additional arguments to "mysqld"

Options to run test on running server

  extern                Use running server for tests FIXME DANGEROUS
unknown's avatar
unknown committed
4789 4790
  ndb-connectstring=STR Use running cluster, and connect using STR
  ndb-connectstring-slave=STR Use running slave cluster, and connect using STR
4791
  user=USER             User for connect to server
unknown's avatar
unknown committed
4792 4793 4794

Options for debugging the product

4795 4796
  client-ddd            Start mysqltest client in ddd
  client-debugger=NAME  Start mysqltest in the selected debugger
unknown's avatar
unknown committed
4797 4798
  client-gdb            Start mysqltest client in gdb
  ddd                   Start mysqld in ddd
4799
  debug                 Dump trace output for all servers and client programs
4800
  debugger=NAME         Start mysqld in the selected debugger
4801 4802 4803 4804 4805
  gdb                   Start the mysqld(s) in gdb
  manual-debug          Let user manually start mysqld in debugger, before
                        running test(s)
  manual-gdb            Let user manually start mysqld in gdb, before running
                        test(s)
unknown's avatar
unknown committed
4806 4807
  master-binary=PATH    Specify the master "mysqld" to use
  slave-binary=PATH     Specify the slave "mysqld" to use
4808
  strace-client         Create strace output for mysqltest client
unknown's avatar
unknown committed
4809 4810 4811 4812 4813

Options for coverage, profiling etc

  gcov                  FIXME
  gprof                 FIXME
4814
  valgrind              Run the "mysqltest" and "mysqld" executables using
4815 4816
                        valgrind with options($default_valgrind_options)
  valgrind-all          Synonym for --valgrind
4817 4818
  valgrind-mysqltest    Run the "mysqltest" and "mysql_client_test" executable
                        with valgrind
unknown's avatar
unknown committed
4819
  valgrind-mysqld       Run the "mysqld" executable with valgrind
4820
  valgrind-options=ARGS Options to give valgrind, replaces default options
unknown's avatar
unknown committed
4821
  valgrind-path=[EXE]   Path to the valgrind executable
4822
  callgrind             Instruct valgrind to use callgrind
unknown's avatar
unknown committed
4823 4824 4825

Misc options

4826
  comment=STR           Write STR to the output
4827
  notimer               Don't show test case execution time
unknown's avatar
unknown committed
4828
  script-debug          Debug this script itself
4829
  verbose               More verbose output
4830 4831 4832 4833 4834 4835
  start-and-exit        Only initialize and start the servers, using the
                        startup settings for the specified test case (if any)
  start-dirty           Only start the servers (without initialization) for
                        the specified test case (if any)
  fast                  Don't try to clean up from earlier runs
  reorder               Reorder tests to get fewer server restarts
unknown's avatar
unknown committed
4836
  help                  Get this help text
unknown's avatar
unknown committed
4837
  unified-diff | udiff  When presenting differences, use unified diff
unknown's avatar
unknown committed
4838

4839 4840
  testcase-timeout=MINUTES Max test case run time (default $default_testcase_timeout)
  suite-timeout=MINUTES    Max test suite run time (default $default_suite_timeout)
4841

unknown's avatar
unknown committed
4842

4843 4844 4845
Deprecated options
  with-openssl          Deprecated option for ssl

4846

unknown's avatar
unknown committed
4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857
Options not yet described, or that I want to look into more
  local                 
  netware               
  sleep=SECONDS         
  socket=PATH           
  user-test=s           
  wait-timeout=SECONDS  
  warnings              
  log-warnings          

HERE
unknown's avatar
unknown committed
4858
  mtr_exit(1);
4859

unknown's avatar
unknown committed
4860
}
4861