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

#
5 6 7 8 9
##############################################################################
#
#  mysql-test-run.pl
#
#  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;
61
use File::Temp qw / tempdir /;
unknown's avatar
unknown committed
62 63 64 65 66 67
use Cwd;
use Getopt::Long;
use Sys::Hostname;
use IO::Socket;
use IO::Socket::INET;
use strict;
68
use warnings;
unknown's avatar
unknown committed
69

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

unknown's avatar
unknown committed
73 74 75 76
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
77

unknown's avatar
unknown committed
78
require "lib/mtr_cases.pl";
79
require "lib/mtr_im.pl";
unknown's avatar
unknown committed
80
require "lib/mtr_process.pl";
81
require "lib/mtr_timer.pl";
unknown's avatar
unknown committed
82 83 84 85
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
86
require "lib/mtr_diff.pl";
unknown's avatar
unknown committed
87 88
require "lib/mtr_match.pl";
require "lib/mtr_misc.pl";
89
require "lib/mtr_stress.pl";
90
require "lib/mtr_unique.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
our $glob_use_running_ndbcluster= 0;
unknown's avatar
unknown committed
108
our $glob_use_running_ndbcluster_slave= 0;
unknown's avatar
unknown committed
109
our $glob_use_embedded_server=    0;
unknown's avatar
unknown committed
110
our @glob_test_mode;
unknown's avatar
unknown committed
111 112 113 114 115 116 117

our $glob_basedir;

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

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

127 128 129 130 131 132
# 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'};

133 134
our $default_vardir;

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

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

our $exe_master_mysqld;
our $exe_mysql;
our $exe_mysqladmin;
144
our $exe_mysql_upgrade;
unknown's avatar
unknown committed
145
our $exe_mysqlbinlog;
unknown's avatar
unknown committed
146
our $exe_mysql_client_test;
unknown's avatar
unknown committed
147
our $exe_mysqld;
unknown's avatar
unknown committed
148 149 150 151 152
our $exe_mysqlcheck;
our $exe_mysqldump;
our $exe_mysqlslap;
our $exe_mysqlimport;
our $exe_mysqlshow;
unknown's avatar
unknown committed
153
our $exe_mysql_fix_system_tables;
154
our $file_mysql_fix_privilege_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

our $opt_bench= 0;
our $opt_small_bench= 0;
167
our $opt_big_test= 0;
unknown's avatar
unknown committed
168

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
our $opt_embedded_server;
184 185 186 187

our $opt_extern= 0;
our $opt_socket;

unknown's avatar
unknown committed
188 189
our $opt_fast;
our $opt_force;
unknown's avatar
unknown committed
190 191
our $opt_reorder= 0;
our $opt_enable_disabled;
192
our $opt_mem= $ENV{'MTR_MEM'};
unknown's avatar
unknown committed
193 194 195 196 197

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

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

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

unknown's avatar
unknown committed
215
our $master;
unknown's avatar
unknown committed
216
our $slave;
unknown's avatar
unknown committed
217
our $clusters;
unknown's avatar
unknown committed
218

219 220
our $instance_manager;

221 222 223 224 225
our $opt_master_myport;
our $opt_slave_myport;
our $im_port;
our $im_mysqld1_port;
our $im_mysqld2_port;
unknown's avatar
unknown committed
226 227
our $opt_ndbcluster_port;
our $opt_ndbconnectstring;
unknown's avatar
unknown committed
228 229
our $opt_ndbcluster_port_slave;
our $opt_ndbconnectstring_slave;
unknown's avatar
unknown committed
230 231

our $opt_record;
232
my $opt_report_features;
233
our $opt_check_testcases;
234
our $opt_mark_progress;
unknown's avatar
unknown committed
235 236 237

our $opt_skip;
our $opt_skip_rpl;
238
our $max_slave_num= 0;
unknown's avatar
unknown committed
239
our $max_master_num= 1;
unknown's avatar
unknown committed
240
our $use_innodb;
unknown's avatar
unknown committed
241
our $opt_skip_test;
unknown's avatar
unknown committed
242
our $opt_skip_im;
unknown's avatar
unknown committed
243 244

our $opt_sleep;
unknown's avatar
unknown committed
245

unknown's avatar
unknown committed
246 247
our $opt_testcase_timeout;
our $opt_suite_timeout;
unknown's avatar
unknown committed
248
my  $default_testcase_timeout=     15; # 15 min max
249
my  $default_suite_timeout=       180; # 3 hours max
unknown's avatar
unknown committed
250 251

our $opt_start_and_exit;
252
our $opt_start_dirty;
unknown's avatar
unknown committed
253 254 255 256
our $opt_start_from;

our $opt_strace_client;

unknown's avatar
unknown committed
257
our $opt_timer= 1;
unknown's avatar
unknown committed
258

unknown's avatar
unknown committed
259
our $opt_user;
unknown's avatar
unknown committed
260

unknown's avatar
unknown committed
261 262 263
our $opt_valgrind= 0;
our $opt_valgrind_mysqld= 0;
our $opt_valgrind_mysqltest= 0;
unknown's avatar
unknown committed
264
our $default_valgrind_options= "--show-reachable=yes";
unknown's avatar
unknown committed
265
our $opt_valgrind_options;
unknown's avatar
unknown committed
266
our $opt_valgrind_path;
unknown's avatar
unknown committed
267
our $opt_callgrind;
unknown's avatar
unknown committed
268

269 270 271 272
our $opt_stress=               "";
our $opt_stress_suite=     "main";
our $opt_stress_mode=    "random";
our $opt_stress_threads=        5;
273 274 275
our $opt_stress_test_count=     0;
our $opt_stress_loop_count=     0;
our $opt_stress_test_duration=  0;
276 277 278
our $opt_stress_init_file=     "";
our $opt_stress_test_file=     "";

unknown's avatar
unknown committed
279 280 281 282 283
our $opt_wait_for_master;
our $opt_wait_for_slave;

our $opt_warnings;

unknown's avatar
unknown committed
284 285
our $opt_udiff;

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

295
our $exe_ndb_mgm;
unknown's avatar
unknown committed
296
our $exe_ndb_waiter;
297
our $path_ndb_tools_dir;
unknown's avatar
unknown committed
298 299 300
our $path_ndb_examples_dir;
our $exe_ndb_example;
our $path_ndb_testrun_log;
unknown's avatar
unknown committed
301

302 303
our $path_sql_dir;

304 305
our @data_dir_lst;

unknown's avatar
unknown committed
306
our $used_binlog_format;
307
our $used_default_engine;
unknown's avatar
unknown committed
308 309 310
our $debug_compiled_binaries;
our $glob_tot_real_time= 0;

311 312
our %mysqld_variables;

313 314
my $source_dist= 0;

315 316
our $opt_max_save_core= 5;
my $num_saved_cores= 0;  # Number of core files saved in vardir/log/ so far.
unknown's avatar
unknown committed
317 318 319 320 321 322 323 324 325 326

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

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

362

unknown's avatar
unknown committed
363 364 365 366 367 368 369 370 371 372 373
######################################################################
#
#  Main program
#
######################################################################

main();

sub main () {

  command_line_setup();
374

375 376 377 378
  check_ndbcluster_support(\%mysqld_variables);
  check_ssl_support(\%mysqld_variables);
  check_debug_support(\%mysqld_variables);

unknown's avatar
unknown committed
379
  executable_setup();
380

unknown's avatar
unknown committed
381
  environment_setup();
unknown's avatar
unknown committed
382 383 384 385 386 387 388 389 390 391 392 393
  signal_setup();

  if ( $opt_gcov )
  {
    gcov_prepare();
  }

  if ( $opt_gprof )
  {
    gprof_prepare();
  }

394
  if ( $opt_bench )
unknown's avatar
unknown committed
395
  {
396
    initialize_servers();
unknown's avatar
unknown committed
397 398
    run_benchmarks(shift);      # Shift what? Extra arguments?!
  }
399 400
  elsif ( $opt_stress )
  {
401
    initialize_servers();
402 403
    run_stress_test()
  }
unknown's avatar
unknown committed
404 405
  else
  {
406 407 408 409
    # 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
410
    my ($need_ndbcluster,$need_im);
411 412
    foreach my $test (@$tests)
    {
413 414
      next if $test->{skip};

415 416
      $need_ndbcluster||= $test->{ndb_test};
      $need_im||= $test->{component_id} eq 'im';
417 418 419 420 421 422 423

      # 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;
      }
424 425 426 427 428 429 430 431 432

      # Count max number of masters used by a test case
      if ( $test->{master_num} > $max_master_num)
      {
	$max_master_num= $test->{master_num};
	mtr_error("Too many masters") if $max_master_num > 2;
	mtr_error("Too few masters") if $max_master_num < 1;
      }

unknown's avatar
unknown committed
433
      $use_innodb||= $test->{'innodb_test'};
434
    }
unknown's avatar
unknown committed
435

436 437 438 439 440 441
    # Check if cluster can be skipped
    if ( !$need_ndbcluster )
    {
      $opt_skip_ndbcluster= 1;
      $opt_skip_ndbcluster_slave= 1;
    }
unknown's avatar
unknown committed
442

443 444 445 446 447
    # Check if slave cluster can be skipped
    if ($max_slave_num == 0)
    {
      $opt_skip_ndbcluster_slave= 1;
    }
unknown's avatar
unknown committed
448

449 450 451 452
    # Check if im can be skipped
    if ( ! $need_im )
    {
     $opt_skip_im= 1;
453
    }
unknown's avatar
unknown committed
454

unknown's avatar
unknown committed
455
    initialize_servers();
unknown's avatar
unknown committed
456

457 458 459 460
    if ( $opt_report_features ) {
      run_report_features();
    }

unknown's avatar
unknown committed
461
    run_suite($opt_suite, $tests);
unknown's avatar
unknown committed
462
  }
463

unknown's avatar
unknown committed
464
  mtr_exit(0);
unknown's avatar
unknown committed
465 466 467 468 469 470 471 472 473 474 475 476
}

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

sub command_line_setup () {

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

unknown's avatar
unknown committed
477
  $opt_suite=        "main";    # Special default suite
unknown's avatar
unknown committed
478 479
  my $opt_comment;

480 481
  $opt_master_myport=          9306;
  $opt_slave_myport=           9308;
unknown's avatar
unknown committed
482 483
  $opt_ndbcluster_port=        9310;
  $opt_ndbcluster_port_slave=  9311;
484 485 486
  $im_port=                    9312;
  $im_mysqld1_port=            9313;
  $im_mysqld2_port=            9314;
487 488 489 490 491 492 493 494 495
  
  # If so requested, we try to avail ourselves of a unique build thread number.
  if ( $ENV{'MTR_BUILD_THREAD'} ) {
    if ( lc($ENV{'MTR_BUILD_THREAD'}) eq 'auto' ) {
      print "Requesting build thread... ";
      $ENV{'MTR_BUILD_THREAD'} = mtr_require_unique_id_and_wait("/tmp/mysql-test-ports", 200, 299);
      print "got ".$ENV{'MTR_BUILD_THREAD'}."\n";
    }
  }
unknown's avatar
unknown committed
496

unknown's avatar
unknown committed
497 498
  if ( $ENV{'MTR_BUILD_THREAD'} )
  {
499
    set_mtr_build_thread_ports($ENV{'MTR_BUILD_THREAD'});
unknown's avatar
unknown committed
500 501
  }

502 503 504 505 506
  # 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
507
  # Read the command line
unknown's avatar
unknown committed
508
  # Note: Keep list, and the order, in sync with usage at end of this file
unknown's avatar
unknown committed
509

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

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

             # Specify ports
             'master_port=i'            => \$opt_master_myport,
             'slave_port=i'             => \$opt_slave_myport,
unknown's avatar
unknown committed
546 547
             'ndbcluster-port|ndbcluster_port=i' => \$opt_ndbcluster_port,
             'ndbcluster-port-slave=i'  => \$opt_ndbcluster_port_slave,
548 549 550
             '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
551
	     'mtr-build-thread=i'       => \$opt_mtr_build_thread,
unknown's avatar
unknown committed
552 553 554

             # Test case authoring
             'record'                   => \$opt_record,
555
             'check-testcases'          => \$opt_check_testcases,
556
             'mark-progress'            => \$opt_mark_progress,
unknown's avatar
unknown committed
557

unknown's avatar
unknown committed
558
             # Extra options used when starting mysqld
unknown's avatar
unknown committed
559
             'mysqld=s'                 => \@opt_extra_mysqld_opt,
unknown's avatar
unknown committed
560 561 562

             # Run test on running server
             'extern'                   => \$opt_extern,
unknown's avatar
unknown committed
563 564
             'ndb-connectstring=s'       => \$opt_ndbconnectstring,
             'ndb-connectstring-slave=s' => \$opt_ndbconnectstring_slave,
unknown's avatar
unknown committed
565 566

             # Debugging
unknown's avatar
unknown committed
567
             'gdb'                      => \$opt_gdb,
unknown's avatar
unknown committed
568
             'client-gdb'               => \$opt_client_gdb,
unknown's avatar
unknown committed
569 570
             'manual-gdb'               => \$opt_manual_gdb,
             'manual-debug'             => \$opt_manual_debug,
unknown's avatar
unknown committed
571
             'ddd'                      => \$opt_ddd,
unknown's avatar
unknown committed
572
             'client-ddd'               => \$opt_client_ddd,
unknown's avatar
unknown committed
573
             'manual-ddd'               => \$opt_manual_ddd,
574 575
	     'debugger=s'               => \$opt_debugger,
	     'client-debugger=s'        => \$opt_client_debugger,
unknown's avatar
unknown committed
576 577 578
             'strace-client'            => \$opt_strace_client,
             'master-binary=s'          => \$exe_master_mysqld,
             'slave-binary=s'           => \$exe_slave_mysqld,
579
             'max-save-core=i'          => \$opt_max_save_core,
unknown's avatar
unknown committed
580 581 582

             # Coverage, profiling etc
             'gcov'                     => \$opt_gcov,
unknown's avatar
unknown committed
583
             'gprof'                    => \$opt_gprof,
584
             'valgrind|valgrind-all'    => \$opt_valgrind,
unknown's avatar
unknown committed
585 586
             'valgrind-mysqltest'       => \$opt_valgrind_mysqltest,
             'valgrind-mysqld'          => \$opt_valgrind_mysqld,
unknown's avatar
unknown committed
587
             'valgrind-options=s'       => \$opt_valgrind_options,
unknown's avatar
unknown committed
588
             'valgrind-path=s'          => \$opt_valgrind_path,
unknown's avatar
unknown committed
589
	     'callgrind'                => \$opt_callgrind,
unknown's avatar
unknown committed
590

591 592 593 594 595 596 597 598 599 600 601
             # 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,

602 603 604
	     # Directories
             'tmpdir=s'                 => \$opt_tmpdir,
             'vardir=s'                 => \$opt_vardir,
unknown's avatar
unknown committed
605
             'benchdir=s'               => \$glob_mysql_bench_dir,
606
             'mem'                      => \$opt_mem,
607

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

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

unknown's avatar
unknown committed
631
  usage("") if $opt_usage;
unknown's avatar
unknown committed
632

633 634
  $glob_scriptname=  basename($0);

635 636 637 638 639 640 641 642 643
  if ($opt_mtr_build_thread != 0)
  {
    set_mtr_build_thread_ports($opt_mtr_build_thread)
  }
  elsif ($ENV{'MTR_BUILD_THREAD'})
  {
    $opt_mtr_build_thread= $ENV{'MTR_BUILD_THREAD'};
  }

644 645 646 647 648 649 650 651 652 653 654
  # 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" )
  {
655
    $source_dist=  1;
656 657 658 659
  }

  $glob_hostname=  mtr_short_hostname();

660
  # Find the absolute path to the test directory
661 662
  $glob_mysql_test_dir=  cwd();
  if ( $glob_cygwin_perl )
unknown's avatar
unknown committed
663
  {
664 665 666
    # 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
667
  }
668 669 670 671 672 673 674 675 676 677 678

  # In most cases, the base directory we find everything relative to,
  # is the parent directory of the "mysql-test" directory. For source
  # distributions, TAR binary distributions and some other packages.
  $glob_basedir= dirname($glob_mysql_test_dir);

  # In the RPM case, binaries and libraries are installed in the
  # default system locations, instead of having our own private base
  # directory. And we install "/usr/share/mysql-test". Moving up one
  # more directory relative to "mysql-test" gives us a usable base
  # directory for RPM installs.
unknown's avatar
unknown committed
679
  if ( ! $source_dist and ! -d "$glob_basedir/bin" )
unknown's avatar
unknown committed
680
  {
681
    $glob_basedir= dirname($glob_basedir);
unknown's avatar
unknown committed
682
  }
683 684 685 686

  # 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;
unknown's avatar
unknown committed
687 688
  $glob_mysql_bench_dir= undef
    unless -d $glob_mysql_bench_dir;
689 690

  $path_my_basedir=
691
    $source_dist ? $glob_mysql_test_dir : $glob_basedir;
692 693 694 695 696 697 698 699

  $glob_timers= mtr_init_timers();

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

700
  # Look for the client binaries directory
701
  $path_client_bindir= mtr_path_exists("$glob_basedir/client_release",
702
				       "$glob_basedir/client_debug",
703
				       vs_config_dirs('client', ''),
704 705
				       "$glob_basedir/client",
				       "$glob_basedir/bin");
706

unknown's avatar
unknown committed
707 708 709
  if (!$opt_extern)
  {
    $exe_mysqld=       mtr_exe_exists (vs_config_dirs('sql', 'mysqld'),
710 711 712 713 714 715 716 717
				       "$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",
unknown's avatar
unknown committed
718 719
				       "$glob_basedir/bin/mysqld",
				       "$glob_basedir/sbin/mysqld");
720

unknown's avatar
unknown committed
721 722 723 724 725 726 727 728
    # Use the mysqld found above to find out what features are available
    collect_mysqld_features();
  }
  else
  {
    $mysqld_variables{'port'}= 3306;
    $mysqld_variables{'master-port'}= 3306;
  }
unknown's avatar
unknown committed
729

730 731 732 733 734 735 736 737
  if ( $opt_comment )
  {
    print "\n";
    print '#' x 78, "\n";
    print "# $opt_comment\n";
    print '#' x 78, "\n\n";
  }

unknown's avatar
unknown committed
738 739 740 741 742 743
  foreach my $arg ( @ARGV )
  {
    if ( $arg =~ /^--skip-/ )
    {
      push(@opt_extra_mysqld_opt, $arg);
    }
744 745 746 747 748 749
    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
750 751 752 753 754 755 756 757 758
    elsif ( $arg =~ /^-/ )
    {
      usage("Invalid option \"$arg\"");
    }
    else
    {
      push(@opt_cases, $arg);
    }
  }
unknown's avatar
unknown committed
759

760
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
761 762 763 764
  # 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";
unknown's avatar
unknown committed
765
  if (!$opt_extern && $mysql_version_id >= 50100 )
766
  {
767 768 769
    $used_binlog_format= "mixed"; # Default value for binlog format

    foreach my $arg ( @opt_extra_mysqld_opt )
770
    {
771 772 773 774
      if ( $arg =~ /binlog-format=(\S+)/ )
      {
	$used_binlog_format= $1;
      }
775
    }
776
    mtr_report("Using binlog format '$used_binlog_format'");
unknown's avatar
unknown committed
777 778
  }

779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798

  # --------------------------------------------------------------------------
  # Find out default storage engine being used(if any)
  # --------------------------------------------------------------------------
  if ( $opt_with_ndbcluster )
  {
    # --ndb or --with-ndbcluster turns on --default-storage-engine=ndbcluster
    push(@opt_extra_mysqld_opt, "--default-storage-engine=ndbcluster");
  }

  foreach my $arg ( @opt_extra_mysqld_opt )
  {
    if ( $arg =~ /default-storage-engine=(\S+)/ )
    {
      $used_default_engine= $1;
    }
  }
  mtr_report("Using default engine '$used_default_engine'")
    if defined $used_default_engine;

799 800
  # --------------------------------------------------------------------------
  # Check if we should speed up tests by trying to run on tmpfs
801
  # --------------------------------------------------------------------------
802
  if ( defined $opt_mem )
803 804 805 806 807 808
  {
    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;

809 810 811 812 813
    # 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");

814 815 816 817 818 819
    foreach my $fs (@tmpfs_locations)
    {
      if ( -d $fs )
      {
	mtr_report("Using tmpfs in $fs");
	$opt_mem= "$fs/var";
820
	$opt_mem .= $opt_mtr_build_thread if $opt_mtr_build_thread;
821 822 823 824
	last;
      }
    }
  }
825

826 827 828
  # --------------------------------------------------------------------------
  # Set the "var/" directory, as it is the base for everything else
  # --------------------------------------------------------------------------
829
  $default_vardir= "$glob_mysql_test_dir/var";
830 831
  if ( ! $opt_vardir )
  {
832
    $opt_vardir= $default_vardir;
833
  }
834
  elsif ( $mysql_version_id < 50000 and
835
	  $opt_vardir ne $default_vardir)
unknown's avatar
unknown committed
836
  {
837 838 839
    # Version 4.1 and --vardir was specified
    # Only supported as a symlink from var/
    # by setting up $opt_mem that symlink will be created
840 841 842 843 844 845 846
    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");
    }

847
    $opt_vardir= $default_vardir;
848
  }
