Commit 0815a3b6 authored by Aleksey Midenkov's avatar Aleksey Midenkov Committed by Daniel Black

MDEV-30836 run_test_server() refactored

run_test_server() is actually manager main loop. We move out this
function into Manager package and split into run() and
parse_protocol(). The latter is needed for the fix. Moving into
separate package helps to make some common variables which was local
to run_test_server().

Functions from the main package is now prefixed with main:: (should be
reorganized somehow later or auto-imported).
parent 92fb31f0
...@@ -483,7 +483,7 @@ sub main { ...@@ -483,7 +483,7 @@ sub main {
mark_time_used('init'); mark_time_used('init');
my ($prefix, $fail, $completed, $extra_warnings)= my ($prefix, $fail, $completed, $extra_warnings)=
run_test_server($server, $tests, \%children); Manager::run($server, $tests, \%children);
exit(0) if $opt_start_exit; exit(0) if $opt_start_exit;
...@@ -562,65 +562,32 @@ sub main { ...@@ -562,65 +562,32 @@ sub main {
} }
sub run_test_server ($$$) { package Manager;
my ($server, $tests, $children) = @_; use POSIX ":sys_wait_h";
use File::Basename;
use File::Find;
use IO::Socket::INET;
use IO::Select;
use mtr_report;
use My::Platform;
my $num_saved_datadir= 0; # Number of datadirs saved in vardir/log/ so far. my $num_saved_datadir; # Number of datadirs saved in vardir/log/ so far.
my $num_failed_test= 0; # Number of tests failed so far my $num_failed_test; # Number of tests failed so far
my $test_failure= 0; # Set true if test suite failed my $test_failure; # Set true if test suite failed
my $extra_warnings= []; # Warnings found during server shutdowns my $extra_warnings; # Warnings found during server shutdowns
my $completed= []; my $completed;
my %running; my %running;
my $result; my $result;
my $exe_mysqld= find_mysqld($bindir) || ""; # Used as hint to CoreDump my $exe_mysqld; # Used as hint to CoreDump
my %names;
my $suite_timeout= start_timer(suite_timeout()); sub parse_protocol($$) {
my $sock= shift;
my $s= IO::Select->new(); my $line= shift;
my $childs= 0;
my %names;
$s->add($server);
while (1) {
if ($opt_stop_file)
{
if (mtr_wait_lock_file($opt_stop_file, $opt_stop_keep_alive))
{
# We were waiting so restart timer process
my $suite_timeout= start_timer(suite_timeout());
}
}
mark_time_used('admin');
my @ready = $s->can_read(1); # Wake up once every second
if (@ready > 0) {
mtr_verbose2("Got ". (0 + @ready). " connection(s)");
}
mark_time_idle();
my $i= 0;
foreach my $sock (@ready) {
++$i;
if ($sock == $server) {
# New client connected
++$childs;
my $child= $sock->accept();
mtr_verbose2("Connection ${i}: Worker connected (got ${childs} childs)");
$s->add($child);
print $child "HELLO\n";
}
else {
my $line= <$sock>;
if (!defined $line) {
# Client disconnected
--$childs;
mtr_verbose2((exists $names{$sock} ? $names{$sock} : "Worker"). " closed socket (left ${childs} childs)");
$s->remove($sock);
$sock->close;
next;
}
chomp($line);
if ($line eq 'TESTRESULT'){ if ($line eq 'TESTRESULT'){
mtr_verbose2("Got TESTRESULT from ". $names{$sock});
$result= My::Test::read_test($sock); $result= My::Test::read_test($sock);
# Report test status # Report test status
...@@ -656,7 +623,7 @@ sub run_test_server ($$$) { ...@@ -656,7 +623,7 @@ sub run_test_server ($$$) {
if ($num_saved_datadir >= $opt_max_save_datadir) if ($num_saved_datadir >= $opt_max_save_datadir)
{ {
mtr_report(" - skipping '$worker_savedir/'"); mtr_report(" - skipping '$worker_savedir/'");
rmtree($worker_savedir); main::rmtree($worker_savedir);
} }
else else
{ {
...@@ -664,7 +631,7 @@ sub run_test_server ($$$) { ...@@ -664,7 +631,7 @@ sub run_test_server ($$$) {
rename($worker_savedir, $savedir); rename($worker_savedir, $savedir);
$num_saved_datadir++; $num_saved_datadir++;
} }
resfile_print_test(); main::resfile_print_test();
$num_failed_test++ unless ($result->{retries} || $num_failed_test++ unless ($result->{retries} ||
$result->{exp_fail}); $result->{exp_fail});
...@@ -674,21 +641,22 @@ sub run_test_server ($$$) { ...@@ -674,21 +641,22 @@ sub run_test_server ($$$) {
push(@$completed, $result); push(@$completed, $result);
if ($result->{'dont_kill_server'}) if ($result->{'dont_kill_server'})
{ {
mtr_verbose2("${line}: saying BYE to ". $names{$sock});
print $sock "BYE\n"; print $sock "BYE\n";
next; return 1;
} }
return ("Failure", 1, $completed, $extra_warnings); return ["Failure", 1, $completed, $extra_warnings];
} }
elsif ($opt_max_test_fail > 0 and elsif ($opt_max_test_fail > 0 and
$num_failed_test >= $opt_max_test_fail) { $num_failed_test >= $opt_max_test_fail) {
push(@$completed, $result); push(@$completed, $result);
mtr_report("Too many tests($num_failed_test) failed!", mtr_report("Too many tests($num_failed_test) failed!",
"Terminating..."); "Terminating...");
return ("Too many failed", 1, $completed, $extra_warnings); return ["Too many failed", 1, $completed, $extra_warnings];
} }
} }
resfile_print_test(); main::resfile_print_test();
# Retry test run after test failure # Retry test run after test failure
my $retries= $result->{retries} || 2; my $retries= $result->{retries} || 2;
my $test_has_failed= $result->{failures} || 0; my $test_has_failed= $result->{failures} || 0;
...@@ -724,7 +692,7 @@ sub run_test_server ($$$) { ...@@ -724,7 +692,7 @@ sub run_test_server ($$$) {
$result->write_test($sock, 'TESTCASE'); $result->write_test($sock, 'TESTCASE');
} }
push(@$completed, $result); push(@$completed, $result);
next; return 1;
} }
} }
...@@ -738,7 +706,7 @@ sub run_test_server ($$$) { ...@@ -738,7 +706,7 @@ sub run_test_server ($$$) {
delete($result->{result}); delete($result->{result});
$result->{repeat}= $repeat+1; $result->{repeat}= $repeat+1;
$result->write_test($sock, 'TESTCASE'); $result->write_test($sock, 'TESTCASE');
next; return 1;
} }
# Remove from list of running # Remove from list of running
...@@ -748,7 +716,7 @@ sub run_test_server ($$$) { ...@@ -748,7 +716,7 @@ sub run_test_server ($$$) {
# Save result in completed list # Save result in completed list
push(@$completed, $result); push(@$completed, $result);
} } # if ($line eq 'TESTRESULT')
elsif ($line=~ /^START (.*)$/){ elsif ($line=~ /^START (.*)$/){
# Send first test # Send first test
$names{$sock}= $1; $names{$sock}= $1;
...@@ -763,12 +731,13 @@ sub run_test_server ($$$) { ...@@ -763,12 +731,13 @@ sub run_test_server ($$$) {
$test_failure= 1; $test_failure= 1;
if ( !$opt_force ) { if ( !$opt_force ) {
# Test failure due to warnings, force is off # Test failure due to warnings, force is off
return ("Warnings in log", 1, $completed, $extra_warnings); mtr_verbose2("Socket loop exiting 3");
return ["Warnings in log", 1, $completed, $extra_warnings];
} }
next; return 1;
} }
elsif ($line =~ /^SPENT/) { elsif ($line =~ /^SPENT/) {
add_total_times($line); main::add_total_times($line);
} }
elsif ($line eq 'VALGREP' && $opt_valgrind) { elsif ($line eq 'VALGREP' && $opt_valgrind) {
$valgrind_reports= 1; $valgrind_reports= 1;
...@@ -776,6 +745,69 @@ sub run_test_server ($$$) { ...@@ -776,6 +745,69 @@ sub run_test_server ($$$) {
else { else {
mtr_error("Unknown response: '$line' from client"); mtr_error("Unknown response: '$line' from client");
} }
return 0;
}
sub run ($$$) {
my ($server, $tests, $children) = @_;
my $suite_timeout= main::start_timer(main::suite_timeout());
$exe_mysqld= main::find_mysqld($bindir) || ""; # Used as hint to CoreDump
$num_saved_datadir= 0; # Number of datadirs saved in vardir/log/ so far.
$num_failed_test= 0; # Number of tests failed so far
$test_failure= 0; # Set true if test suite failed
$extra_warnings= []; # Warnings found during server shutdowns
$completed= [];
my $s= IO::Select->new();
my $childs= 0;
$s->add($server);
while (1) {
if ($opt_stop_file)
{
if (mtr_wait_lock_file($opt_stop_file, $opt_stop_keep_alive))
{
# We were waiting so restart timer process
my $suite_timeout= main::start_timer(main::suite_timeout());
}
}
main::mark_time_used('admin');
my @ready = $s->can_read(1); # Wake up once every second
if (@ready > 0) {
mtr_verbose2("Got ". (0 + @ready). " connection(s)");
}
main::mark_time_idle();
my $i= 0;
foreach my $sock (@ready) {
++$i;
if ($sock == $server) {
# New client connected
++$childs;
my $child= $sock->accept();
mtr_verbose2("Connection ${i}: Worker connected (got ${childs} childs)");
$s->add($child);
print $child "HELLO\n";
}
else {
my $line= <$sock>;
if (!defined $line) {
# Client disconnected
--$childs;
mtr_verbose2((exists $names{$sock} ? $names{$sock} : "Worker"). " closed socket (left ${childs} childs)");
$s->remove($sock);
$sock->close;
next;
}
chomp($line);
mtr_verbose2("Connection ${i}". (exists $names{$sock} ? " from $names{$sock}" : "") .": $line");
my $res= parse_protocol($sock, $line);
if (ref $res eq 'ARRAY') {
return @$res;
} elsif ($res == 1) {
next;
}
# Find next test to schedule # Find next test to schedule
# - Try to use same configuration as worker used last time # - Try to use same configuration as worker used last time
...@@ -788,7 +820,7 @@ sub run_test_server ($$$) { ...@@ -788,7 +820,7 @@ sub run_test_server ($$$) {
last unless defined $t; last unless defined $t;
if (run_testcase_check_skip_test($t)){ if (main::run_testcase_check_skip_test($t)){
# Move the test to completed list # Move the test to completed list
#mtr_report("skip - Moving test $i to completed"); #mtr_report("skip - Moving test $i to completed");
push(@$completed, splice(@$tests, $i, 1)); push(@$completed, splice(@$tests, $i, 1));
...@@ -889,7 +921,7 @@ sub run_test_server ($$$) { ...@@ -889,7 +921,7 @@ sub run_test_server ($$$) {
# ---------------------------------------------------- # ----------------------------------------------------
# Check if test suite timer expired # Check if test suite timer expired
# ---------------------------------------------------- # ----------------------------------------------------
if ( has_expired($suite_timeout) ) if ( main::has_expired($suite_timeout) )
{ {
mtr_report("Test suite timeout! Terminating..."); mtr_report("Test suite timeout! Terminating...");
return ("Timeout", 1, $completed, $extra_warnings); return ("Timeout", 1, $completed, $extra_warnings);
...@@ -897,6 +929,9 @@ sub run_test_server ($$$) { ...@@ -897,6 +929,9 @@ sub run_test_server ($$$) {
} }
} }
1;
package main;
sub run_worker ($) { sub run_worker ($) {
my ($server_port, $thread_num)= @_; my ($server_port, $thread_num)= @_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment