mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug #57840 MTR: parallel execution breaks with smart ordering of test cases
There were actually more problems in this area: Slaves (if any) were unconditionally restarted, this appears unnecessary. Sort criteria were suboptimal, included the test name. Added logic to "reserve" a sequence of tests with same config for one thread Got rid of sort_criteria hash, put it into the test case itself 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. Finally, special sorting of tests that do --force-restart
This commit is contained in:
@ -662,22 +662,40 @@ 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})
|
||||
{
|
||||
# Force-restart not relevant when comparing *next* test
|
||||
$t->{criteria} =~ s/force-restart$/no-restart/;
|
||||
my $criteria= $t->{criteria};
|
||||
# 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 $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 +704,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 +792,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 +4600,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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user