unknown's avatar
unknown committed
849 850

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

unknown's avatar
unknown committed
854 855 856
  # 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) )
857 858 859 860
  {
    # Make absolute path, relative test dir
    $opt_vardir= "$glob_mysql_test_dir/$opt_vardir";
  }
unknown's avatar
unknown committed
861

862
  # --------------------------------------------------------------------------
863
  # Set tmpdir
864 865
  # --------------------------------------------------------------------------
  $opt_tmpdir=       "$opt_vardir/tmp" unless $opt_tmpdir;
unknown's avatar
unknown committed
866
  $opt_tmpdir =~ s,/+$,,;       # Remove ending slash if any
unknown's avatar
unknown committed
867 868

  # --------------------------------------------------------------------------
869
  # Check im suport
unknown's avatar
unknown committed
870
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
871
  if ($opt_extern)
unknown's avatar
unknown committed
872
  {
unknown's avatar
unknown committed
873 874
    mtr_report("Disable instance manager when running with extern mysqld");
    $opt_skip_im= 1;
unknown's avatar
unknown committed
875
  }
unknown's avatar
unknown committed
876 877 878 879 880 881 882 883 884
  elsif ( $mysql_version_id < 50000 )
  {
    # Instance manager is not supported until 5.0
    $opt_skip_im= 1;
  }
  elsif ( $glob_win32 )
  {
    mtr_report("Disable Instance manager - testing not supported on Windows");
    $opt_skip_im= 1;
unknown's avatar
unknown committed
885
  }
unknown's avatar
unknown committed
886

unknown's avatar
unknown committed
887
  # --------------------------------------------------------------------------
888
  # Record flag
unknown's avatar
unknown committed
889
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
890
  if ( $opt_record and ! @opt_cases )
unknown's avatar
unknown committed
891 892 893 894
  {
    mtr_error("Will not run in record mode without a specific test case");
  }

895 896 897
  # --------------------------------------------------------------------------
  # Embedded server flag
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
898 899 900
  if ( $opt_embedded_server )
  {
    $glob_use_embedded_server= 1;
unknown's avatar
unknown committed
901
    push(@glob_test_mode, "embedded");
unknown's avatar
unknown committed
902
    $opt_skip_rpl= 1;              # We never run replication with embedded
unknown's avatar
unknown committed
903 904
    $opt_skip_ndbcluster= 1;       # Turn off use of NDB cluster
    $opt_skip_ssl= 1;              # Turn off use of SSL
unknown's avatar
unknown committed
905

906 907 908
    # Turn off use of bin log
    push(@opt_extra_mysqld_opt, "--skip-log-bin");

unknown's avatar
unknown committed
909 910
    if ( $opt_extern )
    {
unknown's avatar
unknown committed
911
      mtr_error("Can't use --extern with --embedded-server");
unknown's avatar
unknown committed
912 913 914
    }
  }

915 916 917 918

  # --------------------------------------------------------------------------
  # ps protcol flag
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
919 920 921 922 923
  if ( $opt_ps_protocol )
  {
    push(@glob_test_mode, "ps-protocol");
  }

924 925 926
  # --------------------------------------------------------------------------
  # Ndb cluster flags
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956

  if ( $opt_ndbconnectstring )
  {
    $glob_use_running_ndbcluster= 1;
    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;
  }
  else
  {
    # Set default connect string
    $opt_ndbconnectstring= "host=localhost:$opt_ndbcluster_port";
  }

  if ( $opt_ndbconnectstring_slave )
  {
      $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;
  }
  else
  {
    # Set default connect string
    $opt_ndbconnectstring_slave= "host=localhost:$opt_ndbcluster_port_slave";
  }
unknown's avatar
unknown committed
957

958 959 960
  # --------------------------------------------------------------------------
  # Bench flags
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
961 962 963 964 965
  if ( $opt_small_bench )
  {
    $opt_bench=  1;
  }

966 967 968
  # --------------------------------------------------------------------------
  # Big test flags
  # --------------------------------------------------------------------------
969 970 971 972
   if ( $opt_big_test )
   {
     $ENV{'BIG_TEST'}= 1;
   }
973

974 975 976
  # --------------------------------------------------------------------------
  # Gcov flag
  # --------------------------------------------------------------------------
977
  if ( $opt_gcov and ! $source_dist )
unknown's avatar
unknown committed
978
  {
unknown's avatar
unknown committed
979 980 981
    mtr_error("Coverage test needs the source - please use source dist");
  }

982
  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
983
  # Check debug related options
984
  # --------------------------------------------------------------------------
985
  if ( $opt_gdb || $opt_client_gdb || $opt_ddd || $opt_client_ddd ||
986 987
       $opt_manual_gdb || $opt_manual_ddd || $opt_manual_debug ||
       $opt_debugger || $opt_client_debugger )
unknown's avatar
unknown committed
988
  {
989
    # Indicate that we are using debugger
unknown's avatar
unknown committed
990
    $glob_debugger= 1;
unknown's avatar
unknown committed
991 992
    if ( $opt_extern )
    {
unknown's avatar
unknown committed
993
      mtr_error("Can't use --extern when using debugger");
unknown's avatar
unknown committed
994 995 996
    }
  }

997 998 999 1000 1001
  # --------------------------------------------------------------------------
  # 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;
1002

1003
  # --------------------------------------------------------------------------
1004
  # Check valgrind arguments
1005
  # --------------------------------------------------------------------------
1006
  if ( $opt_valgrind or $opt_valgrind_path or defined $opt_valgrind_options)
unknown's avatar
unknown committed
1007
  {
unknown's avatar
unknown committed
1008 1009 1010 1011 1012
    mtr_report("Turning on valgrind for all executables");
    $opt_valgrind= 1;
    $opt_valgrind_mysqld= 1;
    $opt_valgrind_mysqltest= 1;
  }
1013
  elsif ( $opt_valgrind_mysqld )
unknown's avatar
unknown committed
1014
  {
1015
    mtr_report("Turning on valgrind for mysqld(s) only");
unknown's avatar
unknown committed
1016
    $opt_valgrind= 1;
1017 1018 1019
  }
  elsif ( $opt_valgrind_mysqltest )
  {
1020
    mtr_report("Turning on valgrind for mysqltest and mysql_client_test only");
unknown's avatar
unknown committed
1021
    $opt_valgrind= 1;
1022
  }
unknown's avatar
unknown committed
1023

unknown's avatar
unknown committed
1024
  if ( $opt_callgrind )
unknown's avatar
unknown committed
1025
  {
unknown's avatar
unknown committed
1026
    mtr_report("Turning on valgrind with callgrind for mysqld(s)");
1027
    $opt_valgrind= 1;
unknown's avatar
unknown committed
1028
    $opt_valgrind_mysqld= 1;
unknown's avatar
unknown committed
1029

unknown's avatar
unknown committed
1030 1031 1032
    # Set special valgrind options unless options passed on command line
    $opt_valgrind_options="--trace-children=yes"
      unless defined $opt_valgrind_options;
1033 1034 1035 1036 1037 1038 1039 1040 1041
  }

  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
1042 1043 1044 1045 1046
  }

  if ( ! $opt_testcase_timeout )
  {
    $opt_testcase_timeout= $default_testcase_timeout;
1047
    $opt_testcase_timeout*= 10 if $opt_valgrind;
unknown's avatar
unknown committed
1048 1049 1050 1051 1052
  }

  if ( ! $opt_suite_timeout )
  {
    $opt_suite_timeout= $default_suite_timeout;
1053
    $opt_suite_timeout*= 6 if $opt_valgrind;
unknown's avatar
unknown committed
1054
  }
unknown's avatar
unknown committed
1055

unknown's avatar
unknown committed
1056
  if ( ! $opt_user )
unknown's avatar
unknown committed
1057
  {
1058
    if ( $opt_extern )
unknown's avatar
unknown committed
1059 1060 1061 1062 1063 1064 1065
    {
      $opt_user= "test";
    }
    else
    {
      $opt_user= "root"; # We want to do FLUSH xxx commands
    }
unknown's avatar
unknown committed
1066 1067
  }

1068 1069 1070 1071 1072 1073
  # 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|/+$||;

1074 1075 1076
  # On some operating systems, there is a limit to the length of a
  # UNIX domain socket's path far below PATH_MAX, so try to avoid long
  # socket path names.
1077
  $sockdir = tempdir(CLEANUP => 0) if ( length($sockdir) >= 70 );
1078

unknown's avatar
unknown committed
1079 1080
  $master->[0]=
  {
unknown's avatar
unknown committed
1081 1082 1083
   pid           => 0,
   type          => "master",
   idx           => 0,
unknown's avatar
unknown committed
1084 1085
   path_myddir   => "$opt_vardir/master-data",
   path_myerr    => "$opt_vardir/log/master.err",
unknown's avatar
unknown committed
1086 1087 1088
   path_pid    => "$opt_vardir/run/master.pid",
   path_sock   => "$sockdir/master.sock",
   port   =>  $opt_master_myport,
unknown's avatar
unknown committed
1089
   start_timeout =>  400, # enough time create innodb tables
unknown's avatar
unknown committed
1090 1091
   cluster       =>  0, # index in clusters list
   start_opts    => [],
unknown's avatar
unknown committed
1092 1093 1094 1095
  };

  $master->[1]=
  {
unknown's avatar
unknown committed
1096 1097 1098
   pid           => 0,
   type          => "master",
   idx           => 1,
unknown's avatar
unknown committed
1099 1100
   path_myddir   => "$opt_vardir/master1-data",
   path_myerr    => "$opt_vardir/log/master1.err",
unknown's avatar
unknown committed
1101 1102 1103
   path_pid    => "$opt_vardir/run/master1.pid",
   path_sock   => "$sockdir/master1.sock",
   port   => $opt_master_myport + 1,
unknown's avatar
unknown committed
1104
   start_timeout => 400, # enough time create innodb tables
unknown's avatar
unknown committed
1105 1106
   cluster       =>  0, # index in clusters list
   start_opts    => [],
unknown's avatar
unknown committed
1107 1108 1109 1110
  };

  $slave->[0]=
  {
unknown's avatar
unknown committed
1111 1112 1113
   pid           => 0,
   type          => "slave",
   idx           => 0,
unknown's avatar
unknown committed
1114 1115
   path_myddir   => "$opt_vardir/slave-data",
   path_myerr    => "$opt_vardir/log/slave.err",
unknown's avatar
unknown committed
1116 1117 1118
   path_pid    => "$opt_vardir/run/slave.pid",
   path_sock   => "$sockdir/slave.sock",
   port   => $opt_slave_myport,
unknown's avatar
unknown committed
1119
   start_timeout => 400,
unknown's avatar
unknown committed
1120 1121 1122

   cluster       =>  1, # index in clusters list
   start_opts    => [],
unknown's avatar
unknown committed
1123 1124 1125 1126
  };

  $slave->[1]=
  {
unknown's avatar
unknown committed
1127 1128 1129
   pid           => 0,
   type          => "slave",
   idx           => 1,
unknown's avatar
unknown committed
1130 1131
   path_myddir   => "$opt_vardir/slave1-data",
   path_myerr    => "$opt_vardir/log/slave1.err",
unknown's avatar
unknown committed
1132 1133 1134
   path_pid    => "$opt_vardir/run/slave1.pid",
   path_sock   => "$sockdir/slave1.sock",
   port   => $opt_slave_myport + 1,
unknown's avatar
unknown committed
1135
   start_timeout => 300,
unknown's avatar
unknown committed
1136 1137
   cluster       =>  -1, # index in clusters list
   start_opts    => [],
unknown's avatar
unknown committed
1138 1139 1140 1141
  };

  $slave->[2]=
  {
unknown's avatar
unknown committed
1142 1143 1144
   pid           => 0,
   type          => "slave",
   idx           => 2,
unknown's avatar
unknown committed
1145 1146
   path_myddir   => "$opt_vardir/slave2-data",
   path_myerr    => "$opt_vardir/log/slave2.err",
unknown's avatar
unknown committed
1147 1148 1149
   path_pid    => "$opt_vardir/run/slave2.pid",
   path_sock   => "$sockdir/slave2.sock",
   port   => $opt_slave_myport + 2,
unknown's avatar
unknown committed
1150
   start_timeout => 300,
unknown's avatar
unknown committed
1151 1152
   cluster       =>  -1, # index in clusters list
   start_opts    => [],
unknown's avatar
unknown committed
1153
  };
1154

unknown's avatar
Merge  
unknown committed
1155 1156 1157 1158 1159
  $instance_manager=
  {
   path_err =>        "$opt_vardir/log/im.err",
   path_log =>        "$opt_vardir/log/im.log",
   path_pid =>        "$opt_vardir/run/im.pid",
1160
   path_angel_pid =>  "$opt_vardir/run/im.angel.pid",
1161
   path_sock =>       "$sockdir/im.sock",
unknown's avatar
Merge  
unknown committed
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
   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",
1176
   path_sock    => "$sockdir/mysqld_1.sock",
unknown's avatar
unknown committed
1177
   path_pid     => "$opt_vardir/run/mysqld_1.pid",
unknown's avatar
unknown committed
1178 1179
   start_timeout  => 400, # enough time create innodb tables
   old_log_format => 1
unknown's avatar
Merge  
unknown committed
1180 1181 1182 1183 1184 1185 1186
  };

  $instance_manager->{'instances'}->[1]=
  {
   server_id    => 2,
   port         => $im_mysqld2_port,
   path_datadir => "$opt_vardir/im_mysqld_2.data",
1187
   path_sock    => "$sockdir/mysqld_2.sock",
unknown's avatar
unknown committed
1188
   path_pid     => "$opt_vardir/run/mysqld_2.pid",
unknown's avatar
Merge  
unknown committed
1189
   nonguarded   => 1,
unknown's avatar
unknown committed
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
   start_timeout  => 400, # enough time create innodb tables
   old_log_format => 1
  };

  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
   installed_ok    => 0,
  };

  $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
   installed_ok    => 0,
unknown's avatar
Merge  
unknown committed
1218
  };
1219

unknown's avatar
unknown committed
1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
  # Init pids of ndbd's
  foreach my $cluster ( @{$clusters} )
  {
    for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
    {
      my $nodeid= $idx+1;
      $cluster->{'ndbds'}->[$idx]=
	{
	 pid      => 0,
	 nodeid => $nodeid,
	 path_pid => "$cluster->{'data_dir'}/ndb_${nodeid}.pid",
	 path_fs => "$cluster->{'data_dir'}/ndb_${nodeid}_fs",
	};
    }
  }

1236 1237
  if ( $opt_extern )
  {
1238 1239
    # Turn off features not supported when running with extern server
    $opt_skip_rpl= 1;
1240
    $opt_skip_ndbcluster= 1;
1241 1242

    # Setup master->[0] with the settings for the extern server
unknown's avatar
unknown committed
1243
    $master->[0]->{'path_sock'}=  $opt_socket ? $opt_socket : "/tmp/mysql.sock";
1244
    mtr_report("Using extern server at '$master->[0]->{path_sock}'");
1245 1246 1247 1248 1249
  }
  else
  {
    mtr_error("--socket can only be used in combination with --extern")
      if $opt_socket;
1250 1251 1252
  }

  $path_timefile=  "$opt_vardir/log/mysqltest-time";
1253
  $path_mysqltest_log=  "$opt_vardir/log/mysqltest.log";
1254
  $path_current_test_log= "$opt_vardir/log/current_test";
unknown's avatar
unknown committed
1255
  $path_ndb_testrun_log= "$opt_vardir/log/ndb_testrun.log";
1256 1257

  $path_snapshot= "$opt_tmpdir/snapshot_$opt_master_myport/";
1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270

  if ( $opt_valgrind and $opt_debug )
  {
    # When both --valgrind and --debug is selected, send
    # all output to the trace file, making it possible to
    # see the exact location where valgrind complains
    foreach my $mysqld (@{$master}, @{$slave})
    {
      my $sidx= $mysqld->{idx} ? "$mysqld->{idx}" : "";
      $mysqld->{path_myerr}=
	"$opt_vardir/log/" . $mysqld->{type} . "$sidx.trace";
    }
  }
1271 1272
}

1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
#
# 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.
#
# Also note the limitation 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
1289
sub set_mtr_build_thread_ports($) {
1290 1291
  my $mtr_build_thread= shift;

unknown's avatar
unknown committed
1292 1293 1294 1295 1296 1297
  if ( lc($mtr_build_thread) eq 'auto' ) {
    print "Requesting build thread... ";
    $ENV{'MTR_BUILD_THREAD'} = $mtr_build_thread = mtr_require_unique_id_and_wait("/tmp/mysql-test-ports", 200, 299);
    print "got ".$mtr_build_thread."\n";
  }

1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315
  # Up to two masters, up to three slaves
  $opt_master_myport=         $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;

  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)");
  }
}


1316
sub datadir_list_setup () {
1317 1318

  # Make a list of all data_dirs
1319 1320 1321 1322
  for (my $idx= 0; $idx < $max_master_num; $idx++)
  {
    push(@data_dir_lst, $master->[$idx]->{'path_myddir'});
  }
1323

1324
  for (my $idx= 0; $idx < $max_slave_num; $idx++)
1325
  {
1326
    push(@data_dir_lst, $slave->[$idx]->{'path_myddir'});
1327 1328
  }

1329 1330 1331 1332 1333 1334 1335
  unless ($opt_skip_im)
  {
    foreach my $instance (@{$instance_manager->{'instances'}})
    {
      push(@data_dir_lst, $instance->{'path_datadir'});
    }
  }
unknown's avatar
unknown committed
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
}


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


