diff --git a/mysql-test/include/circular_rpl_for_4_hosts_init.inc b/mysql-test/include/circular_rpl_for_4_hosts_init.inc index 8be6ef10b3e..ac6654777db 100644 --- a/mysql-test/include/circular_rpl_for_4_hosts_init.inc +++ b/mysql-test/include/circular_rpl_for_4_hosts_init.inc @@ -18,7 +18,7 @@ --source include/master-slave.inc # -# Set up circular ring by schema A->B->C-D->A +# Set up circular ring by schema A->B->C->D->A # --connection slave diff --git a/mysql-test/lib/My/ConfigFactory.pm b/mysql-test/lib/My/ConfigFactory.pm index 3558bd0c4db..69bb969d7b8 100644 --- a/mysql-test/lib/My/ConfigFactory.pm +++ b/mysql-test/lib/My/ConfigFactory.pm @@ -416,7 +416,7 @@ sub post_fix_mysql_cluster_section { # Add a [mysl_cluster.] section for each # defined [cluster_config.] section - foreach my $group ( $config->like('cluster_config\.\w*') ) + foreach my $group ( $config->like('cluster_config\.\w*$') ) { my @urls; # Generate ndb_connectstring for this cluster @@ -497,7 +497,7 @@ sub run_generate_sections_from_cluster_config { my @options= ('ndb_mgmd', 'ndbd', 'mysqld', 'ndbapi'); - foreach my $group ( $config->like('cluster_config\.\w*') ) { + foreach my $group ( $config->like('cluster_config\.\w*$') ) { # Keep track of current index per process type my %idxes; @@ -580,7 +580,7 @@ sub new_config { $self->run_section_rules($config, - 'cluster_config\.\w*', + 'cluster_config\.\w*$', @cluster_config_rules); $self->run_generate_sections_from_cluster_config($config); diff --git a/mysql-test/lib/mtr_cases.pm b/mysql-test/lib/mtr_cases.pm index 8a275fbe99b..b3115b65e30 100644 --- a/mysql-test/lib/mtr_cases.pm +++ b/mysql-test/lib/mtr_cases.pm @@ -721,6 +721,16 @@ sub collect_one_test_case { # Add slave opts, list of extra option only for slave # ---------------------------------------------------------------------- process_opts_file($tinfo, "$testdir/$tname-slave.opt", 'slave_opt'); + + + #----------------------------------------------------------------------- + # Check for test specific config file + #----------------------------------------------------------------------- + my $test_cnf_file= "$testdir/$tname.cnf"; + if ( -f $test_cnf_file) { + # Specifies the configuration file to use for this test + $tinfo->{'template_path'}= $test_cnf_file; + } # ---------------------------------------------------------------------- # Check for test specific config file diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index b7fd4974754..3de7f730af3 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -196,9 +196,12 @@ our %mysqld_variables; my $source_dist= 0; -our $opt_max_save_core= 5; +my $opt_max_save_core= $ENV{MTR_MAX_SAVE_CORE} || 5; my $num_saved_cores= 0; # Number of core files saved in vardir/log/ so far. +my $opt_max_save_datadir= $ENV{MTR_MAX_SAVE_DATADIR} || 20; +my $num_saved_datadir= 0; # Number of datadirs saved in vardir/log/ so far. + select(STDOUT); $| = 1; # Automatically flush STDOUT @@ -641,6 +644,7 @@ sub command_line_setup { 'client-debugger=s' => \$opt_client_debugger, 'strace-client:s' => \$opt_strace_client, 'max-save-core=i' => \$opt_max_save_core, + 'max-save-datadir=i' => \$opt_max_save_datadir, # Coverage, profiling etc 'gcov' => \$opt_gcov, @@ -2567,6 +2571,10 @@ sub run_testcase ($) { if ( started(all_servers()) == 0 ) { + + # Remove old datadirs + clean_datadir(); + # Restore old ENV while (my ($option, $value)= each( %old_env )) { if (defined $value){ @@ -2690,15 +2698,12 @@ sub run_testcase ($) { mtr_report_test_passed($tinfo, $opt_timer); } - if ( $opt_check_testcases ) + if ( $opt_check_testcases and check_testcase($tinfo, "after")) { - if (check_testcase($tinfo, "after")) - { - # Stop all servers that are known to be running - stop_all_servers(); - after_test_failure($tinfo->{'name'}); - mtr_report("Resuming tests...\n"); - } + # Stop all servers that are known to be running + stop_all_servers(); + clean_datadir(); + mtr_report("Resuming tests...\n"); } } elsif ( $res == 62 ) @@ -2765,7 +2770,7 @@ sub run_testcase ($) { { # Server failed, probably crashed $tinfo->{comment}= - "Server failed during test run"; + "Server $proc failed during test run"; report_failure_and_restart($tinfo); return 1; @@ -2910,57 +2915,24 @@ sub check_expected_crash_and_restart { } -# -# Save any interesting files in the data_dir -# before the data dir is removed. -# -sub save_files_after_test_failure($$) { - my $test_name= shift; - my $data_dir= shift; - my $save_name= "$opt_vardir/log/$test_name"; +sub clean_datadir { - # Look for core files - foreach my $core_file ( glob("$data_dir/core*") ) + mtr_verbose("Cleaning datadirs..."); + + foreach my $cluster ( clusters() ) { - last if $opt_max_save_core > 0 && $num_saved_cores >= $opt_max_save_core; - my $core_name= basename($core_file); - mtr_report(" - saving '$core_name'"); - mkpath($save_name) if ! -d $save_name; - rename("$core_file", "$save_name/$core_name"); - ++$num_saved_cores; + my $cluster_dir= "$opt_vardir/".$cluster->{name}; + mtr_verbose(" - removing '$cluster_dir'"); + rmtree($cluster_dir); + } -} - - -sub after_test_failure ($) { - my $test_name= shift; - - mtr_report("Cleaning datadirs..."); foreach my $mysqld ( mysqlds() ) { - my $data_dir= $mysqld->value('datadir'); - my $name= basename($data_dir); - save_files_after_test_failure($test_name, $data_dir); - mtr_debug("Removing '$data_dir'"); - rmtree($data_dir); - } - - # Remove the ndb_*_fs dirs for all ndbd nodes - # forcing a clean start of ndb next time - foreach my $cluster ( clusters() ) - { - foreach my $ndbd ( ndbds($cluster) ) - { - my $data_dir= $ndbd->value('DataDir'); - foreach my $fs_dir ( glob("$data_dir/ndb_*_fs") ) { - rmtree($fs_dir); - mtr_debug("Removing '$fs_dir'"); - } - - my $backup_dir= $ndbd->value('BackupDataDir'); - rmtree("$backup_dir/BACKUP"); - mtr_debug("Removing '$backup_dir'"); + my $mysqld_dir= dirname($mysqld->value('datadir')); + if (-d $mysqld_dir ) { + mtr_verbose(" - removing '$mysqld_dir'"); + rmtree($mysqld_dir); } } @@ -2974,6 +2946,91 @@ sub after_test_failure ($) { } +# +# Limit number of core files saved +# +sub limit_cores_after_failure ($) { + my ($datadir)= @_; + + # Look for core files + foreach my $core_file ( glob("$datadir/core*") ) + { + my $core_name= basename($core_file); + if ($opt_max_save_core > 0 && $num_saved_cores >= $opt_max_save_core) { + # Delete file to avoid saving it when the datadir is later saved + mtr_report(" - deleting '$core_name'", + "($num_saved_cores/$opt_max_save_core)"); + unlink("$core_file"); + } + else { + mtr_report(" - found '$core_name'", + "($num_saved_cores/$opt_max_save_core)"); + } + ++$num_saved_cores; + } +} + +# +# Save datadir before it's removed +# +sub save_datadir_after_failure($$) { + my ($dir, $savedir)= @_; + + if ($opt_max_save_datadir > 0 && + $num_saved_datadir >= $opt_max_save_datadir) + { + mtr_report(" - skipping '$dir'"); + } + else { + mtr_report(" - saving '$dir'"); + my $dir_name= basename($dir); + rename("$dir", "$savedir/$dir_name"); + } +} + + +sub after_failure ($) { + my ($tinfo)= @_; + + mtr_report("Saving datadirs..."); + + my $save_dir= "$opt_vardir/log/"; + $save_dir.= $tinfo->{name}; + # Add combination name if any + $save_dir.= "_$tinfo->{combination}" + if defined $tinfo->{combination}; + + mkpath($save_dir) if ! -d $save_dir; + + # Save the used my.cnf file + copy($path_config_file, $save_dir); + + if ( clusters() ) { + foreach my $cluster ( clusters() ) { + + foreach my $server ( ndbds($cluster), ndb_mgmds($cluster) ) { + my $data_dir= $server->value('DataDir'); + limit_cores_after_failure($data_dir); + } + + my $cluster_dir= "$opt_vardir/".$cluster->{name}; + save_datadir_after_failure($cluster_dir, $save_dir); + } + } + else { + foreach my $mysqld ( mysqlds() ) { + my $data_dir= $mysqld->value('datadir'); + limit_cores_after_failure($data_dir); + save_datadir_after_failure(dirname($data_dir), $save_dir); + } + } + + $num_saved_datadir++; + + clean_datadir(); +} + + sub report_failure_and_restart ($) { my $tinfo= shift; @@ -2983,7 +3040,7 @@ sub report_failure_and_restart ($) { stop_all_servers(); # Collect and clean files - after_test_failure($tinfo->{'name'}); + after_failure($tinfo); mtr_report("Resuming tests...\n"); } @@ -4117,7 +4174,12 @@ Options for debugging the product Example: $0 --strace-client=ktrace 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. + $opt_max_save_core, set to 0 for no limit. Set + it's default with MTR_MAX_SAVE_CORE + max-save-datadir Limit the number of datadir saved (to avoid filling + up disks for heavily crashing server). Defaults to + $opt_max_save_datadir, set to 0 for no limit. Set + it's default with MTR_MAX_SAVE_DATDIR Options for valgrind diff --git a/mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result b/mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result index 5b775a066c4..4f0f20d88d9 100644 --- a/mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result +++ b/mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result @@ -1,4 +1,4 @@ -*** Set up circular ring by schema A->B->C-D->A *** +*** Set up circular ring by schema A->B->C->D->A *** stop slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; reset master; diff --git a/mysql-test/suite/rpl/t/disabled.def b/mysql-test/suite/rpl/t/disabled.def index 538719aaf65..599a2b197ae 100644 --- a/mysql-test/suite/rpl/t/disabled.def +++ b/mysql-test/suite/rpl/t/disabled.def @@ -15,5 +15,4 @@ rpl_innodb_bug28430 : Bug #32247 2007-11-27 mats Test reports wrong value o rpl_view : Bug#32654: rpl_view.test fails randomly rpl_ndb_multi : Bug#30751: rpl_ndb_multi missing row in output rpl_log_pos : Bug#8693 Test 'rpl_log_pos' fails sometimes -rpl_circular_for_4_hosts : Needs updated config diff --git a/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts-master.opt b/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts-master.opt deleted file mode 100644 index d540d4a6880..00000000000 --- a/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts-master.opt +++ /dev/null @@ -1 +0,0 @@ ---slave-num=3 --log-slave-updates --innodb diff --git a/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts-slave.opt b/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts-slave.opt deleted file mode 100644 index f5df45c8ecd..00000000000 --- a/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts-slave.opt +++ /dev/null @@ -1 +0,0 @@ ---log-slave-updates --innodb diff --git a/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.cnf b/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.cnf new file mode 100644 index 00000000000..141aaa7788d --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.cnf @@ -0,0 +1,27 @@ +!include ../my.cnf + +[mysqld.1] +log-slave-updates +innodb + +[mysqld.2] +log-slave-updates +innodb + +[mysqld.3] +log-slave-updates +innodb + +[mysqld.4] +log-slave-updates +innodb + +[ENV] +SLAVE_MYPORT1= @mysqld.3.port +SLAVE_MYSOCK1= @mysqld.3.socket + +SLAVE_MYPORT2= @mysqld.4.port +SLAVE_MYSOCK2= @mysqld.4.socket + + + diff --git a/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_2ch.result b/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_2ch.result index 5ad36e6f251..bb662542a56 100644 --- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_2ch.result +++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_2ch.result @@ -97,5 +97,6 @@ COUNT(*) SUM(a) b 100 64100 master1 100 64000 slave -DELETE FROM t1; +DROP TABLE t1; +DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/rpl_ndb/t/disabled.def b/mysql-test/suite/rpl_ndb/t/disabled.def index a37bd1ee6bb..8177095f5a8 100644 --- a/mysql-test/suite/rpl_ndb/t/disabled.def +++ b/mysql-test/suite/rpl_ndb/t/disabled.def @@ -12,6 +12,5 @@ rpl_ndb_circular : Bug#33849 COMMIT event missing in cluster circular replication. rpl_ndb_circular_simplex : Bug#33849 COMMIT event missing in cluster circular replication. - +rpl_ndb_circular_2ch : Bug#33849 COMMIT event missing in cluster circular replication. # the below testcase have been reworked to avoid the bug, test contains comment, keep bug open -rpl_ndb_circular_2ch : Needs updated config diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch-master.opt b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch-master.opt deleted file mode 100644 index 3462bbc05d7..00000000000 --- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch-master.opt +++ /dev/null @@ -1 +0,0 @@ ---slave-num=2 --server-id=1 --log-bin -log-slave-updates diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch-slave.opt b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch-slave.opt deleted file mode 100644 index 6507907b1ed..00000000000 --- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch-slave.opt +++ /dev/null @@ -1 +0,0 @@ ---server-id=2 --log-bin --log-slave-updates --skip-slave-start diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf new file mode 100644 index 00000000000..27da0af1847 --- /dev/null +++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.cnf @@ -0,0 +1,35 @@ +!include ../my.cnf + +[mysqld.1.1] +server-id= 1 +log-bin +log-slave-updates + +[mysqld.2.1] +server-id= 1 +log-bin +log-slave-updates + +[mysqld.1.slave] +server-id= 2 +log-bin +log-slave-updates +skip-slave-start + +[mysqld.2.slave] +server-id= 2 +master-host= 127.0.0.1 +master-port= @mysqld.2.1.port +master-password= @mysqld.2.1.#password +master-user= @mysqld.2.1.#user +master-connect-retry= 1 +init-rpl-role= slave +log-bin +log-slave-updates +skip-slave-start +ndb_connectstring= @mysql_cluster.slave.ndb_connectstring + +[ENV] + +SLAVE_MYPORT1= @mysqld.2.slave.port +SLAVE_MYSOCK1= @mysqld.2.slave.socket diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.test index beaa2739b23..abd2144b80c 100644 --- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.test +++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_2ch.test @@ -170,10 +170,11 @@ SELECT COUNT(*), SUM(a), b FROM t1 WHERE c = 3 GROUP BY b ORDER BY b; # Clean up --connection master -DELETE FROM t1; +DROP TABLE t1; --connection slave -let $wait_condition= SELECT COUNT(*)=0 FROM t1; ---source include/wait_condition.inc +--disable_warings +DROP TABLE IF EXISTS t1; +--enable_warnings --echo # End of test 5.1