From: Bjorn Munch Date: November 4 2010 1:19pm Subject: bzr commit into mysql-5.1-mtr branch (bjorn.munch:2948) Bug#57840 List-Archive: http://lists.mysql.com/commits/122837 X-Bug: 57840 Message-Id: <201011041319.oA4DJpTk012416@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1418477359==" --===============1418477359== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/ordpar-51/ based on revid:bjorn.munch@stripped 2948 Bjorn Munch 2010-11-04 Bug #57840 MTR: parallel execution breaks with smart ordering of test cases Another updated patch: Adds little sanity check that expected worker picks up test Fixed some tests that may fail if starting on running server Some of these fail only if *same* test is repeated. added: mysql-test/suite/binlog/t/binlog_index-master.opt mysql-test/suite/rpl/t/rpl_current_user-master.opt mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt modified: mysql-test/lib/mtr_cases.pm mysql-test/mysql-test-run.pl mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt mysql-test/suite/rpl/r/rpl_ignore_table.result mysql-test/suite/rpl/t/rpl_cross_version-master.opt mysql-test/suite/rpl/t/rpl_ignore_table.test mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh mysql-test/t/key_cache-master.opt mysql-test/t/mysqlbinlog-master.opt === modified file 'mysql-test/lib/mtr_cases.pm' --- a/mysql-test/lib/mtr_cases.pm 2010-08-30 09:25:10 +0000 +++ b/mysql-test/lib/mtr_cases.pm 2010-11-04 13:17:35 +0000 @@ -170,8 +170,6 @@ sub collect_test_cases ($$$) { if ( $opt_reorder && !$quick_collect) { # Reorder the test cases in an order that will make them faster to run - my %sort_criteria; - # Make a mapping of test name to a string that represents how that test # should be sorted among the other tests. Put the most important criterion # first, then a sub-criterion, then sub-sub-criterion, etc. @@ -183,24 +181,29 @@ sub collect_test_cases ($$$) { # Append the criteria for sorting, in order of importance. # push(@criteria, "ndb=" . ($tinfo->{'ndb_test'} ? "A" : "B")); + push(@criteria, $tinfo->{template_path}); # Group test with equal options together. # Ending with "~" makes empty sort later than filled my $opts= $tinfo->{'master_opt'} ? $tinfo->{'master_opt'} : []; push(@criteria, join("!", sort @{$opts}) . "~"); + # Add slave opts if any + if ($tinfo->{'slave_opt'}) + { + push(@criteria, join("!", sort @{$tinfo->{'slave_opt'}})); + } - $sort_criteria{$tinfo->{name}} = join(" ", @criteria); + $tinfo->{criteria}= join(" ", @criteria); } - @$cases = sort { - $sort_criteria{$a->{'name'}} . $a->{'name'} cmp - $sort_criteria{$b->{'name'}} . $b->{'name'}; } @$cases; + @$cases = sort {$a->{criteria} cmp $b->{criteria}; } @$cases; # For debugging the sort-order # foreach my $tinfo (@$cases) # { - # print("$sort_criteria{$tinfo->{'name'}} -> \t$tinfo->{'name'}\n"); + # my $tname= $tinfo->{name} . ' ' . $tinfo->{combination}; + # my $crit= $tinfo->{criteria}; + # print("$tname\n\t$crit\n"); # } - } if (defined $print_testcases){ === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2010-10-19 12:01:14 +0000 +++ b/mysql-test/mysql-test-run.pl 2010-11-04 13:17:35 +0000 @@ -662,22 +662,37 @@ sub run_test_server ($$$) { next; } - # Prefer same configuration, or just use next if --noreorder - if (!$opt_reorder or (defined $result and - $result->{template_path} eq $t->{template_path})) - { - #mtr_report("Test uses same config => good match"); - # Test uses same config => good match - $next= splice(@$tests, $i, 1); - last; - } - # Second best choice is the first that does not fulfill # any of the above conditions if (!defined $second_best){ #mtr_report("Setting second_best to $i"); $second_best= $i; } + + # Smart allocation of next test within this thread. + + if ($opt_reorder and $opt_parallel > 1 and defined $result) + { + my $wid= $result->{worker}; + # Reserved for other thread, try next + next if (defined $t->{reserved} and $t->{reserved} != $wid); + if (! defined $t->{reserved}) + { + # Reserve similar tests for this worker, but not too many + my $maxres= (@$tests - $i) / $opt_parallel + 1; + for (my $j= $i+1; $j <= $i + $maxres; $j++) + { + my $tt= $tests->[$j]; + last unless defined $tt; + last if $tt->{criteria} ne $t->{criteria}; + $tt->{reserved}= $wid; + } + } + } + + # At this point we have found next suitable test + $next= splice(@$tests, $i, 1); + last; } # Use second best choice if no other test has been found @@ -686,10 +701,12 @@ sub run_test_server ($$$) { mtr_error("Internal error, second best too large($second_best)") if $second_best > $#$tests; $next= splice(@$tests, $second_best, 1); + delete $next->{reserved}; } if ($next) { - #$next->print_test(); + # We don't need this any more + delete $next->{criteria}; $next->write_test($sock, 'TESTCASE'); $running{$next->key()}= $next; $num_ndb_tests++ if ($next->{ndb_test}); @@ -772,6 +789,11 @@ sub run_worker ($) { delete($test->{'comment'}); delete($test->{'logfile'}); + # A sanity check. Should this happen often we need to look at it. + if (defined $test->{reserved} && $test->{reserved} != $thread_num) { + my $tres= $test->{reserved}; + mtr_warning("Test reserved for w$tres picked up by w$thread_num"); + } $test->{worker} = $thread_num if $opt_parallel > 1; run_testcase($test); @@ -4575,17 +4597,6 @@ sub server_need_restart { } } - # Temporary re-enable the "always restart slave" hack - # this should be removed asap, but will require that each rpl - # testcase cleanup better after itself - ie. stop and reset - # replication - # Use the "#!use-slave-opt" marker to detect that this is a "slave" - # server - if ( $server->option("#!use-slave-opt") ){ - mtr_verbose_restart($server, "Always restart slave(s)"); - return 1; - } - my $is_mysqld= grep ($server eq $_, mysqlds()); if ($is_mysqld) { === added file 'mysql-test/suite/binlog/t/binlog_index-master.opt' --- a/mysql-test/suite/binlog/t/binlog_index-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/t/binlog_index-master.opt 2010-11-04 13:17:35 +0000 @@ -0,0 +1 @@ +--force-restart === modified file 'mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt' --- a/mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt 2007-06-27 12:28:02 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_binlog-master.opt 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ -O max_binlog_size=4096 +--force-restart === modified file 'mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt' --- a/mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt 2009-09-24 14:52:52 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ --binlog-do-db=b42829 +--force-restart === modified file 'mysql-test/suite/rpl/r/rpl_ignore_table.result' --- a/mysql-test/suite/rpl/r/rpl_ignore_table.result 2008-11-13 19:19:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_ignore_table.result 2010-11-04 13:17:35 +0000 @@ -141,3 +141,4 @@ HEX(word) SELECT * FROM tmptbl504451f4258$1; ERROR 42S02: Table 'test.tmptbl504451f4258$1' doesn't exist DROP TABLE t5; +call mtr.force_restart(); === modified file 'mysql-test/suite/rpl/t/rpl_cross_version-master.opt' --- a/mysql-test/suite/rpl/t/rpl_cross_version-master.opt 2009-01-27 11:33:30 +0000 +++ b/mysql-test/suite/rpl/t/rpl_cross_version-master.opt 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ --replicate-same-server-id --relay-log=slave-relay-bin --secure-file-priv=$MYSQL_TMP_DIR +--force-restart === added file 'mysql-test/suite/rpl/t/rpl_current_user-master.opt' --- a/mysql-test/suite/rpl/t/rpl_current_user-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_current_user-master.opt 2010-11-04 13:17:35 +0000 @@ -0,0 +1 @@ +--force-restart === modified file 'mysql-test/suite/rpl/t/rpl_ignore_table.test' --- a/mysql-test/suite/rpl/t/rpl_ignore_table.test 2008-11-13 19:19:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_ignore_table.test 2010-11-04 13:17:35 +0000 @@ -174,3 +174,5 @@ SELECT * FROM tmptbl504451f4258$1; connection master; DROP TABLE t5; sync_slave_with_master; + +call mtr.force_restart(); === modified file 'mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh' --- a/mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh 2009-11-28 04:43:16 +0000 +++ b/mysql-test/suite/rpl/t/rpl_loaddata_symlink-master.sh 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ +rm -f $MYSQLTEST_VARDIR/std_data_master_link ln -s $MYSQLTEST_VARDIR/std_data $MYSQLTEST_VARDIR/std_data_master_link === modified file 'mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh' --- a/mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh 2009-11-28 04:43:16 +0000 +++ b/mysql-test/suite/rpl/t/rpl_loaddata_symlink-slave.sh 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ +rm -f $MYSQLTEST_VARDIR/std_data_slave_link ln -s $MYSQLTEST_VARDIR/std_data $MYSQLTEST_VARDIR/std_data_slave_link === added file 'mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt' --- a/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist-master.opt 2010-11-04 13:17:35 +0000 @@ -0,0 +1 @@ +--force-restart === modified file 'mysql-test/t/key_cache-master.opt' --- a/mysql-test/t/key_cache-master.opt 2003-07-06 16:09:57 +0000 +++ b/mysql-test/t/key_cache-master.opt 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ --key_buffer_size=2M --small.key_buffer_size=256K --small.key_buffer_size=128K +--force-restart === modified file 'mysql-test/t/mysqlbinlog-master.opt' --- a/mysql-test/t/mysqlbinlog-master.opt 2003-09-24 19:25:58 +0000 +++ b/mysql-test/t/mysqlbinlog-master.opt 2010-11-04 13:17:35 +0000 @@ -1 +1,2 @@ --max-binlog-size=4096 +--force-restart \ No newline at end of file --===============1418477359== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/bjorn.munch@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bjorn.munch@stripped # target_branch: file:///home/bm136801/my/ordpar-51/ # testament_sha1: a3f4d7dc95bc8cfdfecab268d75a1f1af7baaa7e # timestamp: 2010-11-04 14:19:51 +0100 # base_revision_id: bjorn.munch@stripped\ # fltvohh2z890zgsd # # Begin bundle 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 uSKcKEh0YaPTAA== --===============1418477359==--