1346
sub collect_mysqld_features () {
unknown's avatar
unknown committed
1347
  my $found_variable_list_start= 0;
1348

1349 1350
  #
  # Execute "mysqld --no-defaults --help --verbose" to get a
unknown's avatar
unknown committed
1351
  # list of all features and settings
1352 1353
  #
  my $list= `$exe_mysqld --no-defaults --verbose --help`;
unknown's avatar
unknown committed
1354

1355
  foreach my $line (split('\n', $list))
unknown's avatar
unknown committed
1356
  {
unknown's avatar
unknown committed
1357 1358
    # First look for version
    if ( !$mysql_version_id )
unknown's avatar
unknown committed
1359
    {
unknown's avatar
unknown committed
1360
      # Look for version
1361 1362 1363
      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
1364
      {
1365
	#print "Major: $1 Minor: $2 Build: $3\n";
unknown's avatar
unknown committed
1366
	$mysql_version_id= $1*10000 + $2*100 + $3;
1367 1368
	#print "mysql_version_id: $mysql_version_id\n";
	mtr_report("MySQL Version $1.$2.$3");
unknown's avatar
unknown committed
1369
      }
unknown's avatar
unknown committed
1370 1371 1372
    }
    else
    {
unknown's avatar
unknown committed
1373
      if (!$found_variable_list_start)
unknown's avatar
unknown committed
1374
      {
unknown's avatar
unknown committed
1375
	# Look for start of variables list
1376
	if ( $line =~ /[\-]+\s[\-]+/ )
unknown's avatar
unknown committed
1377 1378 1379
	{
	  $found_variable_list_start= 1;
	}
1380 1381 1382
      }
      else
      {
unknown's avatar
unknown committed
1383
	# Put variables into hash
1384
	if ( $line =~ /^([\S]+)[ \t]+(.*?)\r?$/ )
unknown's avatar
unknown committed
1385
	{
1386
	  # print "$1=\"$2\"\n";
unknown's avatar
unknown committed
1387 1388
	  $mysqld_variables{$1}= $2;
	}
1389 1390
	else
	{
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
	  # 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");
	  }
1404
	}
unknown's avatar
unknown committed
1405
      }
unknown's avatar
unknown committed
1406
    }
unknown's avatar
unknown committed
1407
  }
1408

unknown's avatar
unknown committed
1409
  mtr_error("Could not find version of MySQL") unless $mysql_version_id;
1410
  mtr_error("Could not find variabes list") unless $found_variable_list_start;
unknown's avatar
unknown committed
1411 1412 1413 1414

}


unknown's avatar
unknown committed
1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448
sub run_query($$) {
  my ($mysqld, $query)= @_;

  my $args;
  mtr_init_args(\$args);

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--user=%s", $opt_user);
  mtr_add_arg($args, "--port=%d", $mysqld->{'port'});
  mtr_add_arg($args, "--socket=%s", $mysqld->{'path_sock'});
  mtr_add_arg($args, "--silent"); # Tab separated output
  mtr_add_arg($args, "-e '%s'", $query);

  my $cmd= "$exe_mysql " . join(' ', @$args);
  mtr_verbose("cmd: $cmd");
  return `$cmd`;
}


sub collect_mysqld_features_from_running_server ()
{
  my $list= run_query($master->[0], "use mysql; SHOW VARIABLES");

  foreach my $line (split('\n', $list))
  {
    # Put variables into hash
    if ( $line =~ /^([\S]+)[ \t]+(.*?)\r?$/ )
    {
      print "$1=\"$2\"\n";
      $mysqld_variables{$1}= $2;
    }
  }
}

1449 1450 1451 1452 1453 1454
sub executable_setup_im () {

  # Look for instance manager binary - mysqlmanager
  $exe_im=
    mtr_exe_maybe_exists(
      "$glob_basedir/server-tools/instance-manager/mysqlmanager",
1455
      "$glob_basedir/libexec/mysqlmanager",
unknown's avatar
unknown committed
1456 1457
      "$glob_basedir/bin/mysqlmanager",
      "$glob_basedir/sbin/mysqlmanager");
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498

  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
1499
sub executable_setup () {
unknown's avatar
unknown committed
1500

unknown's avatar
unknown committed
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
  #
  # 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)
unknown's avatar
unknown committed
1511
    {
unknown's avatar
unknown committed
1512
      mtr_report("Using \"$exe_libtool\" when running valgrind or debugger");
unknown's avatar
unknown committed
1513 1514 1515
    }
  }

unknown's avatar
unknown committed
1516
  # Look for language files and charsetsdir, use same share
1517
  my $path_share=      mtr_path_exists("$glob_basedir/share/mysql",
unknown's avatar
unknown committed
1518 1519
				       "$glob_basedir/sql/share",
				       "$glob_basedir/share");
unknown's avatar
unknown committed
1520

unknown's avatar
unknown committed
1521 1522
  $path_language=      mtr_path_exists("$path_share/english");
  $path_charsetsdir=   mtr_path_exists("$path_share/charsets");
unknown's avatar
unknown committed
1523

unknown's avatar
unknown committed
1524 1525
  # Look for my_print_defaults
  $exe_my_print_defaults=
1526 1527 1528
    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
1529

unknown's avatar
unknown committed
1530
  # Look for perror
1531 1532 1533
  $exe_perror= mtr_exe_exists(vs_config_dirs('extra', 'perror'),
			                  "$glob_basedir/extra/perror",
			                  "$path_client_bindir/perror");
unknown's avatar
unknown committed
1534

unknown's avatar
unknown committed
1535 1536 1537 1538 1539 1540 1541 1542 1543
  # 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");

unknown's avatar
unknown committed
1544
  if (!$opt_extern)
1545
  {
unknown's avatar
unknown committed
1546

1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557
    # Look for SQL scripts directory
    if ( mtr_file_exists("$path_share/mysql_system_tables.sql") ne "")
    {
      # The SQL scripts are in path_share
      $path_sql_dir= $path_share;
    }
    else
    {
      $path_sql_dir= mtr_path_exists("$glob_basedir/share",
				     "$glob_basedir/scripts");
    }
1558

unknown's avatar
unknown committed
1559 1560 1561 1562 1563 1564 1565 1566
    if ( $mysql_version_id >= 50100 ) {
      $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= "";
    }
unknown's avatar
unknown committed
1567

unknown's avatar
unknown committed
1568 1569 1570 1571 1572 1573
    if ( ! $glob_win32 ) {
      # Look for mysql_fix_system_table script
      $exe_mysql_fix_system_tables=
	mtr_script_exists("$glob_basedir/scripts/mysql_fix_privilege_tables",
			  "$path_client_bindir/mysql_fix_privilege_tables");
    }
unknown's avatar
unknown committed
1574

unknown's avatar
unknown committed
1575 1576 1577 1578
    # Look for mysql_fix_privilege_tables.sql script
    $file_mysql_fix_privilege_tables=
      mtr_file_exists("$glob_basedir/scripts/mysql_fix_privilege_tables.sql",
		      "$glob_basedir/share/mysql_fix_privilege_tables.sql");
1579

unknown's avatar
unknown committed
1580 1581 1582 1583 1584 1585 1586 1587
    if ( ! $opt_skip_ndbcluster and executable_setup_ndb()) {
      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}) {
	$cluster->{"executable_setup_failed"}= 1;
      }
unknown's avatar
unknown committed
1588
    }
1589

unknown's avatar
unknown committed
1590 1591 1592 1593 1594 1595
    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
1596

unknown's avatar
unknown committed
1597 1598 1599 1600
    # Look for the udf_example library
    $lib_udf_example=
      mtr_file_exists(vs_config_dirs('sql', 'udf_example.dll'),
		      "$glob_basedir/sql/.libs/udf_example.so",);
1601

unknown's avatar
unknown committed
1602
  }
1603

unknown's avatar
unknown committed
1604 1605
  # Look for mysqltest executable
  if ( $glob_use_embedded_server )
unknown's avatar
unknown committed
1606
  {
unknown's avatar
unknown committed
1607
    $exe_mysqltest=
1608 1609
      mtr_exe_exists(vs_config_dirs('libmysqld/examples','mysqltest_embedded'),
                     "$glob_basedir/libmysqld/examples/mysqltest_embedded",
1610
                     "$path_client_bindir/mysqltest_embedded");
unknown's avatar
unknown committed
1611
  }
unknown's avatar
unknown committed
1612 1613
  else
  {
1614
    $exe_mysqltest= mtr_exe_exists("$path_client_bindir/mysqltest");
unknown's avatar
unknown committed
1615 1616
  }

1617 1618 1619
  # 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
1620
  {
1621
    $exe_mysql_client_test=
1622
      mtr_exe_maybe_exists(
1623
        vs_config_dirs('libmysqld/examples', 'mysql_client_test_embedded'),
1624
        "$glob_basedir/libmysqld/examples/mysql_client_test_embedded");
unknown's avatar
unknown committed
1625 1626 1627
  }
  else
  {
1628
    $exe_mysql_client_test=
1629 1630
      mtr_exe_maybe_exists(vs_config_dirs('tests', 'mysql_client_test'),
                           "$glob_basedir/tests/mysql_client_test",
1631
                           "$glob_basedir/bin/mysql_client_test");
unknown's avatar
unknown committed
1632 1633 1634 1635 1636 1637 1638
  }
}


sub generate_cmdline_mysqldump ($) {
  my($mysqld) = @_;
  return
1639 1640
    mtr_native_path($exe_mysqldump) .
      " --no-defaults -uroot " .
unknown's avatar
unknown committed
1641 1642
      "--port=$mysqld->{'port'} " .
      "--socket=$mysqld->{'path_sock'} --password=";
unknown's avatar
unknown committed
1643 1644 1645
}


unknown's avatar
unknown committed
1646 1647
##############################################################################
#
unknown's avatar
unknown committed
1648 1649
#  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
1650 1651 1652
#
##############################################################################

1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669
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'}");

unknown's avatar
unknown committed
1670
  if ( $opt_extern || $mysql_version_id >= 50000 )
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693
  {
    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);
}

1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
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
1721 1722 1723 1724
# Note that some env is setup in spawn/run, in "mtr_process.pl"

sub environment_setup () {

unknown's avatar
unknown committed
1725 1726
  umask(022);

1727
  my @ld_library_paths;
1728

unknown's avatar
unknown committed
1729
  # --------------------------------------------------------------------------
1730 1731
  # 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
1732
  # --------------------------------------------------------------------------
1733
  if ( $source_dist )
1734
  {
unknown's avatar
unknown committed
1735
    push(@ld_library_paths, "$glob_basedir/libmysql/.libs/",
1736 1737
                            "$glob_basedir/libmysql_r/.libs/",
                            "$glob_basedir/zlib.libs/");
1738 1739
  }
  else
unknown's avatar
unknown committed
1740
  {
unknown's avatar
unknown committed
1741 1742 1743 1744 1745 1746
    push(@ld_library_paths, "$glob_basedir/lib");
  }

 # --------------------------------------------------------------------------
  # Add the path where libndbclient can be found
  # --------------------------------------------------------------------------
1747
  if ( $glob_ndbcluster_supported )
unknown's avatar
unknown committed
1748 1749
  {
    push(@ld_library_paths,  "$glob_basedir/storage/ndb/src/.libs");
unknown's avatar
unknown committed
1750
  }
unknown's avatar
unknown committed
1751

1752 1753 1754
  # --------------------------------------------------------------------------
  # Add the path where mysqld will find udf_example.so
  # --------------------------------------------------------------------------
1755 1756 1757 1758 1759 1760
  if ( $lib_udf_example )
  {
    push(@ld_library_paths, dirname($lib_udf_example));
  }

  # --------------------------------------------------------------------------
unknown's avatar
unknown committed
1761
  # Valgrind need to be run with debug libraries otherwise it's almost
1762 1763 1764
  # impossible to add correct supressions, that means if "/usr/lib/debug"
  # is available, it should be added to
  # LD_LIBRARY_PATH
1765 1766 1767 1768
  #
  # But pthread is broken in libc6-dbg on Debian <= 3.1 (see Debian
  # bug 399035, http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=399035),
  # so don't change LD_LIBRARY_PATH on that platform.
1769 1770
  # --------------------------------------------------------------------------
  my $debug_libraries_path= "/usr/lib/debug";
1771 1772 1773
  my $deb_version;
  if (  $opt_valgrind and -d $debug_libraries_path and
        (! -e '/etc/debian_version' or
1774
	 ($deb_version= mtr_grab_file('/etc/debian_version')) !~ /^[0-9]+\.[0-9]$/ or
1775
         $deb_version > 3.1 ) )
1776 1777 1778
  {
    push(@ld_library_paths, $debug_libraries_path);
  }
1779

1780
  $ENV{'LD_LIBRARY_PATH'}= join(":", @ld_library_paths,
unknown's avatar
unknown committed
1781
				$ENV{'LD_LIBRARY_PATH'} ?
1782
				split(':', $ENV{'LD_LIBRARY_PATH'}) : ());
1783 1784 1785
  mtr_debug("LD_LIBRARY_PATH: $ENV{'LD_LIBRARY_PATH'}");

  $ENV{'DYLD_LIBRARY_PATH'}= join(":", @ld_library_paths,
1786 1787
				  $ENV{'DYLD_LIBRARY_PATH'} ?
				  split(':', $ENV{'DYLD_LIBRARY_PATH'}) : ());
1788
  mtr_debug("DYLD_LIBRARY_PATH: $ENV{'DYLD_LIBRARY_PATH'}");
1789

1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800
  # The environment variable used for shared libs on AIX
  $ENV{'SHLIB_PATH'}= join(":", @ld_library_paths,
                           $ENV{'SHLIB_PATH'} ?
                           split(':', $ENV{'SHLIB_PATH'}) : ());
  mtr_debug("SHLIB_PATH: $ENV{'SHLIB_PATH'}");

  # The environment variable used for shared libs on hp-ux
  $ENV{'LIBPATH'}= join(":", @ld_library_paths,
                        $ENV{'LIBPATH'} ?
                        split(':', $ENV{'LIBPATH'}) : ());
  mtr_debug("LIBPATH: $ENV{'LIBPATH'}");
unknown's avatar
unknown committed
1801

unknown's avatar
unknown committed
1802 1803 1804 1805
  # --------------------------------------------------------------------------
  # Also command lines in .opt files may contain env vars
  # --------------------------------------------------------------------------

unknown's avatar
unknown committed
1806
  $ENV{'CHARSETSDIR'}=              $path_charsetsdir;
unknown's avatar
unknown committed
1807 1808
  $ENV{'UMASK'}=              "0660"; # The octal *string*
  $ENV{'UMASK_DIR'}=          "0770"; # The octal *string*
1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820
  
  #
  # MySQL tests can produce output in various character sets
  # (especially, ctype_xxx.test). To avoid confusing Perl
  # with output which is incompatible with the current locale
  # settings, we reset the current values of LC_ALL and LC_CTYPE to "C".
  # For details, please see
  # Bug#27636 tests fails if LC_* variables set to *_*.UTF-8
  #
  $ENV{'LC_ALL'}=             "C";
  $ENV{'LC_CTYPE'}=           "C";
  
unknown's avatar
unknown committed
1821
  $ENV{'LC_COLLATE'}=         "C";
1822
  $ENV{'USE_RUNNING_SERVER'}= $opt_extern;
unknown's avatar
unknown committed
1823
  $ENV{'MYSQL_TEST_DIR'}=     $glob_mysql_test_dir;
1824
  $ENV{'MYSQLTEST_VARDIR'}=   $opt_vardir;
1825
  $ENV{'MYSQL_TMP_DIR'}=      $opt_tmpdir;
unknown's avatar
unknown committed
1826 1827 1828 1829 1830 1831 1832 1833
  $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'};
  $ENV{'SLAVE_MYSOCK'}=       $slave->[0]->{'path_sock'};
  $ENV{'SLAVE_MYPORT'}=       $slave->[0]->{'port'};
  $ENV{'SLAVE_MYPORT1'}=      $slave->[1]->{'port'};
  $ENV{'SLAVE_MYPORT2'}=      $slave->[2]->{'port'};
1834
  $ENV{'MYSQL_TCP_PORT'}=     $mysqld_variables{'port'};
1835
  $ENV{'DEFAULT_MASTER_PORT'}= $mysqld_variables{'master-port'};
unknown's avatar
unknown committed
1836

1837 1838 1839
  $ENV{'IM_PATH_SOCK'}=       $instance_manager->{path_sock};
  $ENV{'IM_USERNAME'}=        $instance_manager->{admin_login};
  $ENV{'IM_PASSWORD'}=        $instance_manager->{admin_password};
1840
  $ENV{MTR_BUILD_THREAD}=      $opt_mtr_build_thread;
1841

1842 1843 1844
  $ENV{'EXE_MYSQL'}=          $exe_mysql;


unknown's avatar
unknown committed
1845 1846 1847
  # ----------------------------------------------------
  # Setup env for NDB
  # ----------------------------------------------------
1848 1849 1850
  if ( ! $opt_skip_ndbcluster )
  {
    $ENV{'NDB_MGM'}=                  $exe_ndb_mgm;
unknown's avatar
unknown committed
1851

1852 1853
    $ENV{'NDBCLUSTER_PORT'}=          $opt_ndbcluster_port;
    $ENV{'NDBCLUSTER_PORT_SLAVE'}=    $opt_ndbcluster_port_slave;
unknown's avatar
unknown committed
1854

1855
    $ENV{'NDB_EXTRA_TEST'}=           $opt_ndb_extra_test;
unknown's avatar
unknown committed
1856

1857 1858 1859 1860 1861
    $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;
unknown's avatar
unknown committed
1862

1863 1864 1865 1866 1867
    if ( $mysql_version_id >= 50000 )
    {
      $ENV{'NDB_EXAMPLES_DIR'}=         $path_ndb_examples_dir;
      $ENV{'MY_NDB_EXAMPLES_BINARY'}=   $exe_ndb_example;
    }
1868 1869
    $ENV{'NDB_EXAMPLES_OUTPUT'}=      $path_ndb_testrun_log;
  }
unknown's avatar
unknown committed
1870 1871 1872 1873

  # ----------------------------------------------------
  # Setup env for IM
  # ----------------------------------------------------
1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895
  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};
  }
unknown's avatar
unknown committed
1896 1897 1898 1899 1900

  # ----------------------------------------------------
  # Setup env so childs can execute mysqlcheck
  # ----------------------------------------------------
  my $cmdline_mysqlcheck=
1901 1902 1903 1904
    mtr_native_path($exe_mysqlcheck) .
      " --no-defaults -uroot " .
      "--port=$master->[0]->{'port'} " .
      "--socket=$master->[0]->{'path_sock'} --password=";
unknown's avatar
unknown committed
1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932

  if ( $opt_debug )
  {
    $cmdline_mysqlcheck .=
      " --debug=d:t:A,$path_vardir_trace/log/mysqlcheck.trace";
  }
  $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 .=
      " --debug=d:t:A,$path_vardir_trace/log/mysqldump-master.trace";
    $cmdline_mysqldumpslave .=
      " --debug=d:t:A,$path_vardir_trace/log/mysqldump-slave.trace";
  }
  $ENV{'MYSQL_DUMP'}= $cmdline_mysqldump;
  $ENV{'MYSQL_DUMP_SLAVE'}= $cmdline_mysqldumpslave;


  # ----------------------------------------------------
  # Setup env so childs can execute mysqlslap
  # ----------------------------------------------------
1933
  if ( $exe_mysqlslap )
1934
  {
1935
    my $cmdline_mysqlslap=
1936 1937
      mtr_native_path($exe_mysqlslap) .
      " -uroot " .
1938 1939 1940 1941 1942
      "--port=$master->[0]->{'port'} " .
      "--socket=$master->[0]->{'path_sock'} --password= " .
      "--lock-directory=$opt_tmpdir";

    if ( $opt_debug )
1943
   {
1944 1945 1946 1947
      $cmdline_mysqlslap .=
	" --debug=d:t:A,$path_vardir_trace/log/mysqlslap.trace";
    }
    $ENV{'MYSQL_SLAP'}= $cmdline_mysqlslap;
unknown's avatar
unknown committed
1948
  }
unknown's avatar
unknown committed
1949

unknown's avatar
unknown committed
1950 1951 1952 1953
  # ----------------------------------------------------
  # Setup env so childs can execute mysqlimport
  # ----------------------------------------------------
  my $cmdline_mysqlimport=
1954 1955
    mtr_native_path($exe_mysqlimport) .
    " -uroot " .
unknown's avatar
unknown committed
1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970
    "--port=$master->[0]->{'port'} " .
    "--socket=$master->[0]->{'path_sock'} --password=";

  if ( $opt_debug )
  {
    $cmdline_mysqlimport .=
      " --debug=d:t:A,$path_vardir_trace/log/mysqlimport.trace";
  }
  $ENV{'MYSQL_IMPORT'}= $cmdline_mysqlimport;


  # ----------------------------------------------------
  # Setup env so childs can execute mysqlshow
  # ----------------------------------------------------
  my $cmdline_mysqlshow=
1971 1972
    mtr_native_path($exe_mysqlshow) .
    " -uroot " .
unknown's avatar
unknown committed
1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986
    "--port=$master->[0]->{'port'} " .
    "--socket=$master->[0]->{'path_sock'} --password=";

  if ( $opt_debug )
  {
    $cmdline_mysqlshow .=
      " --debug=d:t:A,$path_vardir_trace/log/mysqlshow.trace";
  }
  $ENV{'MYSQL_SHOW'}= $cmdline_mysqlshow;

  # ----------------------------------------------------
  # Setup env so childs can execute mysqlbinlog
  # ----------------------------------------------------
  my $cmdline_mysqlbinlog=
1987
    mtr_native_path($exe_mysqlbinlog) .
unknown's avatar
unknown committed
1988
      " --no-defaults";
unknown's avatar
unknown committed
1989
  if (!$opt_extern && $mysql_version_id >= 50000 )
unknown's avatar
unknown committed
1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
  {
    $cmdline_mysqlbinlog .=" --character-sets-dir=$path_charsetsdir";
  }

  if ( $opt_debug )
  {
    $cmdline_mysqlbinlog .=
      " --debug=d:t:A,$path_vardir_trace/log/mysqlbinlog.trace";
  }
  $ENV{'MYSQL_BINLOG'}= $cmdline_mysqlbinlog;

  # ----------------------------------------------------
  # Setup env so childs can execute mysql
  # ----------------------------------------------------
  my $cmdline_mysql=
2005 2006
    mtr_native_path($exe_mysql) .
    " --no-defaults --host=localhost  --user=root --password= " .
unknown's avatar
unknown committed
2007 2008 2009 2010 2011 2012 2013 2014 2015
    "--port=$master->[0]->{'port'} " .
    "--socket=$master->[0]->{'path_sock'} ".
    "--character-sets-dir=$path_charsetsdir";

  $ENV{'MYSQL'}= $cmdline_mysql;

  # ----------------------------------------------------
  # Setup env so childs can execute mysql_client_test
  # ----------------------------------------------------
2016
  $ENV{'MYSQL_CLIENT_TEST'}=  mysql_client_test_arguments();
unknown's avatar
unknown committed
2017

2018 2019 2020
  # ----------------------------------------------------
  # Setup env so childs can execute mysql_upgrade
  # ----------------------------------------------------
unknown's avatar
unknown committed
2021
  if ( !$opt_extern && $mysql_version_id >= 50000 )
2022 2023 2024 2025
  {
    $ENV{'MYSQL_UPGRADE'}= mysql_upgrade_arguments();
  }

unknown's avatar
unknown committed
2026 2027 2028
  # ----------------------------------------------------
  # Setup env so childs can execute mysql_fix_system_tables
  # ----------------------------------------------------
unknown's avatar
unknown committed
2029
  if ( !$opt_extern && ! $glob_win32 )
2030 2031 2032 2033 2034 2035 2036 2037
  {
    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;
2038

2039
  }
2040
  $ENV{'MYSQL_FIX_PRIVILEGE_TABLES'}=  $file_mysql_fix_privilege_tables;
unknown's avatar
unknown committed
2041 2042 2043 2044

  # ----------------------------------------------------
  # Setup env so childs can execute my_print_defaults
  # ----------------------------------------------------
2045
  $ENV{'MYSQL_MY_PRINT_DEFAULTS'}= mtr_native_path($exe_my_print_defaults);
unknown's avatar
unknown committed
2046

2047 2048 2049
  # ----------------------------------------------------
  # Setup env so childs can execute mysqladmin
  # ----------------------------------------------------
2050
  $ENV{'MYSQLADMIN'}= mtr_native_path($exe_mysqladmin);
unknown's avatar
unknown committed
2051 2052 2053 2054

  # ----------------------------------------------------
  # Setup env so childs can execute perror  
  # ----------------------------------------------------
2055
  $ENV{'MY_PERROR'}= mtr_native_path($exe_perror);
unknown's avatar
unknown committed
2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068

  # ----------------------------------------------------
  # 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
unknown committed
2069
  # We are nice and report a bit about our settings
unknown's avatar
unknown committed
2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093
  # ----------------------------------------------------
  if (!$opt_extern)
  {
    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";
    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";
    }
  }
2094 2095 2096 2097 2098

  # 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
2099 2100 2101
}


unknown's avatar
unknown committed
2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112
##############################################################################
#
#  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
2113

unknown's avatar
unknown committed
2114 2115 2116
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
2117
  stop_all_servers();
unknown's avatar
unknown committed
2118
  mtr_error("We die from ^C signal from user");
unknown's avatar
unknown committed
2119 2120 2121 2122 2123 2124 2125 2126 2127
}


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

2128
sub kill_running_servers () {
unknown's avatar
unknown committed
2129 2130 2131 2132

  if ( $opt_fast or $glob_use_embedded_server )
  {
    # FIXME is embedded server really using PID files?!
unknown's avatar
unknown committed
2133 2134 2135 2136 2137
    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
2138 2139 2140 2141 2142
  }
  else
  {
    # Ensure that no old mysqld test servers are running
    # This is different from terminating processes we have
unknown's avatar
unknown committed
2143
    # started from this run of the script, this is terminating
unknown's avatar
unknown committed
2144 2145
    # leftovers from previous runs.
    mtr_kill_leftovers();
unknown's avatar
unknown committed
2146
   }
2147 2148
}

2149 2150 2151 2152 2153
#
# Remove var and any directories in var/ created by previous
# tests
#
sub remove_stale_vardir () {
2154

unknown's avatar
unknown committed
2155 2156
  mtr_report("Removing Stale Files");

2157 2158 2159 2160 2161
  # Safety!
  mtr_error("No, don't remove the vardir when running with --extern")
    if $opt_extern;

  mtr_verbose("opt_vardir: $opt_vardir");
2162
  if ( $opt_vardir eq $default_vardir )
2163 2164 2165 2166
  {
    #
    # Running with "var" in mysql-test dir
    #
2167
    if ( -l $opt_vardir)
2168
    {
2169
      # var is a symlink
2170 2171

      if ( $opt_mem and readlink($opt_vardir) eq $opt_mem )
2172 2173
      {
	# Remove the directory which the link points at
2174
	mtr_verbose("Removing " . readlink($opt_vardir));
2175
	rmtree(readlink($opt_vardir));
2176

2177
	# Remove the "var" symlink
2178
	mtr_verbose("unlink($opt_vardir)");
2179
	unlink($opt_vardir);
2180
      }
2181 2182 2183 2184 2185 2186 2187 2188
      elsif ( $opt_mem )
      {
	# Just remove the "var" symlink
	mtr_report("WARNING: Removing '$opt_vardir' symlink it's wrong");

	mtr_verbose("unlink($opt_vardir)");
	unlink($opt_vardir);
      }
2189 2190 2191
      else
      {
	# Some users creates a soft link in mysql-test/var to another area
2192 2193
	# - allow it, but remove all files in it

2194
	mtr_report("WARNING: Using the 'mysql-test/var' symlink");
2195

2196 2197 2198 2199
	# Make sure the directory where it points exist
	mtr_error("The destination for symlink $opt_vardir does not exist")
	  if ! -d readlink($opt_vardir);

2200 2201 2202 2203 2204
	foreach my $bin ( glob("$opt_vardir/*") )
	{
	  mtr_verbose("Removing bin $bin");
	  rmtree($bin);
	}
2205
      }
2206 2207 2208 2209
    }
    else
    {
      # Remove the entire "var" dir
2210
      mtr_verbose("Removing $opt_vardir/");
2211 2212
      rmtree("$opt_vardir/");
    }
2213 2214 2215 2216 2217 2218 2219 2220 2221 2222

    if ( $opt_mem )
    {
      # A symlink from var/ to $opt_mem will be set up
      # remove the $opt_mem dir to assure the symlink
      # won't point at an old directory
      mtr_verbose("Removing $opt_mem");
      rmtree($opt_mem);
    }

2223 2224 2225 2226 2227 2228 2229 2230 2231
  }
  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
2232
    mtr_verbose("Removing $default_vardir");
2233
    rmtree($default_vardir);
2234 2235

    # Remove the "var" dir
2236
    mtr_verbose("Removing $opt_vardir/");
2237 2238
    rmtree("$opt_vardir/");
  }
2239 2240 2241 2242 2243 2244 2245
}

#
# Create var and the directories needed in var
#
sub setup_vardir() {
  mtr_report("Creating Directories");
unknown's avatar
unknown committed
2246

2247
  if ( $opt_vardir eq $default_vardir )
2248
  {
2249 2250 2251 2252 2253 2254
    #
    # Running with "var" in mysql-test dir
    #
    if ( -l $opt_vardir )
    {
      #  it's a symlink
2255

2256 2257 2258 2259 2260 2261 2262 2263 2264
      # Make sure the directory where it points exist
      mtr_error("The destination for symlink $opt_vardir does not exist")
	if ! -d readlink($opt_vardir);
    }
    elsif ( $opt_mem )
    {
      # Runinng with "var" as a link to some "memory" location, normally tmpfs
      mtr_verbose("Creating $opt_mem");
      mkpath($opt_mem);
2265

2266 2267 2268
      mtr_report("Symlinking 'var' to '$opt_mem'");
      symlink($opt_mem, $opt_vardir);
    }
2269 2270
  }

2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283
  if ( ! -d $opt_vardir )
  {
    mtr_verbose("Creating $opt_vardir");
    mkpath($opt_vardir);
  }

  # Ensure a proper error message if vardir couldn't be created
  unless ( -d $opt_vardir and -w $opt_vardir )
  {
    mtr_error("Writable 'var' directory is needed, use the " .
	      "'--vardir=<path>' option");
  }

2284 2285 2286
  mkpath("$opt_vardir/log");
  mkpath("$opt_vardir/run");
  mkpath("$opt_vardir/tmp");
unknown's avatar
unknown committed
2287
  mkpath($opt_tmpdir) if $opt_tmpdir ne "$opt_vardir/tmp";
unknown's avatar
unknown committed
2288

2289
  # Create new data dirs
2290 2291 2292 2293 2294
  foreach my $data_dir (@data_dir_lst)
  {
    mkpath("$data_dir/mysql");
    mkpath("$data_dir/test");
  }
2295

2296 2297
  # Make a link std_data_ln in var/ that points to std_data
  if ( ! $glob_win32 )
2298
  {
2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
    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);
2312
  }
unknown's avatar
unknown committed
2313 2314

  # Remove old log files
unknown's avatar
unknown committed
2315
  foreach my $name (glob("r/*.progress r/*.log r/*.warnings"))
unknown's avatar
unknown committed
2316 2317 2318
  {
    unlink($name);
  }
unknown's avatar
unknown committed
2319 2320 2321
}


2322 2323 2324
sub  check_running_as_root () {
  # Check if running as root
  # i.e a file can be read regardless what mode we set it to
2325
  my $test_file= "$opt_vardir/test_running_as_root.txt";
2326 2327 2328 2329 2330 2331 2332 2333 2334 2335
  mtr_tofile($test_file, "MySQL");
  chmod(oct("0000"), $test_file);

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

2336 2337 2338 2339
  # Some filesystems( for example CIFS) allows reading a file
  # although mode was set to 0000, but in that case a stat on
  # the file will not return 0000
  my $file_mode= (stat($test_file))[2] & 07777;
2340 2341

  $ENV{'MYSQL_TEST_ROOT'}= "NO";
2342 2343
  mtr_verbose("result: $result, file_mode: $file_mode");
  if ($result eq "MySQL" && $file_mode == 0)
2344 2345 2346 2347 2348
  {
    mtr_warning("running this script as _root_ will cause some " .
                "tests to be skipped");
    $ENV{'MYSQL_TEST_ROOT'}= "YES";
  }
2349 2350 2351 2352

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

2353 2354 2355
}


unknown's avatar
unknown committed
2356 2357
sub check_ssl_support ($) {
  my $mysqld_variables= shift;
2358

unknown's avatar
unknown committed
2359
  if ($opt_skip_ssl || $opt_extern)
2360
  {
unknown's avatar
unknown committed
2361 2362 2363 2364
    if (!$opt_extern)
    {
      mtr_report("Skipping SSL");
    }
2365 2366 2367 2368 2369
    $opt_ssl_supported= 0;
    $opt_ssl= 0;
    return;
  }

2370
  if ( ! $mysqld_variables->{'ssl'} )
2371 2372 2373 2374 2375 2376
  {
    if ( $opt_ssl)
    {
      mtr_error("Couldn't find support for SSL");
      return;
    }
unknown's avatar
unknown committed
2377
    mtr_report("Skipping SSL, mysqld not compiled with SSL");
2378 2379 2380 2381 2382 2383 2384 2385 2386
    $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
2387 2388 2389
sub check_debug_support ($) {
  my $mysqld_variables= shift;

2390
  if ( ! $mysqld_variables->{'debug'} )
unknown's avatar
unknown committed
2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404
  {
    #mtr_report("Binaries are not debug compiled");
    $debug_compiled_binaries= 0;

    if ( $opt_debug )
    {
      mtr_error("Can't use --debug, binaries does not support it");
    }
    return;
  }
  mtr_report("Binaries are debug compiled");
  $debug_compiled_binaries= 1;
}

2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429
##############################################################################
#
# 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
2430 2431 2432 2433 2434 2435
##############################################################################
#
#  Start the ndb cluster
#
##############################################################################

unknown's avatar
unknown committed
2436 2437
sub check_ndbcluster_support ($) {
  my $mysqld_variables= shift;
unknown's avatar
unknown committed
2438

unknown's avatar
unknown committed
2439
  if ($opt_skip_ndbcluster || $opt_extern)
unknown's avatar
unknown committed
2440
  {
unknown's avatar
unknown committed
2441 2442 2443 2444
    if (!$opt_extern)
    {
      mtr_report("Skipping ndbcluster");
    }
unknown's avatar
unknown committed
2445 2446 2447 2448
    $opt_skip_ndbcluster_slave= 1;
    return;
  }

2449
  if ( ! $mysqld_variables->{'ndb-connectstring'} )
unknown's avatar
unknown committed
2450 2451 2452 2453
  {
    mtr_report("Skipping ndbcluster, mysqld not compiled with ndbcluster");
    $opt_skip_ndbcluster= 1;
    $opt_skip_ndbcluster_slave= 1;
2454 2455
    return;
  }
2456
  $glob_ndbcluster_supported= 1;
unknown's avatar
unknown committed
2457
  mtr_report("Using ndbcluster when necessary, mysqld supports it");
2458 2459 2460 2461 2462 2463 2464 2465

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

  }

unknown's avatar
unknown committed
2466
  return;
unknown's avatar
unknown committed
2467 2468
}

unknown's avatar
unknown committed
2469

unknown's avatar
unknown committed
2470 2471
sub ndbcluster_start_install ($) {
  my $cluster= shift;
unknown's avatar
unknown committed
2472

unknown's avatar
unknown committed
2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490
  mtr_report("Installing $cluster->{'name'} Cluster");

  mkdir($cluster->{'data_dir'});

  # 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;

  if (!$opt_bench)
  {
    # Use a smaller configuration
2491
    if (  $mysql_version_id < 50100 )
2492
    {
2493
      # 4.1 and 5.0 is using a "larger" --small configuration
2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506
      $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";
    }
2507 2508
  }

unknown's avatar
unknown committed
2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528
  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>)
  {
    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'}/;
2529 2530 2531 2532 2533
    if ( $mysql_version_id < 50000 )
    {
      my $base_port= $cluster->{'port'} + 1;
      s/CHOOSE_PORT_TRANSPORTER/$base_port/;
    }
unknown's avatar
unknown committed
2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544
    s/CHOOSE_DiskPageBufferMemory/$ndb_pbmem/;

    print OUT "$_ \n";
  }
  close OUT;
  close IN;


  # Start cluster with "--initial"

  ndbcluster_start($cluster, "--initial");
2545 2546 2547 2548 2549

  return 0;
}


unknown's avatar
unknown committed
2550 2551 2552 2553 2554 2555 2556
sub ndbcluster_wait_started($$){
  my $cluster= shift;
  my $ndb_waiter_extra_opt= shift;
  my $path_waiter_log= "$cluster->{'data_dir'}/ndb_waiter.log";
  my $args;

  mtr_init_args(\$args);
unknown's avatar
unknown committed
2557

unknown's avatar
unknown committed
2558 2559 2560 2561
  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");
2562

unknown's avatar
unknown committed
2563
  if ($ndb_waiter_extra_opt)
2564
  {
unknown's avatar
unknown committed
2565
    mtr_add_arg($args, "$ndb_waiter_extra_opt");
2566 2567
  }

unknown's avatar
unknown committed
2568 2569 2570 2571 2572 2573 2574 2575
  # 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
  my $res= mtr_run($exe_ndb_waiter, $args,
		   "", $path_waiter_log, $path_waiter_log, "");
  mtr_verbose("ndbcluster_wait_started, returns: $res") if $res;
  return $res;
}
2576

unknown's avatar
unknown committed
2577 2578 2579 2580 2581 2582 2583 2584 2585


sub mysqld_wait_started($){
  my $mysqld= shift;

  my $res= sleep_until_file_created($mysqld->{'path_pid'},
				    $mysqld->{'start_timeout'},
				    $mysqld->{'pid'});
  return $res == 0;
2586 2587
}

unknown's avatar
unknown committed
2588

unknown's avatar
unknown committed
2589 2590
sub ndb_mgmd_wait_started($) {
  my ($cluster)= @_;
unknown's avatar
unknown committed
2591

unknown's avatar
unknown committed
2592 2593 2594
  my $retries= 100;
  while (ndbcluster_wait_started($cluster, "--no-contact") and
	 $retries)
2595
  {
unknown's avatar
unknown committed
2596 2597 2598 2599
    # Millisceond sleep emulated with select
    select(undef, undef, undef, (0.1));

    $retries--;
2600
  }
unknown's avatar
unknown committed
2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629

  return $retries == 0;

}

sub ndb_mgmd_start ($) {
  my $cluster= shift;

  my $args;                             # Arg vector
  my $pid= -1;

  mtr_init_args(\$args);
  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--core");
  mtr_add_arg($args, "--nodaemon");
  mtr_add_arg($args, "--config-file=%s", "$cluster->{'data_dir'}/config.ini");


  my $path_ndb_mgmd_log= "$cluster->{'data_dir'}/\l$cluster->{'name'}_ndb_mgmd.log";
  $pid= mtr_spawn($exe_ndb_mgmd, $args, "",
		  $path_ndb_mgmd_log,
		  $path_ndb_mgmd_log,
		  "",
		  { append_log_file => 1 });

  # FIXME Should not be needed
  # Unfortunately the cluster nodes will fail to start
  # if ndb_mgmd has not started properly
  if (ndb_mgmd_wait_started($cluster))
2630
  {
unknown's avatar
unknown committed
2631
    mtr_error("Failed to wait for start of ndb_mgmd");
2632 2633
  }

unknown's avatar
unknown committed
2634 2635
  # Remember pid of ndb_mgmd
  $cluster->{'pid'}= $pid;
2636

unknown's avatar
unknown committed
2637 2638 2639
  mtr_verbose("ndb_mgmd_start, pid: $pid");

  return $pid;
2640 2641
}

unknown's avatar
unknown committed
2642

unknown's avatar
unknown committed
2643 2644 2645 2646 2647 2648 2649
sub ndbd_start ($$$) {
  my $cluster= shift;
  my $idx= shift;
  my $extra_args= shift;

  my $args;                             # Arg vector
  my $pid= -1;
2650

unknown's avatar
unknown committed
2651 2652 2653 2654
  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'}");
2655
  if ( $mysql_version_id >= 50000)
2656
  {
2657
    mtr_add_arg($args, "--character-sets-dir=%s", "$path_charsetsdir");
2658
  }
unknown's avatar
unknown committed
2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688
  mtr_add_arg($args, "--nodaemon");
  mtr_add_arg($args, "$extra_args");

  my $nodeid= $cluster->{'ndbds'}->[$idx]->{'nodeid'};
  my $path_ndbd_log= "$cluster->{'data_dir'}/ndb_${nodeid}.log";
  $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;

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

  mtr_verbose("ndbd_start, pid: $pid");

  return $pid;
}


sub ndbcluster_start ($$) {
  my $cluster= shift;
  my $extra_args= shift;

  mtr_verbose("ndbcluster_start '$cluster->{'name'}'");

2689
  if ( $glob_use_running_ndbcluster )
2690
  {
2691 2692
    return 0;
  }
unknown's avatar
unknown committed
2693 2694

  if ( $cluster->{'pid'} )
2695
  {
unknown's avatar
unknown committed
2696
    mtr_error("Cluster '$cluster->{'name'}' already started");
2697
  }
unknown's avatar
unknown committed
2698 2699 2700 2701

  ndb_mgmd_start($cluster);

  for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
2702
  {
unknown's avatar
unknown committed
2703
    ndbd_start($cluster, $idx, $extra_args);
2704 2705 2706
  }

  return 0;
unknown's avatar
unknown committed
2707 2708
}

unknown's avatar
unknown committed
2709

unknown's avatar
unknown committed
2710 2711
sub rm_ndbcluster_tables ($) {
  my $dir=       shift;
unknown's avatar
unknown committed
2712 2713
  foreach my $bin ( glob("$dir/mysql/apply_status*"),
                    glob("$dir/mysql/schema*"))
2714
  {
unknown's avatar
unknown committed
2715
    unlink($bin);
2716
  }
unknown's avatar
unknown committed
2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730
}


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

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

  my $args;

unknown's avatar
unknown committed
2731
  if ( ! $glob_use_embedded_server )
unknown's avatar
unknown committed
2732
  {
unknown's avatar
unknown committed
2733
    mysqld_start($master->[0],[],[]);
unknown's avatar
unknown committed
2734 2735 2736 2737
    if ( ! $master->[0]->{'pid'} )
    {
      mtr_error("Can't start the mysqld server");
    }
unknown's avatar
unknown committed
2738 2739 2740 2741
  }

  mtr_init_args(\$args);

unknown's avatar
unknown committed
2742
  mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
unknown's avatar
unknown committed
2743
  mtr_add_arg($args, "--user=%s", $opt_user);
unknown's avatar
unknown committed
2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755

  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");
  }

unknown's avatar
unknown committed
2756 2757
  chdir($glob_mysql_bench_dir)
    or mtr_error("Couldn't chdir to '$glob_mysql_bench_dir': $!");
unknown's avatar
unknown committed
2758 2759 2760 2761

  if ( ! $benchmark )
  {
    mtr_add_arg($args, "--log");
unknown's avatar
unknown committed
2762
    mtr_run("$glob_mysql_bench_dir/run-all-tests", $args, "", "", "", "");
unknown's avatar
unknown committed
2763 2764 2765 2766
    # FIXME check result code?!
  }
  elsif ( -x $benchmark )
  {
unknown's avatar
unknown committed
2767
    mtr_run("$glob_mysql_bench_dir/$benchmark", $args, "", "", "", "");
unknown's avatar
unknown committed
2768 2769 2770 2771
    # FIXME check result code?!
  }
  else
  {
unknown's avatar
unknown committed
2772
    mtr_error("Benchmark $benchmark not found");
unknown's avatar
unknown committed
2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789
  }

  chdir($glob_mysql_test_dir);          # Go back

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


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

unknown's avatar
unknown committed
2790
sub run_suite () {
2791
  my ($suite, $tests)= @_;
unknown's avatar
unknown committed
2792 2793

  mtr_print_thick_line();
unknown's avatar
unknown committed
2794

2795 2796
  mtr_timer_start($glob_timers,"suite", 60 * $opt_suite_timeout);

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

unknown's avatar
unknown committed
2799 2800
  mtr_report_tests_not_skipped_though_disabled($tests);

unknown's avatar
unknown committed
2801 2802 2803 2804
  mtr_print_header();

  foreach my $tinfo ( @$tests )
  {
unknown's avatar
unknown committed
2805 2806 2807 2808 2809
    if (run_testcase_check_skip_test($tinfo))
    {
      next;
    }

2810
    mtr_timer_start($glob_timers,"testcase", 60 * $opt_testcase_timeout);
unknown's avatar
unknown committed
2811
    run_testcase($tinfo);
2812
    mtr_timer_stop($glob_timers,"testcase");
unknown's avatar
unknown committed
2813 2814 2815 2816
  }

  mtr_print_line();

2817
  if ( ! $glob_debugger and
2818
       ! $opt_extern and
unknown's avatar
unknown committed
2819
       ! $glob_use_embedded_server )
unknown's avatar
unknown committed
2820
  {
unknown's avatar
unknown committed
2821
    stop_all_servers();
unknown's avatar
unknown committed
2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833
  }

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

  mtr_report_stats($tests);
2834 2835

  mtr_timer_stop($glob_timers,"suite");
unknown's avatar
unknown committed
2836 2837 2838 2839 2840 2841 2842 2843 2844
}


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

2845
sub initialize_servers () {
2846

2847
  datadir_list_setup();
2848

2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
  if ( $opt_extern )
  {
    # Running against an already started server, if the specified
    # vardir does not already exist it should be created
    if ( ! -d $opt_vardir )
    {
      mtr_report("Creating '$opt_vardir'");
      setup_vardir();
    }
    else
    {
unknown's avatar
unknown committed
2860 2861 2862 2863
      if ($opt_verbose)
      {
	mtr_report("No need to create '$opt_vardir' it already exists");
      }
2864 2865 2866
    }
  }
  else
2867
  {
2868
    kill_running_servers();
2869

2870
    if ( ! $opt_start_dirty )
2871
    {
2872 2873 2874
      remove_stale_vardir();
      setup_vardir();

2875 2876 2877
      mysql_install_db();
      if ( $opt_force )
      {
2878 2879
	# Save a snapshot of the freshly installed db
	# to make it possible to restore to a known point in time
2880 2881 2882 2883
	save_installed_db();
      }
    }
  }
2884
  check_running_as_root();
2885 2886
}

unknown's avatar
unknown committed
2887 2888 2889 2890
sub mysql_install_db () {

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

2891 2892 2893 2894
  if ($max_master_num)
  {
    copy_install_db('master', $master->[1]->{'path_myddir'});
  }
2895

2896 2897
  # Install the number of slave databses needed
  for (my $idx= 0; $idx < $max_slave_num; $idx++)
2898
  {
2899
    copy_install_db("slave".($idx+1), $slave->[$idx]->{'path_myddir'});
2900
  }
unknown's avatar
unknown committed
2901

unknown's avatar
unknown committed
2902
  if ( ! $opt_skip_im )
2903 2904 2905 2906
  {
    im_prepare_env($instance_manager);
  }

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

2909 2910
  if ($opt_skip_ndbcluster || $glob_use_running_ndbcluster ||
      $clusters->[0]->{executable_setup_failed})
2911
  {
2912 2913 2914 2915 2916 2917 2918 2919 2920
    # 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 ||
2921 2922
      $opt_skip_ndbcluster_slave || $glob_use_running_ndbcluster_slave ||
      $clusters->[1]->{executable_setup_failed})
unknown's avatar
unknown committed
2923
  {
2924 2925 2926 2927 2928
    # Don't install slave cluster
  }
  elsif (ndbcluster_start_install($clusters->[1]))
  {
    mtr_warning("Failed to start install of $clusters->[1]->{name}");
unknown's avatar
unknown committed
2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939
    $cluster_started_ok= 0;
  }

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

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

    $cluster->{'installed_ok'}= 1; # Assume install suceeds

    if (ndbcluster_wait_started($cluster, ""))
2940 2941
    {
      # failed to install, disable usage and flag that its no ok
unknown's avatar
unknown committed
2942 2943 2944 2945 2946 2947 2948 2949
      mtr_report("ndbcluster_install of $cluster->{'name'} failed");
      $cluster->{"installed_ok"}= 0;

      $cluster_started_ok= 0;
    }
  }

  if ( ! $cluster_started_ok )
2950
  {
unknown's avatar
unknown committed
2951 2952 2953
    if ( $opt_force)
    {
      # Continue without cluster
2954 2955 2956
    }
    else
    {
unknown's avatar
unknown committed
2957
      mtr_error("To continue, re-run with '--force'.");
2958
    }
2959 2960
  }

unknown's avatar
unknown committed
2961 2962 2963 2964
  return 0;
}


2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975
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
2976

unknown's avatar
unknown committed
2977 2978 2979 2980
sub install_db ($$) {
  my $type=      shift;
  my $data_dir=  shift;

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

unknown's avatar
unknown committed
2983

2984
  my $args;
unknown's avatar
unknown committed
2985 2986 2987 2988 2989 2990 2991
  mtr_init_args(\$args);
  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--bootstrap");
  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");
unknown's avatar
unknown committed
2992
  mtr_add_arg($args, "--tmpdir=.");
2993
  mtr_add_arg($args, "--core-file");
unknown's avatar
unknown committed
2994

2995 2996 2997
  if ( $opt_debug )
  {
    mtr_add_arg($args, "--debug=d:t:i:A,%s/log/bootstrap_%s.trace",
unknown's avatar
unknown committed
2998
		$path_vardir_trace, $type);
2999 3000
  }

unknown's avatar
unknown committed
3001
  if ( ! $glob_netware )
unknown's avatar
unknown committed
3002 3003 3004 3005 3006
  {
    mtr_add_arg($args, "--language=%s", $path_language);
    mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
  }

3007 3008 3009 3010 3011 3012 3013
  # If DISABLE_GRANT_OPTIONS is defined when the server is compiled (e.g.,
  # configure --disable-grant-options), mysqld will not recognize the
  # --bootstrap or --skip-grant-tables options.  The user can set
  # MYSQLD_BOOTSTRAP to the full path to a mysqld which does accept
  # --bootstrap, to accommodate this.
  my $exe_mysqld_bootstrap = $ENV{'MYSQLD_BOOTSTRAP'} || $exe_mysqld;

3014 3015 3016 3017 3018
  # ----------------------------------------------------------------------
  # export MYSQLD_BOOTSTRAP_CMD variable containing <path>/mysqld <args>
  # ----------------------------------------------------------------------
  $ENV{'MYSQLD_BOOTSTRAP_CMD'}= "$exe_mysqld_bootstrap " . join(" ", @$args);

3019 3020 3021
  # ----------------------------------------------------------------------
  # Create the bootstrap.sql file
  # ----------------------------------------------------------------------
3022
  my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql";
3023 3024 3025 3026

  # Use the mysql database for system tables
  mtr_tofile($bootstrap_sql_file, "use mysql");

3027 3028
  # Add the offical mysql system tables
  # for a production system
3029 3030 3031
  mtr_appendfile_to_file("$path_sql_dir/mysql_system_tables.sql",
			 $bootstrap_sql_file);

3032 3033 3034 3035 3036
  # Add the mysql system tables initial data
  # for a production system
  mtr_appendfile_to_file("$path_sql_dir/mysql_system_tables_data.sql",
			 $bootstrap_sql_file);

3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048
  # Add test data for timezone - this is just a subset, on a real
  # system these tables will be populated either by mysql_tzinfo_to_sql
  # or by downloading the timezone table package from our website
  mtr_appendfile_to_file("$path_sql_dir/mysql_test_data_timezone.sql",
			 $bootstrap_sql_file);

  # Fill help tables, just an empty file when running from bk repo
  # but will be replaced by a real fill_help_tables.sql when
  # building the source dist
  mtr_appendfile_to_file("$path_sql_dir/fill_help_tables.sql",
			 $bootstrap_sql_file);

3049 3050 3051
  # Log bootstrap command
  my $path_bootstrap_log= "$opt_vardir/log/bootstrap.log";
  mtr_tofile($path_bootstrap_log,
3052
	     "$exe_mysqld_bootstrap " . join(" ", @$args) . "\n");
3053

3054
  if ( mtr_run($exe_mysqld_bootstrap, $args, $bootstrap_sql_file,
3055 3056 3057
               $path_bootstrap_log, $path_bootstrap_log,
	       "", { append_log_file => 1 }) != 0 )

unknown's avatar
unknown committed
3058
  {
unknown's avatar
unknown committed
3059
    mtr_error("Error executing mysqld --bootstrap\n" .
3060 3061
              "Could not install system database from $bootstrap_sql_file\n" .
	      "see $path_bootstrap_log for errors");
unknown's avatar
unknown committed
3062 3063 3064 3065
  }
}


3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077
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
3078

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

3081 3082
  open(OUT, ">", $pwd_file_path)
    or mtr_error("Can't write to $pwd_file_path: $!");
unknown's avatar
unknown committed
3083

3084 3085
  print OUT $instance_manager->{'admin_login'}, ":",
        $instance_manager->{'admin_sha1'}, "\n";
unknown's avatar
unknown committed
3086

3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097
  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
3098

3099 3100 3101 3102 3103
  print OUT <<EOF
[mysql]

[manager]
pid-file            = $instance_manager->{path_pid}
3104
angel-pid-file      = $instance_manager->{path_angel_pid}
3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128
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
3129
server_id           = $server_id
3130
shutdown-delay      = 10
3131 3132 3133 3134 3135
skip-stack-trace
skip-innodb
skip-ndbcluster
EOF
;
3136 3137 3138 3139
    if ( $mysql_version_id < 50100 )
    {
      print OUT "skip-bdb\n";
    }
unknown's avatar
unknown committed
3140
    print OUT "nonguarded\n" if $instance->{'nonguarded'};
3141 3142 3143 3144
    if ( $mysql_version_id >= 50100 )
    {
      print OUT "log-output=FILE\n" if $instance->{'old_log_format'};
    }
3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156
    print OUT "\n";
  }

  close(OUT);
}


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

  foreach my $instance (@{$instance_manager->{'instances'}})
  {
3157
    copy_install_db(
3158 3159 3160 3161 3162 3163
      'im_mysqld_' . $instance->{'server_id'},
      $instance->{'path_datadir'});
  }
}


unknown's avatar
unknown committed
3164

3165 3166 3167 3168
#
# Restore snapshot of the installed slave databases
# if the snapshot exists
#
unknown's avatar
unknown committed
3169 3170
sub restore_slave_databases ($) {
  my ($num_slaves)= @_;
3171 3172 3173

  if ( -d $path_snapshot)
  {
unknown's avatar
unknown committed
3174
    for (my $idx= 0; $idx < $num_slaves; $idx++)
3175 3176 3177 3178 3179 3180 3181 3182 3183 3184
    {
      my $data_dir= $slave->[$idx]->{'path_myddir'};
      my $name= basename($data_dir);
      rmtree($data_dir);
      mtr_copy_dir("$path_snapshot/$name", $data_dir);
    }
  }
}


unknown's avatar
unknown committed
3185 3186 3187
sub run_testcase_check_skip_test($)
{
  my ($tinfo)= @_;
3188

unknown's avatar
unknown committed
3189 3190 3191 3192 3193 3194 3195 3196 3197
  # ----------------------------------------------------------------------
  # 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
3198
    mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
3199
    mtr_report_test_skipped($tinfo);
unknown's avatar
unknown committed
3200
    return 1;
unknown's avatar
unknown committed
3201 3202
  }

3203
  if ($tinfo->{'ndb_test'})
3204
  {
3205 3206 3207 3208
    foreach my $cluster (@{$clusters})
    {
      last if ($opt_skip_ndbcluster_slave and
	       $cluster->{'name'} eq 'Slave');
3209

3210 3211 3212 3213 3214 3215 3216 3217 3218
      # 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
3219

3220 3221 3222 3223
      # If test needs this cluster, check it was installed ok
      if ( !$cluster->{'installed_ok'} )
      {
	mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
3224 3225
	$tinfo->{comment}=
	  "Cluster $cluster->{'name'} was not installed ok";
3226 3227 3228
	mtr_report_test_failed($tinfo);
	return 1;
      }
unknown's avatar
unknown committed
3229 3230

    }
3231
  }
unknown's avatar
unknown committed
3232

3233 3234 3235 3236
  if ( $tinfo->{'component_id'} eq 'im' )
  {
      # If test needs im, check binaries was found ok
    if ( $instance_manager->{'executable_setup_failed'} )
unknown's avatar
unknown committed
3237
    {
3238 3239 3240 3241 3242
      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
3243
    }
unknown's avatar
unknown committed
3244
  }
unknown's avatar
unknown committed
3245

unknown's avatar
unknown committed
3246 3247
  return 0;
}
unknown's avatar
unknown committed
3248 3249


unknown's avatar
unknown committed
3250 3251 3252 3253
sub do_before_run_mysqltest($)
{
  my $tinfo= shift;
  my $tname= $tinfo->{'name'};
unknown's avatar
unknown committed
3254

3255 3256
  # Remove old files produced by mysqltest
  my $result_dir= "r";
3257
  if ( $opt_suite ne "main" )
unknown's avatar
unknown committed
3258
  {
3259
    $result_dir= "suite/$opt_suite/r";
unknown's avatar
unknown committed
3260
  }
3261 3262 3263 3264
  unlink("$result_dir/$tname.reject");
  unlink("$result_dir/$tname.progress");
  unlink("$result_dir/$tname.log");
  unlink("$result_dir/$tname.warnings");
unknown's avatar
unknown committed
3265

unknown's avatar
unknown committed
3266
  if (!$opt_extern)
3267
  {
unknown's avatar
unknown committed
3268 3269 3270 3271 3272 3273 3274 3275 3276
    if ( $mysql_version_id < 50000 ) {
      # Set environment 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 environment variable NDB_STATUS_OK to YES
      # if script decided to run mysqltest cluster _is_ installed ok
      $ENV{'NDB_STATUS_OK'} = "YES";
    }
3277
  }
unknown's avatar
unknown committed
3278
}
unknown's avatar
unknown committed
3279

unknown's avatar
unknown committed
3280 3281 3282 3283
sub do_after_run_mysqltest($)
{
  my $tinfo= shift;
  my $tname= $tinfo->{'name'};
unknown's avatar
unknown committed
3284

unknown's avatar
unknown committed
3285
  # Save info from this testcase run to mysqltest.log
3286 3287
  mtr_appendfile_to_file($path_current_test_log, $path_mysqltest_log)
    if -f $path_current_test_log;
unknown's avatar
unknown committed
3288 3289
  mtr_appendfile_to_file($path_timefile, $path_mysqltest_log)
    if -f $path_timefile;
unknown's avatar
unknown committed
3290

3291 3292
  # Remove the file that mysqltest writes info to
  unlink($path_timefile);
unknown's avatar
unknown committed
3293

unknown's avatar
unknown committed
3294
}
unknown's avatar
unknown committed
3295

3296

3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316
sub run_testcase_mark_logs($)
{
  my ($log_msg)= @_;

  # Write a marker to all log files

  # The file indicating current test name
  mtr_tonewfile($path_current_test_log, $log_msg);

  # each mysqld's .err file
  foreach my $mysqld (@{$master}, @{$slave})
  {
    mtr_tofile($mysqld->{path_myerr}, $log_msg);
  }

  # ndbcluster log file
  mtr_tofile($path_ndb_testrun_log, $log_msg);

}

3317 3318 3319 3320
sub find_testcase_skipped_reason($)
{
  my ($tinfo)= @_;

3321 3322 3323
  # Set default message
  $tinfo->{'comment'}= "Detected by testcase(no log file)";

3324
  # Open mysqltest-time(the mysqltest log file)
3325 3326
  my $F= IO::File->new($path_timefile)
    or return;
3327 3328 3329 3330
  my $reason;

  while ( my $line= <$F> )
  {
unknown's avatar
unknown committed
3331
    # Look for "reason: <reason for skipping test>"
3332
    if ( $line =~ /reason: (.*)/ )
unknown's avatar
unknown committed
3333
    {
3334 3335 3336
      $reason= $1;
    }
  }
3337

3338 3339 3340 3341 3342 3343 3344 3345 3346
  if ( ! $reason )
  {
    mtr_warning("Could not find reason for skipping test in $path_timefile");
    $reason= "Detected by testcase(reason unknown) ";
  }
  $tinfo->{'comment'}= $reason;
}


3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357
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);
3358
  mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376

  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 });

}

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

3378
  # Open mysqltest.log
3379 3380
  my $F= IO::File->new($path_timefile)
    or return;
3381 3382 3383 3384 3385 3386 3387 3388 3389

  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
3390
      {
3391
	analyze_testcase_failure_sync_with_master($tinfo);
unknown's avatar
unknown committed
3392 3393
      }
    }
3394 3395
  }
}
3396

unknown's avatar
unknown committed
3397 3398 3399 3400 3401
##############################################################################
#
#  Run a single test case
#
##############################################################################
3402

unknown's avatar
unknown committed
3403 3404 3405 3406
# 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.
unknown's avatar
unknown committed
3407

unknown's avatar
unknown committed
3408 3409 3410 3411
# 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.
unknown's avatar
unknown committed
3412

unknown's avatar
unknown committed
3413 3414
sub run_testcase ($) {
  my $tinfo=  shift;
unknown's avatar
unknown committed
3415

3416 3417 3418 3419 3420
  # -------------------------------------------------------
  # Init variables that can change between each test case
  # -------------------------------------------------------

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

unknown's avatar
unknown committed
3423 3424
  my $master_restart= run_testcase_need_master_restart($tinfo);
  my $slave_restart= run_testcase_need_slave_restart($tinfo);
unknown's avatar
unknown committed
3425

unknown's avatar
unknown committed
3426 3427
  if ($master_restart or $slave_restart)
  {
3428
    # Can't restart a running server that may be in use
3429
    if ( $opt_extern )
3430 3431
    {
      mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
3432
      $tinfo->{comment}= "Can't restart a running server";
3433 3434
      mtr_report_test_skipped($tinfo);
      return;
3435
    }
unknown's avatar
unknown committed
3436

unknown's avatar
unknown committed
3437 3438
    run_testcase_stop_servers($tinfo, $master_restart, $slave_restart);
  }
3439 3440 3441 3442

  # Write to all log files to indicate start of testcase
  run_testcase_mark_logs("CURRENT_TEST: $tinfo->{name}\n");

unknown's avatar
unknown committed
3443 3444 3445
  my $died= mtr_record_dead_children();
  if ($died or $master_restart or $slave_restart)
  {
3446
    if (run_testcase_start_servers($tinfo))
unknown's avatar
unknown committed
3447
    {
3448 3449 3450
      mtr_report_test_name($tinfo);
      report_failure_and_restart($tinfo);
      return 1;
unknown's avatar
unknown committed
3451 3452 3453
    }
  }

unknown's avatar
unknown committed
3454
  # ----------------------------------------------------------------------
3455 3456
  # If --start-and-exit or --start-dirty given, stop here to let user manually
  # run tests
unknown's avatar
unknown committed
3457
  # ----------------------------------------------------------------------
3458
  if ( $opt_start_and_exit or $opt_start_dirty )
unknown's avatar
unknown committed
3459
  {
3460
    mtr_timer_stop_all($glob_timers);
unknown's avatar
unknown committed
3461 3462 3463 3464
    mtr_report("\nServers started, exiting");
    exit(0);
  }

unknown's avatar
unknown committed
3465
  {
unknown's avatar
unknown committed
3466
    do_before_run_mysqltest($tinfo);
unknown's avatar
unknown committed
3467

unknown's avatar
unknown committed
3468
    my $res= run_mysqltest($tinfo);
unknown's avatar
unknown committed
3469
    mtr_report_test_name($tinfo);
unknown's avatar
unknown committed
3470 3471 3472 3473
    if ( $res == 0 )
    {
      mtr_report_test_passed($tinfo);
    }
unknown's avatar
unknown committed
3474
    elsif ( $res == 62 )
unknown's avatar
unknown committed
3475 3476
    {
      # Testcase itself tell us to skip this one
unknown's avatar
unknown committed
3477 3478

      # Try to get reason from mysqltest.log
3479
      find_testcase_skipped_reason($tinfo);
unknown's avatar
unknown committed
3480 3481
      mtr_report_test_skipped($tinfo);
    }
3482 3483 3484 3485 3486
    elsif ( $res == 63 )
    {
      $tinfo->{'timeout'}= 1;           # Mark as timeout
      report_failure_and_restart($tinfo);
    }
unknown's avatar
unknown committed
3487
    elsif ( $res == 1 )
unknown's avatar
unknown committed
3488
    {
3489
      if ( $opt_force )
unknown's avatar
unknown committed
3490
      {
3491
	analyze_testcase_failure($tinfo);
unknown's avatar
unknown committed
3492
      }
unknown's avatar
unknown committed
3493 3494 3495
      # Test case failure reported by mysqltest
      report_failure_and_restart($tinfo);
    }
unknown's avatar
unknown committed
3496 3497
    else
    {
unknown's avatar
unknown committed
3498 3499 3500
      # mysqltest failed, probably crashed
      $tinfo->{comment}=
	"mysqltest returned unexpected code $res, it has probably crashed";
unknown's avatar
unknown committed
3501 3502
      report_failure_and_restart($tinfo);
    }
unknown's avatar
unknown committed
3503 3504

    do_after_run_mysqltest($tinfo);
unknown's avatar
unknown committed
3505
  }
3506 3507 3508 3509

  # ----------------------------------------------------------------------
  # Stop Instance Manager if we are processing an IM-test case.
  # ----------------------------------------------------------------------
3510
  if ( $tinfo->{'component_id'} eq 'im' and
3511
       !mtr_im_stop($instance_manager, $tinfo->{'name'}) )
3512
  {
3513
    mtr_error("Failed to stop Instance Manager.")
3514
  }
unknown's avatar
unknown committed
3515
}
unknown's avatar
unknown committed
3516

3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529

#
# 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);
3530
    mtr_copy_dir("$data_dir", "$path_snapshot/$name");
3531 3532 3533
  }
}

3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546

#
# 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*") )
  {
3547
    last if $opt_max_save_core > 0 && $num_saved_cores >= $opt_max_save_core;
3548 3549 3550 3551
    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");
3552
    ++$num_saved_cores;
3553 3554 3555
  }
}

unknown's avatar
unknown committed
3556

3557 3558 3559 3560
#
# Restore snapshot of the installed test db(s)
# if the snapshot exists
#
3561 3562
sub restore_installed_db ($) {
  my $test_name= shift;
3563 3564 3565 3566 3567 3568 3569 3570

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

    foreach my $data_dir (@data_dir_lst)
    {
      my $name= basename($data_dir);
3571
      save_files_before_restore($test_name, $data_dir);
3572
      rmtree("$data_dir");
3573
      mtr_copy_dir("$path_snapshot/$name", "$data_dir");
3574
    }
unknown's avatar
unknown committed
3575 3576 3577 3578

    # Remove the ndb_*_fs dirs for all ndbd nodes
    # forcing a clean start of ndb
    foreach my $cluster (@{$clusters})
3579
    {
unknown's avatar
unknown committed
3580 3581 3582 3583
      foreach my $ndbd (@{$cluster->{'ndbds'}})
      {
	rmtree("$ndbd->{'path_fs'}" );
      }
3584 3585 3586 3587
    }
  }
  else
  {
unknown's avatar
unknown committed
3588 3589
    # No snapshot existed
    mtr_error("No snapshot existed");
3590 3591 3592
  }
}

unknown's avatar
unknown committed
3593 3594 3595 3596
sub report_failure_and_restart ($) {
  my $tinfo= shift;

  mtr_report_test_failed($tinfo);
3597
  mtr_show_failed_diff($tinfo->{'result_file'});
unknown's avatar
unknown committed
3598
  print "\n";
3599
  if ( $opt_force )
unknown's avatar
unknown committed
3600
  {
unknown's avatar
unknown committed
3601 3602 3603
    # Stop all servers that are known to be running
    stop_all_servers();

3604
    # Restore the snapshot of the installed test db
3605
    restore_installed_db($tinfo->{'name'});
3606 3607
    print "Resuming Tests\n\n";
    return;
unknown's avatar
unknown committed
3608 3609
  }

3610 3611 3612
  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
3613
  if ( ! $glob_debugger and
3614
       ! $opt_extern and
unknown's avatar
unknown committed
3615
       ! $glob_use_embedded_server )
unknown's avatar
unknown committed
3616
  {
unknown's avatar
unknown committed
3617
    stop_all_servers();
unknown's avatar
unknown committed
3618
  }
3619 3620
  mtr_exit(1);

unknown's avatar
unknown committed
3621 3622 3623 3624 3625 3626 3627 3628 3629
}


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

unknown's avatar
unknown committed
3630

3631 3632 3633 3634 3635
sub do_before_start_master ($) {
  my ($tinfo)= @_;

  my $tname= $tinfo->{'name'};
  my $init_script= $tinfo->{'master_sh'};
unknown's avatar
unknown committed
3636 3637 3638

  # FIXME what about second master.....

3639 3640 3641
  # Don't delete anything if starting dirty
  return if ($opt_start_dirty);

3642
  foreach my $bin ( glob("$opt_vardir/log/master*-bin*") )
unknown's avatar
unknown committed
3643
  {
3644
    unlink($bin);
unknown's avatar
unknown committed
3645 3646
  }

unknown's avatar
unknown committed
3647
  # FIXME only remove the ones that are tied to this master
unknown's avatar
unknown committed
3648
  # Remove old master.info and relay-log.info files
unknown's avatar
unknown committed
3649 3650 3651 3652
  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
3653

unknown's avatar
unknown committed
3654
  # Run master initialization shell script if one exists
unknown's avatar
unknown committed
3655
  if ( $init_script )
unknown's avatar
unknown committed
3656
  {
unknown's avatar
unknown committed
3657 3658 3659 3660
    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
3661
      # mtr_warning("$init_script exited with code $ret");
unknown's avatar
unknown committed
3662
    }
unknown's avatar
unknown committed
3663 3664 3665
  }
}

unknown's avatar
unknown committed
3666

3667 3668
sub do_before_start_slave ($) {
  my ($tinfo)= @_;
unknown's avatar
unknown committed
3669

3670 3671
  my $tname= $tinfo->{'name'};
  my $init_script= $tinfo->{'master_sh'};
unknown's avatar
unknown committed
3672

3673 3674 3675
  # Don't delete anything if starting dirty
  return if ($opt_start_dirty);

3676
  foreach my $bin ( glob("$opt_vardir/log/slave*-bin*") )
unknown's avatar
unknown committed
3677
  {
3678
    unlink($bin);
unknown's avatar
unknown committed
3679 3680
  }

3681 3682 3683
  unlink("$slave->[0]->{'path_myddir'}/master.info");
  unlink("$slave->[0]->{'path_myddir'}/relay-log.info");

unknown's avatar
unknown committed
3684
  # Run slave initialization shell script if one exists
unknown's avatar
unknown committed
3685
  if ( $init_script )
unknown's avatar
unknown committed
3686
  {
unknown's avatar
unknown committed
3687 3688 3689 3690
    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
3691
      # mtr_warning("$init_script exited with code $ret");
unknown's avatar
unknown committed
3692
    }
unknown's avatar
unknown committed
3693 3694
  }

unknown's avatar
unknown committed
3695 3696 3697 3698
  foreach my $bin ( glob("$slave->[0]->{'path_myddir'}/log.*") )
  {
    unlink($bin);
  }
unknown's avatar
unknown committed
3699 3700
}

unknown's avatar
unknown committed
3701

3702
sub mysqld_arguments ($$$$) {
unknown's avatar
unknown committed
3703
  my $args=              shift;
3704
  my $mysqld=            shift;
unknown's avatar
unknown committed
3705 3706 3707
  my $extra_opt=         shift;
  my $slave_master_info= shift;

3708
  my $idx= $mysqld->{'idx'};
unknown's avatar
unknown committed
3709
  my $sidx= "";                 # Index as string, 0 is empty string
3710
  if ( $idx> 0 )
unknown's avatar
unknown committed
3711
  {
3712
    $sidx= $idx;
unknown's avatar
unknown committed
3713 3714 3715 3716 3717 3718 3719 3720
  }

  my $prefix= "";               # If mysqltest server arg
  if ( $glob_use_embedded_server )
  {
    $prefix= "--server-arg=";
  }

3721 3722
  mtr_add_arg($args, "%s--no-defaults", $prefix);

3723
  mtr_add_arg($args, "%s--console", $prefix);
unknown's avatar
unknown committed
3724 3725
  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
3726

3727 3728
  if ( $mysql_version_id >= 50036)
  {
3729 3730 3731 3732 3733 3734 3735 3736 3737 3738
    # By default, prevent the started mysqld to access files outside of vardir
    my $secure_file_dir= $opt_vardir;
    if ( $opt_suite ne "main" )
    {
      # When running a suite other than default allow the mysqld
      # access to subdirs of mysql-test/ in order to make it possible
      # to "load data" from the suites data/ directory.
      $secure_file_dir= $glob_mysql_test_dir;
    }
    mtr_add_arg($args, "%s--secure-file-priv=%s", $prefix, $secure_file_dir);
3739 3740
  }

unknown's avatar
unknown committed
3741 3742 3743 3744 3745
  if ( $mysql_version_id >= 50000 )
  {
    mtr_add_arg($args, "%s--log-bin-trust-function-creators", $prefix);
  }

unknown's avatar
unknown committed
3746 3747 3748 3749
  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
3750
  if ( $opt_valgrind_mysqld )
unknown's avatar
unknown committed
3751 3752
  {
    mtr_add_arg($args, "%s--skip-safemalloc", $prefix);
3753 3754 3755 3756 3757

    if ( $mysql_version_id < 50100 )
    {
      mtr_add_arg($args, "%s--skip-bdb", $prefix);
    }
unknown's avatar
unknown committed
3758 3759
  }

3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778
  mtr_add_arg($args, "%s--pid-file=%s", $prefix,
	      $mysqld->{'path_pid'});

  mtr_add_arg($args, "%s--port=%d", $prefix,
                $mysqld->{'port'});

  mtr_add_arg($args, "%s--socket=%s", $prefix,
	      $mysqld->{'path_sock'});

  mtr_add_arg($args, "%s--datadir=%s", $prefix,
	      $mysqld->{'path_myddir'});


  if ( $mysql_version_id >= 50106 )
  {
    # Turn on logging to bothe tables and file
    mtr_add_arg($args, "%s--log-output=table,file", $prefix);
  }

3779 3780 3781 3782
  my $log_base_path= "$opt_vardir/log/$mysqld->{'type'}$sidx";
  mtr_add_arg($args, "%s--log=%s.log", $prefix, $log_base_path);
  mtr_add_arg($args,
	      "%s--log-slow-queries=%s-slow.log", $prefix, $log_base_path);
3783

3784
  # Check if "extra_opt" contains --skip-log-bin
3785
  my $skip_binlog= grep(/^--skip-log-bin/, @$extra_opt);
unknown's avatar
unknown committed
3786

3787
  if ( $mysqld->{'type'} eq 'master' )
unknown's avatar
unknown committed
3788
  {
3789
    if (! ($opt_skip_master_binlog || $skip_binlog) )
unknown's avatar
unknown committed
3790 3791 3792 3793
    {
      mtr_add_arg($args, "%s--log-bin=%s/log/master-bin%s", $prefix,
                  $opt_vardir, $sidx);
    }
3794 3795 3796 3797 3798 3799 3800

    mtr_add_arg($args, "%s--server-id=%d", $prefix,
	       $idx > 0 ? $idx + 101 : 1);

    mtr_add_arg($args, "%s--innodb_data_file_path=ibdata1:10M:autoextend",
		$prefix);

unknown's avatar
unknown committed
3801
    mtr_add_arg($args, "%s--local-infile", $prefix);
unknown's avatar
unknown committed
3802

unknown's avatar
unknown committed
3803
    if ( $idx > 0 or !$use_innodb)
unknown's avatar
unknown committed
3804 3805 3806 3807
    {
      mtr_add_arg($args, "%s--skip-innodb", $prefix);
    }

3808
    my $cluster= $clusters->[$mysqld->{'cluster'}];
unknown's avatar
unknown committed
3809 3810
    if ( $opt_skip_ndbcluster ||
	 !$cluster->{'pid'})
unknown's avatar
unknown committed
3811 3812 3813
    {
      mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
    }
3814 3815 3816 3817
    else
    {
      mtr_add_arg($args, "%s--ndbcluster", $prefix);
      mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
unknown's avatar
unknown committed
3818
		  $cluster->{'connect_string'});
3819
      if ( $mysql_version_id >= 50100 )
3820 3821 3822
      {
	mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
      }
3823
    }
unknown's avatar
unknown committed
3824
  }
3825
  else
unknown's avatar
unknown committed
3826
  {
3827 3828
    mtr_error("unknown mysqld type")
      unless $mysqld->{'type'} eq 'slave';
unknown's avatar
unknown committed
3829 3830

    mtr_add_arg($args, "%s--init-rpl-role=slave", $prefix);
3831
    if (! ( $opt_skip_slave_binlog || $skip_binlog ))
unknown's avatar
unknown committed
3832 3833 3834 3835 3836 3837
    {
      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
3838
    mtr_add_arg($args, "%s--master-retry-count=10", $prefix);
3839

3840 3841
    mtr_add_arg($args, "%s--relay-log=%s/log/slave%s-relay-bin", $prefix,
                $opt_vardir, $sidx);
unknown's avatar
unknown committed
3842 3843
    mtr_add_arg($args, "%s--report-host=127.0.0.1", $prefix);
    mtr_add_arg($args, "%s--report-port=%d", $prefix,
3844
                $mysqld->{'port'});
unknown's avatar
unknown committed
3845 3846 3847
    mtr_add_arg($args, "%s--report-user=root", $prefix);
    mtr_add_arg($args, "%s--skip-innodb", $prefix);
    mtr_add_arg($args, "%s--skip-slave-start", $prefix);
3848 3849 3850 3851

    # 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.
3852
    my $slave_load_path= "../tmp";
unknown's avatar
unknown committed
3853
    mtr_add_arg($args, "%s--slave-load-tmpdir=%s", $prefix,
3854
                $slave_load_path);
unknown's avatar
unknown committed
3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870
    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
3871
                  $master->[0]->{'port'}); # First master
3872 3873 3874

      my $slave_server_id=  2 + $idx;
      my $slave_rpl_rank= $slave_server_id;
unknown's avatar
unknown committed
3875 3876 3877
      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
3878 3879

    if ( $opt_skip_ndbcluster_slave ||
3880 3881
         $mysqld->{'cluster'} == -1 ||
	 !$clusters->[$mysqld->{'cluster'}]->{'pid'} )
unknown's avatar
unknown committed
3882 3883 3884 3885 3886 3887 3888
    {
      mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
    }
    else
    {
      mtr_add_arg($args, "%s--ndbcluster", $prefix);
      mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
3889 3890
		  $clusters->[$mysqld->{'cluster'}]->{'connect_string'});

3891
      if ( $mysql_version_id >= 50100 )
3892 3893 3894
      {
	mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
      }
unknown's avatar
unknown committed
3895
    }
3896

unknown's avatar
unknown committed
3897 3898 3899 3900
  } # end slave

  if ( $opt_debug )
  {
3901 3902
    mtr_add_arg($args, "%s--debug=d:t:i:A,%s/log/%s%s.trace",
		$prefix, $path_vardir_trace, $mysqld->{'type'}, $sidx);
unknown's avatar
unknown committed
3903 3904 3905 3906 3907 3908
  }

  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);

3909
  if ( $opt_ssl_supported )
unknown's avatar
unknown committed
3910
  {
3911 3912 3913 3914 3915 3916
    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
3917 3918 3919 3920 3921 3922 3923
  }

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

unknown's avatar
unknown committed
3924 3925
  # Indicate to "mysqld" it will be debugged in debugger
  if ( $glob_debugger )
unknown's avatar
unknown committed
3926 3927 3928 3929
  {
    mtr_add_arg($args, "%s--gdb", $prefix);
  }

unknown's avatar
unknown committed
3930 3931
  my $found_skip_core= 0;
  foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt )
unknown's avatar
unknown committed
3932
  {
3933
    # Allow --skip-core-file to be set in <testname>-[master|slave].opt file
unknown's avatar
unknown committed
3934
    if ($arg eq "--skip-core-file")
unknown's avatar
unknown committed
3935
    {
unknown's avatar
unknown committed
3936
      $found_skip_core= 1;
unknown's avatar
unknown committed
3937
    }
3938 3939 3940 3941
    elsif ($skip_binlog and mtr_match_prefix($arg, "--binlog-format"))
    {
      ; # Dont add --binlog-format when running without binlog
    }
unknown's avatar
unknown committed
3942
    else
unknown's avatar
unknown committed
3943
    {
unknown's avatar
unknown committed
3944
      mtr_add_arg($args, "%s%s", $prefix, $arg);
unknown's avatar
unknown committed
3945 3946
    }
  }
unknown's avatar
unknown committed
3947
  if ( !$found_skip_core )
unknown's avatar
unknown committed
3948
  {
unknown's avatar
unknown committed
3949
    mtr_add_arg($args, "%s%s", $prefix, "--core-file");
unknown's avatar
unknown committed
3950 3951 3952 3953 3954 3955 3956
  }

  if ( $opt_bench )
  {
    mtr_add_arg($args, "%s--rpl-recovery-rank=1", $prefix);
    mtr_add_arg($args, "%s--init-rpl-role=master", $prefix);
  }
3957
  elsif ( $mysqld->{'type'} eq 'master' )
unknown's avatar
unknown committed
3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971
  {
    mtr_add_arg($args, "%s--open-files-limit=1024", $prefix);
  }

  return $args;
}


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

unknown's avatar
unknown committed
3972 3973
sub mysqld_start ($$$) {
  my $mysqld=            shift;
unknown's avatar
unknown committed
3974 3975
  my $extra_opt=         shift;
  my $slave_master_info= shift;
unknown's avatar
unknown committed
3976 3977 3978

  my $args;                             # Arg vector
  my $exe;
unknown's avatar
unknown committed
3979 3980 3981 3982 3983
  my $pid= -1;
  my $wait_for_pid_file= 1;

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

3985 3986 3987
  mtr_error("Internal error: mysqld should never be started for embedded")
    if $glob_use_embedded_server;

unknown's avatar
unknown committed
3988
  if ( $type eq 'master' )
unknown's avatar
unknown committed
3989
  {
unknown's avatar
unknown committed
3990 3991 3992 3993 3994
    $exe= $exe_master_mysqld;
  }
  elsif ( $type eq 'slave' )
  {
    $exe= $exe_slave_mysqld;
unknown's avatar
unknown committed
3995 3996 3997
  }
  else
  {
unknown's avatar
unknown committed
3998 3999 4000 4001 4002 4003 4004 4005 4006 4007
    mtr_error("Unknown 'type' \"$type\" passed to mysqld_start");
  }

  mtr_init_args(\$args);

  if ( $opt_valgrind_mysqld )
  {
    valgrind_arguments($args, \$exe);
  }

4008
  mysqld_arguments($args,$mysqld,$extra_opt,$slave_master_info);
unknown's avatar
unknown committed
4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154

  if ( $opt_gdb || $opt_manual_gdb)
  {
    gdb_arguments(\$args, \$exe, "$type"."_$idx");
  }
  elsif ( $opt_ddd || $opt_manual_ddd )
  {
    ddd_arguments(\$args, \$exe, "$type"."_$idx");
  }
  elsif ( $opt_debugger )
  {
    debugger_arguments(\$args, \$exe, "$type"."_$idx");
  }
  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;
  }
  else
  {
    # Default to not wait until pid file has been created
    $wait_for_pid_file= 0;
  }

  if ( defined $exe )
  {
    $pid= mtr_spawn($exe, $args, "",
		    $mysqld->{'path_myerr'},
		    $mysqld->{'path_myerr'},
		    "",
		    { append_log_file => 1 });
  }


  if ( $wait_for_pid_file && !sleep_until_file_created($mysqld->{'path_pid'},
						       $mysqld->{'start_timeout'},
						       $pid))
  {

    mtr_error("Failed to start mysqld $mysqld->{'type'}");
  }


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

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

  mtr_verbose("mysqld pid: $pid");
  return $pid;
}


sub stop_all_servers () {

  print  "Stopping All Servers\n";

  if ( ! $opt_skip_im )
  {
    print  "Shutting-down Instance Manager\n";
    unless (mtr_im_stop($instance_manager, "stop_all_servers"))
    {
      mtr_error("Failed to stop Instance Manager.")
    }
  }

  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'},
		       pidfile  => $cluster->{'path_pid'}
		      });

      $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'});
  }
}


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

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

unknown's avatar
unknown committed
4155 4156 4157 4158 4159 4160
  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
4161 4162
  {
    $do_restart= 1;           # Always restart if script to run
4163 4164 4165 4166 4167 4168
    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
4169 4170
  }
  elsif ( ! $opt_skip_ndbcluster and
4171
	  !$tinfo->{'ndb_test'} and
unknown's avatar
unknown committed
4172 4173 4174
	  $clusters->[0]->{'pid'} != 0 )
  {
    $do_restart= 1;           # Restart without cluster
4175
    mtr_verbose("Restart master: Test does not need cluster");
unknown's avatar
unknown committed
4176 4177
  }
  elsif ( ! $opt_skip_ndbcluster and
4178
	  $tinfo->{'ndb_test'} and
unknown's avatar
unknown committed
4179 4180 4181
	  $clusters->[0]->{'pid'} == 0 )
  {
    $do_restart= 1;           # Restart with cluster
4182
    mtr_verbose("Restart master: Test need cluster");
unknown's avatar
unknown committed
4183
  }
unknown's avatar
unknown committed
4184 4185 4186
  elsif( $tinfo->{'component_id'} eq 'im' )
  {
    $do_restart= 1;
4187
    mtr_verbose("Restart master: Always restart for im tests");
unknown's avatar
unknown committed
4188
  }
4189 4190 4191
  elsif ( $master->[0]->{'running_master_options'} and
	  $master->[0]->{'running_master_options'}->{'timezone'} ne
	  $tinfo->{'timezone'})
unknown's avatar
unknown committed
4192 4193
  {
    $do_restart= 1;
4194
    mtr_verbose("Restart master: Different timezone");
unknown's avatar
unknown committed
4195 4196 4197 4198 4199 4200 4201
  }
  # Check that running master was started with same options
  # as the current test requires
  elsif (! mtr_same_opts($master->[0]->{'start_opts'},
                         $tinfo->{'master_opt'}) )
  {
    $do_restart= 1;
4202
    mtr_verbose("Restart master: running with different options '" .
unknown's avatar
unknown committed
4203 4204 4205
	       join(" ", @{$tinfo->{'master_opt'}}) . "' != '" .
		join(" ", @{$master->[0]->{'start_opts'}}) . "'" );
  }
4206 4207
  elsif( ! $master->[0]->{'pid'} )
  {
4208 4209 4210 4211 4212 4213 4214 4215 4216 4217
    if ( $opt_extern )
    {
      $do_restart= 0;
      mtr_verbose("No restart: using extern master");
    }
    else
    {
      $do_restart= 1;
      mtr_verbose("Restart master: master is not started");
    }
4218
  }
unknown's avatar
unknown committed
4219 4220 4221 4222 4223 4224 4225 4226 4227 4228
  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
4229
  if ( $glob_use_embedded_server )
unknown's avatar
unknown committed
4230
  {
unknown's avatar
unknown committed
4231 4232
    mtr_verbose("Never start or restart for embedded server");
    return $do_slave_restart;
unknown's avatar
unknown committed
4233
  }
unknown's avatar
unknown committed
4234
  elsif ( $max_slave_num == 0)
unknown's avatar
unknown committed
4235
  {
4236
    mtr_verbose("Skip slave restart: No testcase use slaves");
unknown's avatar
unknown committed
4237
  }
4238 4239
  else
  {
unknown's avatar
unknown committed
4240

4241 4242 4243 4244 4245 4246 4247 4248 4249 4250
    # 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
4251

4252 4253
    if ($any_slave_started)
    {
4254
      mtr_verbose("Restart slave: Slave is started, always restart");
4255 4256 4257 4258
      $do_slave_restart= 1;
    }
    elsif ( $tinfo->{'slave_num'} )
    {
4259
      mtr_verbose("Restart slave: Test need slave");
4260 4261
      $do_slave_restart= 1;
    }
unknown's avatar
unknown committed
4262 4263
  }

unknown's avatar
unknown committed
4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284
  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)= @_;
  my $pid;
  my %admin_pids; # hash of admin processes that requests shutdown
  my @kill_pids;  # list of processes to shutdown/kill

4285
  # Remember if we restarted for this test case (count restarts)
unknown's avatar
unknown committed
4286 4287 4288
  $tinfo->{'restarted'}= $do_restart;

  if ( $do_restart )
unknown's avatar
unknown committed
4289
  {
4290
    delete $master->[0]->{'running_master_options'}; # Forget history
unknown's avatar
unknown committed
4291

unknown's avatar
unknown committed
4292 4293
    # Start shutdown of all started masters
    foreach my $mysqld (@{$master})
unknown's avatar
unknown committed
4294
    {
unknown's avatar
unknown committed
4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309
      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
      }
unknown's avatar
unknown committed
4310 4311
    }

unknown's avatar
unknown committed
4312 4313 4314
    # Start shutdown of master cluster
    my $cluster= $clusters->[0];
    if ( $cluster->{'pid'} )
unknown's avatar
unknown committed
4315
    {
unknown's avatar
unknown committed
4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333
      $pid= mtr_ndbmgm_start($cluster, "shutdown");
      $admin_pids{$pid}= 1;

      push(@kill_pids,{
		       pid      => $cluster->{'pid'},
		       pidfile  => $cluster->{'path_pid'}
		      });

      $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
4334 4335 4336
    }
  }

unknown's avatar
unknown committed
4337
  if ( $do_restart || $do_slave_restart )
unknown's avatar
unknown committed
4338 4339
  {

4340
    delete $slave->[0]->{'running_slave_options'}; # Forget history
unknown's avatar
unknown committed
4341

unknown's avatar
unknown committed
4342 4343 4344 4345 4346 4347
    # Start shutdown of all started slaves
    foreach my $mysqld (@{$slave})
    {
      if ( $mysqld->{'pid'} )
      {
	$pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);
unknown's avatar
unknown committed
4348

unknown's avatar
unknown committed
4349
	$admin_pids{$pid}= 1;
unknown's avatar
unknown committed
4350

unknown's avatar
unknown committed
4351 4352 4353 4354 4355 4356
	push(@kill_pids,{
			 pid      => $mysqld->{'pid'},
			 pidfile  => $mysqld->{'path_pid'},
			 sockfile => $mysqld->{'path_sock'},
			 port     => $mysqld->{'port'},
			});
unknown's avatar
unknown committed
4357

4358

unknown's avatar
unknown committed
4359 4360 4361
	$mysqld->{'pid'}= 0; # Assume we are done with it
      }
    }
unknown's avatar
unknown committed
4362

unknown's avatar
unknown committed
4363 4364 4365 4366 4367
    # Start shutdown of slave cluster
    my $cluster= $clusters->[1];
    if ( $cluster->{'pid'} )
    {
      $pid= mtr_ndbmgm_start($cluster, "shutdown");
unknown's avatar
unknown committed
4368

unknown's avatar
unknown committed
4369
      $admin_pids{$pid}= 1;
unknown's avatar
unknown committed
4370

unknown's avatar
unknown committed
4371 4372 4373 4374
      push(@kill_pids,{
		       pid      => $cluster->{'pid'},
		       pidfile  => $cluster->{'path_pid'}
		      });
unknown's avatar
unknown committed
4375

unknown's avatar
unknown committed
4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386
      $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
4387 4388
  }

unknown's avatar
unknown committed
4389 4390 4391 4392
  # ----------------------------------------------------------------------
  # Shutdown has now been started and lists for the shutdown processes
  # and the processes to be killed has been created
  # ----------------------------------------------------------------------
unknown's avatar
unknown committed
4393

unknown's avatar
unknown committed
4394 4395
  # Wait blocking until all shutdown processes has completed
  mtr_wait_blocking(\%admin_pids);
4396

unknown's avatar
unknown committed
4397

unknown's avatar
unknown committed
4398 4399 4400 4401
  # Make sure that process has shutdown else try to kill them
  mtr_check_stop_servers(\@kill_pids);

  foreach my $mysqld (@{$master}, @{$slave})
4402
  {
unknown's avatar
unknown committed
4403
    if ( ! $mysqld->{'pid'} )
unknown's avatar
unknown committed
4404
    {
unknown's avatar
unknown committed
4405 4406
      # Remove ndbcluster tables if server is stopped
      rm_ndbcluster_tables($mysqld->{'path_myddir'});
unknown's avatar
unknown committed
4407
    }
4408
  }
unknown's avatar
unknown committed
4409
}
4410 4411


4412 4413 4414
#
# run_testcase_start_servers
#
4415
# Start the servers needed by this test case
4416 4417 4418 4419 4420 4421
#
# RETURN
#  0 OK
#  1 Start failed
#

unknown's avatar
unknown committed
4422 4423 4424 4425 4426
sub run_testcase_start_servers($) {
  my $tinfo= shift;
  my $tname= $tinfo->{'name'};

  if ( $tinfo->{'component_id'} eq 'mysqld' )
unknown's avatar
unknown committed
4427
  {
unknown's avatar
unknown committed
4428 4429 4430
    if ( ! $opt_skip_ndbcluster and
	 !$clusters->[0]->{'pid'} and
	 $tinfo->{'ndb_test'} )
unknown's avatar
unknown committed
4431
    {
unknown's avatar
unknown committed
4432 4433
      # Test need cluster, cluster is not started, start it
      ndbcluster_start($clusters->[0], "");
unknown's avatar
unknown committed
4434 4435
    }

unknown's avatar
unknown committed
4436
    if ( !$master->[0]->{'pid'} )
unknown's avatar
unknown committed
4437
    {
unknown's avatar
unknown committed
4438
      # Master mysqld is not started
4439
      do_before_start_master($tinfo);
unknown's avatar
unknown committed
4440

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

    }

4445 4446
    if ( $clusters->[0]->{'pid'} and ! $master->[1]->{'pid'} and
	 $tinfo->{'master_num'} > 1 )
unknown's avatar
unknown committed
4447 4448
    {
      # Test needs cluster, start an extra mysqld connected to cluster
unknown's avatar
unknown committed
4449

4450
      if ( $mysql_version_id >= 50100 )
unknown's avatar
unknown committed
4451
      {
4452 4453 4454 4455
	# 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(
unknown's avatar
unknown committed
4456
		  "$master->[0]->{'path_myddir'}/mysql/apply_status.ndb",
4457 4458 4459
					$master->[0]->{'start_timeout'},
					$master->[0]->{'pid'}))
	{
unknown's avatar
unknown committed
4460

unknown's avatar
unknown committed
4461
	  $tinfo->{'comment'}= "Failed to create 'mysql/apply_status' table";
4462
	  return 1;
4463
	}
unknown's avatar
unknown committed
4464 4465 4466
      }
      mysqld_start($master->[1],$tinfo->{'master_opt'},[]);
    }
4467

4468 4469
    # Save this test case information, so next can examine it
    $master->[0]->{'running_master_options'}= $tinfo;
unknown's avatar
unknown committed
4470
  }
unknown's avatar
unknown committed
4471
  elsif ( ! $opt_skip_im and $tinfo->{'component_id'} eq 'im' )
4472
  {
unknown's avatar
unknown committed
4473 4474 4475 4476 4477 4478 4479
    # 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);

4480
    if  ( ! mtr_im_start($instance_manager, $tinfo->{im_opts}) )
unknown's avatar
unknown committed
4481
    {
4482 4483
      $tinfo->{'comment'}= "Failed to start Instance Manager. ";
      return 1;
unknown's avatar
unknown committed
4484
    }
4485
  }
unknown's avatar
unknown committed
4486

unknown's avatar
unknown committed
4487 4488 4489 4490 4491 4492
  # ----------------------------------------------------------------------
  # Start slaves - if needed
  # ----------------------------------------------------------------------
  if ( $tinfo->{'slave_num'} )
  {
    restore_slave_databases($tinfo->{'slave_num'});
unknown's avatar
unknown committed
4493

4494
    do_before_start_slave($tinfo);
unknown's avatar
unknown committed
4495

unknown's avatar
unknown committed
4496 4497 4498
    if ( ! $opt_skip_ndbcluster_slave and
	 !$clusters->[1]->{'pid'} and
	 $tinfo->{'ndb_test'} )
unknown's avatar
unknown committed
4499
    {
unknown's avatar
unknown committed
4500 4501
      # Test need slave cluster, cluster is not started, start it
      ndbcluster_start($clusters->[1], "");
unknown's avatar
unknown committed
4502 4503
    }

unknown's avatar
unknown committed
4504
    for ( my $idx= 0; $idx <  $tinfo->{'slave_num'}; $idx++ )
unknown's avatar
unknown committed
4505
    {
unknown's avatar
unknown committed
4506 4507 4508 4509
      if ( ! $slave->[$idx]->{'pid'} )
      {
	mysqld_start($slave->[$idx],$tinfo->{'slave_opt'},
		     $tinfo->{'slave_mi'});
unknown's avatar
unknown committed
4510

unknown's avatar
unknown committed
4511
      }
unknown's avatar
unknown committed
4512 4513
    }

4514 4515
    # Save this test case information, so next can examine it
    $slave->[0]->{'running_slave_options'}= $tinfo;
unknown's avatar
unknown committed
4516 4517
  }

unknown's avatar
unknown committed
4518 4519
  # Wait for clusters to start
  foreach my $cluster (@{$clusters})
4520 4521
  {

unknown's avatar
unknown committed
4522
    next if !$cluster->{'pid'};
unknown's avatar
unknown committed
4523

unknown's avatar
unknown committed
4524 4525 4526
    if (ndbcluster_wait_started($cluster, ""))
    {
      # failed to start
4527 4528
      $tinfo->{'comment'}= "Start of $cluster->{'name'} cluster failed";
      return 1;
unknown's avatar
unknown committed
4529
    }
unknown's avatar
unknown committed
4530
  }
unknown's avatar
unknown committed
4531

unknown's avatar
unknown committed
4532 4533
  # Wait for mysqld's to start
  foreach my $mysqld (@{$master},@{$slave})
unknown's avatar
unknown committed
4534
  {
unknown's avatar
unknown committed
4535

unknown's avatar
unknown committed
4536
    next if !$mysqld->{'pid'};
unknown's avatar
unknown committed
4537

unknown's avatar
unknown committed
4538
    if (mysqld_wait_started($mysqld))
unknown's avatar
unknown committed
4539
    {
4540 4541 4542 4543
      # failed to start
      $tinfo->{'comment'}=
	"Failed to start $mysqld->{'type'} mysqld $mysqld->{'idx'}";
      return 1;
unknown's avatar
unknown committed
4544 4545
    }
  }
4546
  return 0;
unknown's avatar
unknown committed
4547 4548
}

4549 4550 4551 4552 4553
#
# 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!
#
4554 4555 4556 4557
# RETURN VALUE
#  0 OK
#  1 Check failed
#
unknown's avatar
unknown committed
4558
sub run_check_testcase ($$) {
4559 4560

  my $mode=     shift;
unknown's avatar
unknown committed
4561
  my $mysqld=   shift;
unknown's avatar
unknown committed
4562

unknown's avatar
unknown committed
4563
  my $name= "check-" . $mysqld->{'type'} . $mysqld->{'idx'};
4564 4565 4566 4567 4568 4569 4570 4571

  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);
4572
  mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
4573

unknown's avatar
unknown committed
4574 4575
  mtr_add_arg($args, "--socket=%s", $mysqld->{'path_sock'});
  mtr_add_arg($args, "--port=%d", $mysqld->{'port'});
4576 4577 4578 4579 4580
  mtr_add_arg($args, "--database=test");
  mtr_add_arg($args, "--user=%s", $opt_user);
  mtr_add_arg($args, "--password=");

  mtr_add_arg($args, "-R");
unknown's avatar
unknown committed
4581
  mtr_add_arg($args, "$opt_vardir/tmp/$name.result");
4582 4583 4584 4585 4586 4587 4588 4589 4590

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

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

4591
  if ( $res == 1  and $mode eq "after")
4592 4593
  {
    mtr_run("diff",["-u",
unknown's avatar
unknown committed
4594 4595
		    "$opt_vardir/tmp/$name.result",
		    "$opt_vardir/tmp/$name.reject"],
4596 4597 4598 4599 4600 4601
	    "", "", "", "");
  }
  elsif ( $res )
  {
    mtr_error("Could not execute 'check-testcase' $mode testcase");
  }
4602
  return $res;
4603 4604
}

4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641
##############################################################################
#
#  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
4642

4643

unknown's avatar
unknown committed
4644 4645
sub run_mysqltest ($) {
  my ($tinfo)= @_;
unknown's avatar
unknown committed
4646 4647
  my $exe= $exe_mysqltest;
  my $args;
unknown's avatar
unknown committed
4648 4649 4650 4651 4652 4653 4654

  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);
4655
  mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
4656

4657 4658 4659 4660
  # Log line number and time  for each line in .test file
  mtr_add_arg($args, "--mark-progress")
    if $opt_mark_progress;

4661 4662 4663 4664 4665 4666 4667 4668 4669
  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
4670 4671
    mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
    mtr_add_arg($args, "--port=%d", $master->[0]->{'port'});
4672 4673 4674 4675
    mtr_add_arg($args, "--database=test");
    mtr_add_arg($args, "--user=%s", $opt_user);
    mtr_add_arg($args, "--password=");
  }
unknown's avatar
unknown committed
4676

unknown's avatar
unknown committed
4677 4678 4679 4680 4681
  if ( $opt_ps_protocol )
  {
    mtr_add_arg($args, "--ps-protocol");
  }

4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696
  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
4697 4698 4699 4700
  if ( $opt_strace_client )
  {
    $exe=  "strace";            # FIXME there are ktrace, ....
    mtr_add_arg($args, "-o");
4701
    mtr_add_arg($args, "%s/log/mysqltest.strace", $opt_vardir);
unknown's avatar
unknown committed
4702 4703 4704
    mtr_add_arg($args, "$exe_mysqltest");
  }

unknown's avatar
unknown committed
4705 4706
  if ( $opt_timer )
  {
4707
    mtr_add_arg($args, "--timer-file=%s/log/timer", $opt_vardir);
unknown's avatar
unknown committed
4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721
  }

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

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

  if ( $opt_debug )
  {
unknown's avatar
unknown committed
4722 4723
    mtr_add_arg($args, "--debug=d:t:A,%s/log/mysqltest.trace",
		$path_vardir_trace);
unknown's avatar
unknown committed
4724 4725
  }

4726
  if ( $opt_ssl_supported )
unknown's avatar
unknown committed
4727
  {
4728
    mtr_add_arg($args, "--ssl-ca=%s/std_data/cacert.pem",
4729
	        $glob_mysql_test_dir);
4730
    mtr_add_arg($args, "--ssl-cert=%s/std_data/client-cert.pem",
4731
	        $glob_mysql_test_dir);
4732
    mtr_add_arg($args, "--ssl-key=%s/std_data/client-key.pem",
4733 4734 4735 4736 4737
	        $glob_mysql_test_dir);
  }

  if ( $opt_ssl )
  {
unknown's avatar
unknown committed
4738
    # Turn on SSL for _all_ test cases if option --ssl was used
4739
    mtr_add_arg($args, "--ssl");
4740 4741 4742
  }
  elsif ( $opt_ssl_supported )
  {
4743
    mtr_add_arg($args, "--skip-ssl");
unknown's avatar
unknown committed
4744 4745
  }

unknown's avatar
unknown committed
4746 4747 4748 4749
  # ----------------------------------------------------------------------
  # If embedded server, we create server args to give mysqltest to pass on
  # ----------------------------------------------------------------------

unknown's avatar
unknown committed
4750 4751
  if ( $glob_use_embedded_server )
  {
4752
    mysqld_arguments($args,$master->[0],$tinfo->{'master_opt'},[]);
unknown's avatar
unknown committed
4753 4754
  }

4755 4756 4757
  # ----------------------------------------------------------------------
  # export MYSQL_TEST variable containing <path>/mysqltest <args>
  # ----------------------------------------------------------------------
4758 4759
  $ENV{'MYSQL_TEST'}=
    mtr_native_path($exe_mysqltest) . " " . join(" ", @$args);
4760

4761
  # ----------------------------------------------------------------------
4762
  # Add arguments that should not go into the MYSQL_TEST env var
4763 4764
  # ----------------------------------------------------------------------

4765
  if ( $opt_valgrind_mysqltest )
4766 4767 4768 4769 4770 4771 4772 4773 4774 4775
  {
    # 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
4776 4777 4778
  mtr_add_arg($args, "--test-file");
  mtr_add_arg($args, $tinfo->{'path'});

4779 4780 4781 4782
  if ( defined $tinfo->{'result_file'} ) {
    mtr_add_arg($args, "--result-file");
    mtr_add_arg($args, $tinfo->{'result_file'});
  }
4783 4784 4785 4786 4787 4788

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

unknown's avatar
unknown committed
4789 4790 4791 4792 4793 4794 4795 4796
  if ( $opt_client_gdb )
  {
    gdb_arguments(\$args, \$exe, "client");
  }
  elsif ( $opt_client_ddd )
  {
    ddd_arguments(\$args, \$exe, "client");
  }
4797 4798 4799 4800
  elsif ( $opt_client_debugger )
  {
    debugger_arguments(\$args, \$exe, "client");
  }
unknown's avatar
unknown committed
4801

4802 4803
  if ( $opt_check_testcases )
  {
unknown's avatar
unknown committed
4804 4805 4806 4807 4808 4809 4810
    foreach my $mysqld (@{$master}, @{$slave})
    {
      if ($mysqld->{'pid'})
      {
	run_check_testcase("before", $mysqld);
      }
    }
4811 4812
  }

4813
  my $res = mtr_run_test($exe,$args,"","",$path_timefile,"");
4814 4815 4816

  if ( $opt_check_testcases )
  {
unknown's avatar
unknown committed
4817 4818 4819 4820
    foreach my $mysqld (@{$master}, @{$slave})
    {
      if ($mysqld->{'pid'})
      {
4821 4822 4823 4824 4825
	if (run_check_testcase("after", $mysqld))
	{
	  # Check failed, mark the test case with that info
	  $tinfo->{'check_testcase_failed'}= 1;
	}
unknown's avatar
unknown committed
4826 4827
      }
    }
4828
  }
4829

4830
  return $res;
4831

unknown's avatar
unknown committed
4832
}
unknown's avatar
unknown committed
4833

unknown's avatar
unknown committed
4834

unknown's avatar
unknown committed
4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846
#
# 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";

4847 4848 4849
  # Remove the old gdbinit file
  unlink($gdb_init_file);

unknown's avatar
unknown committed
4850 4851 4852 4853
  if ( $type eq "client" )
  {
    # write init file for client
    mtr_tofile($gdb_init_file,
4854 4855
	       "set args $str\n" .
	       "break main\n");
unknown's avatar
unknown committed
4856 4857 4858 4859 4860 4861 4862 4863 4864 4865
  }
  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" .
4866 4867 4868 4869 4870
	       "run");
  }

  if ( $opt_manual_gdb )
  {
4871
     print "\nTo start gdb for $type, type in another window:\n";
unknown's avatar
unknown committed
4872
     print "gdb -cd $glob_mysql_test_dir -x $gdb_init_file $$exe\n";
4873 4874 4875 4876

     # Indicate the exe should not be started
     $$exe= undef;
     return;
unknown's avatar
unknown committed
4877 4878 4879 4880 4881 4882
  }

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

4884
  if ( $exe_libtool )
unknown's avatar
unknown committed
4885
  {
4886
    mtr_add_arg($$args, $exe_libtool);
unknown's avatar
unknown committed
4887 4888 4889 4890 4891 4892 4893 4894 4895
    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
4896
}
unknown's avatar
unknown committed
4897

unknown's avatar
unknown committed
4898

unknown's avatar
unknown committed
4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909
#
# 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
4910

4911 4912 4913
  # Remove the old gdbinit file
  unlink($gdb_init_file);

unknown's avatar
unknown committed
4914 4915 4916 4917 4918
  if ( $type eq "client" )
  {
    # write init file for client
    mtr_tofile($gdb_init_file,
	       "set args $str\n" .
4919
	       "break main\n");
unknown's avatar
unknown committed
4920 4921 4922 4923 4924 4925 4926 4927 4928 4929
  }
  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" .
4930
	       "end");
4931 4932 4933 4934
  }

  if ( $opt_manual_ddd )
  {
4935
     print "\nTo start ddd for $type, type in another window:\n";
unknown's avatar
unknown committed
4936
     print "ddd -cd $glob_mysql_test_dir -x $gdb_init_file $$exe\n";
4937 4938 4939 4940

     # Indicate the exe should not be started
     $$exe= undef;
     return;
unknown's avatar
unknown committed
4941 4942 4943 4944
  }

  my $save_exe= $$exe;
  $$args= [];
4945
  if ( $exe_libtool )
unknown's avatar
unknown committed
4946
  {
4947
    $$exe= $exe_libtool;
unknown's avatar
unknown committed
4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958
    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");
}

4959 4960 4961 4962 4963 4964 4965 4966 4967

#
# 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;

4968
  if ( $debugger =~ /vcexpress|vc|devenv/ )
4969 4970 4971 4972 4973 4974 4975
  {
    # vc[express] /debugexe exe arg1 .. argn

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

4976 4977 4978
    # Set exe to debuggername
    $$exe= $debugger;

4979
  }
4980
  elsif ( $debugger =~ /windbg/ )
4981 4982 4983 4984 4985 4986
  {
    # windbg exe arg1 .. argn

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

4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001
    # Set exe to debuggername
    $$exe= $debugger;

  }
  elsif ( $debugger eq "dbx" )
  {
    # xterm -e dbx -r exe arg1 .. argn

    unshift(@$$args, $$exe);
    unshift(@$$args, "-r");
    unshift(@$$args, $debugger);
    unshift(@$$args, "-e");

    $$exe= "xterm";

5002 5003 5004 5005 5006 5007 5008 5009
  }
  else
  {
    mtr_error("Unknown argument \"$debugger\" passed to --debugger");
  }
}


unknown's avatar
unknown committed
5010 5011 5012
#
# Modify the exe and args so that program is run in valgrind
#
unknown's avatar
unknown committed
5013 5014 5015 5016
sub valgrind_arguments {
  my $args= shift;
  my $exe=  shift;

unknown's avatar
unknown committed
5017
  if ( $opt_callgrind)
unknown's avatar
unknown committed
5018
  {
unknown's avatar
unknown committed
5019 5020
    mtr_add_arg($args, "--tool=callgrind");
    mtr_add_arg($args, "--base=$opt_vardir/log");
unknown's avatar
unknown committed
5021
  }
unknown's avatar
unknown committed
5022 5023 5024 5025 5026 5027 5028 5029 5030
  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
5031

5032 5033
  # Add valgrind options, can be overriden by user
  mtr_add_arg($args, '%s', $_) for (split(' ', $opt_valgrind_options));
5034

unknown's avatar
unknown committed
5035 5036
  mtr_add_arg($args, $$exe);

unknown's avatar
unknown committed
5037
  $$exe= $opt_valgrind_path || "valgrind";
5038 5039 5040 5041 5042 5043 5044 5045

  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
5046 5047 5048
}


unknown's avatar
unknown committed
5049 5050 5051 5052 5053 5054
##############################################################################
#
#  Usage
#
##############################################################################

unknown's avatar
unknown committed
5055
sub usage ($) {
5056 5057 5058 5059
  my $message= shift;

  if ( $message )
  {
unknown's avatar
unknown committed
5060
    print STDERR "$message\n";
5061 5062
  }

unknown's avatar
unknown committed
5063
  print <<HERE;
unknown's avatar
unknown committed
5064

unknown's avatar
unknown committed
5065
$0 [ OPTIONS ] [ TESTCASE ]
unknown's avatar
unknown committed
5066 5067 5068 5069 5070

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
5071 5072 5073 5074
  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
5075 5076
  compress              Use the compressed protocol between client and server
  ssl                   Use ssl protocol between client and server
5077
  skip-ssl              Dont start server with support for ssl connections
unknown's avatar
unknown committed
5078 5079
  bench                 Run the benchmark suite
  small-bench           Run the benchmarks with --small-tests --small-tables
5080
  ndb|with-ndbcluster   Use cluster as default table type
5081 5082
  vs-config             Visual Studio configuration used to create executables
                        (default: MTR_VS_CONFIG environment variable)
unknown's avatar
unknown committed
5083

5084
Options to control directories to use
unknown's avatar
unknown committed
5085 5086
  benchdir=DIR          The directory where the benchmark suite is stored
                        (default: ../../mysql-bench)
5087 5088
  tmpdir=DIR            The directory where temporary files are stored
                        (default: ./var/tmp).
unknown's avatar
unknown committed
5089 5090 5091
  vardir=DIR            The directory where files generated from the test run
                        is stored (default: ./var). Specifying a ramdisk or
                        tmpfs will speed up tests.
5092 5093 5094
  mem                   Run testsuite in "memory" using tmpfs or ramdisk
                        Attempts to find a suitable location
                        using a builtin list of standard locations
5095 5096 5097
                        for tmpfs (/dev/shm)
                        The option can also be set using environment
                        variable MTR_MEM=[DIR]
5098

unknown's avatar
unknown committed
5099 5100 5101
Options to control what test suites or cases to run

  force                 Continue to run the suite after failure
unknown's avatar
unknown committed
5102 5103 5104 5105
  with-ndbcluster-only  Run only tests that include "ndb" in the filename
  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
5106 5107 5108 5109
  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
5110
  skip-im               Don't start IM, and skip the IM test cases
unknown's avatar
unknown committed
5111
  skip-test=PREFIX      Skip test cases which name are prefixed with PREFIX
5112 5113
  big-test              Set the environment variable BIG_TEST, which can be
                        checked from test cases.
unknown's avatar
unknown committed
5114 5115 5116 5117 5118

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
unknown's avatar
unknown committed
5119 5120
  ndbcluster-port=PORT  Specify the port number used by cluster
  ndbcluster-port-slave=PORT  Specify the port number used by slave cluster
5121 5122
  mtr-build-thread=#    Specify unique collection of ports. Can also be set by
                        setting the environment variable MTR_BUILD_THREAD.
unknown's avatar
unknown committed
5123 5124 5125 5126

Options for test case authoring

  record TESTNAME       (Re)genereate the result file for TESTNAME
5127
  check-testcases       Check testcases for sideeffects
5128
  mark-progress         Log line number and elapsed time to <testname>.progress
unknown's avatar
unknown committed
5129 5130 5131 5132 5133 5134 5135

Options that pass on options

  mysqld=ARGS           Specify additional arguments to "mysqld"

Options to run test on running server

5136
  extern                Use running server for tests
unknown's avatar
unknown committed
5137 5138
  ndb-connectstring=STR Use running cluster, and connect using STR
  ndb-connectstring-slave=STR Use running slave cluster, and connect using STR
5139 5140
  user=USER             User for connection to extern server
  socket=PATH           Socket for connection to extern server
unknown's avatar
unknown committed
5141 5142 5143

Options for debugging the product

unknown's avatar
unknown committed
5144 5145
  client-ddd            Start mysqltest client in ddd
  client-debugger=NAME  Start mysqltest in the selected debugger
unknown's avatar
unknown committed
5146 5147
  client-gdb            Start mysqltest client in gdb
  ddd                   Start mysqld in ddd
unknown's avatar
unknown committed
5148
  debug                 Dump trace output for all servers and client programs
5149
  debugger=NAME         Start mysqld in the selected debugger
unknown's avatar
unknown committed
5150 5151 5152 5153 5154
  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
5155 5156
  manual-ddd            Let user manually start mysqld in ddd, before running
                        test(s)
unknown's avatar
unknown committed
5157 5158
  master-binary=PATH    Specify the master "mysqld" to use
  slave-binary=PATH     Specify the slave "mysqld" to use
unknown's avatar
unknown committed
5159
  strace-client         Create strace output for mysqltest client
5160 5161 5162
  max-save-core         Limit the number of core files saved (to avoid filling
                        up disks for heavily crashing server). Defaults to
                        $opt_max_save_core, set to 0 for no limit.
unknown's avatar
unknown committed
5163 5164 5165 5166 5167

Options for coverage, profiling etc

  gcov                  FIXME
  gprof                 FIXME
5168 5169 5170
  valgrind              Run the "mysqltest" and "mysqld" executables using
                        valgrind with options($default_valgrind_options)
  valgrind-all          Synonym for --valgrind
5171 5172
  valgrind-mysqltest    Run the "mysqltest" and "mysql_client_test" executable
                        with valgrind
unknown's avatar
unknown committed
5173
  valgrind-mysqld       Run the "mysqld" executable with valgrind
5174
  valgrind-options=ARGS Options to give valgrind, replaces default options
unknown's avatar
unknown committed
5175
  valgrind-path=[EXE]   Path to the valgrind executable
unknown's avatar
unknown committed
5176
  callgrind             Instruct valgrind to use callgrind
unknown's avatar
unknown committed
5177 5178 5179

Misc options

5180
  comment=STR           Write STR to the output
unknown's avatar
unknown committed
5181
  notimer               Don't show test case execution time
unknown's avatar
unknown committed
5182
  script-debug          Debug this script itself
unknown's avatar
unknown committed
5183
  verbose               More verbose output
5184 5185 5186 5187 5188 5189
  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
5190
  help                  Get this help text
unknown's avatar
unknown committed
5191
  unified-diff | udiff  When presenting differences, use unified diff
unknown's avatar
unknown committed
5192

unknown's avatar
unknown committed
5193
  testcase-timeout=MINUTES Max test case run time (default $default_testcase_timeout)
5194 5195
  suite-timeout=MINUTES Max test suite run time (default $default_suite_timeout)
  warnings | log-warnings Pass --log-warnings to mysqld
5196

5197
  sleep=SECONDS         Passed to mysqltest, will be used as fixed sleep time
5198

5199 5200 5201
Deprecated options
  with-openssl          Deprecated option for ssl

5202

unknown's avatar
unknown committed
5203
HERE
unknown's avatar
unknown committed
5204
  mtr_exit(1);
5205

unknown's avatar
unknown committed
5206
}
5207