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 {
mark_time_used('init');
my ($prefix, $fail, $completed, $extra_warnings)=
run_test_server($server, $tests, \%children);
Manager::run($server, $tests, \%children);
exit(0) if $opt_start_exit;
......@@ -562,65 +562,32 @@ sub main {
}
sub run_test_server ($$$) {
my ($server, $tests, $children) = @_;
package Manager;
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_failed_test= 0; # Number of tests failed so far
my $test_failure= 0; # Set true if test suite failed
my $extra_warnings= []; # Warnings found during server shutdowns
my $num_saved_datadir; # Number of datadirs saved in vardir/log/ so far.
my $num_failed_test; # Number of tests failed so far
my $test_failure; # Set true if test suite failed
my $extra_warnings; # Warnings found during server shutdowns
my $completed= [];
my %running;
my $result;
my $exe_mysqld= find_mysqld($bindir) || ""; # Used as hint to CoreDump
my $completed;
my %running;
my $result;
my $exe_mysqld; # Used as hint to CoreDump
my %names;
my $suite_timeout= start_timer(suite_timeout());
my $s= IO::Select->new();
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);
sub parse_protocol($$) {
my $sock= shift;
my $line= shift;
if ($line eq 'TESTRESULT'){
mtr_verbose2("Got TESTRESULT from ". $names{$sock});
$result= My::Test::read_test($sock);
# Report test status
......@@ -656,7 +623,7 @@ sub run_test_server ($$$) {
if ($num_saved_datadir >= $opt_max_save_datadir)
{
mtr_report(" - skipping '$worker_savedir/'");
rmtree($worker_savedir);
main::rmtree($worker_savedir);
}
else
{
......@@ -664,7 +631,7 @@ sub run_test_server ($$$) {
rename($worker_savedir, $savedir);
$num_saved_datadir++;
}
resfile_print_test();
main::resfile_print_test();
$num_failed_test++ unless ($result->{retries} ||
$result->{exp_fail});
......@@ -674,21 +641,22 @@ sub run_test_server ($$$) {
push(@$completed, $result);
if ($result->{'dont_kill_server'})
{
mtr_verbose2("${line}: saying BYE to ". $names{$sock});
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
$num_failed_test >= $opt_max_test_fail) {
push(@$completed, $result);
mtr_report("Too many tests($num_failed_test) failed!",
"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
my $retries= $result->{retries} || 2;
my $test_has_failed= $result->{failures} || 0;
......@@ -724,7 +692,7 @@ sub run_test_server ($$$) {
$result->write_test($sock, 'TESTCASE');
}
push(@$completed, $result);
next;
return 1;
}
}
......@@ -738,7 +706,7 @@ sub run_test_server ($$$) {
delete($result->{result});
$result->{repeat}= $repeat+1;
$result->write_test($sock, 'TESTCASE');
next;
return 1;
}
# Remove from list of running
......@@ -748,7 +716,7 @@ sub run_test_server ($$$) {
# Save result in completed list
push(@$completed, $result);
}
} # if ($line eq 'TESTRESULT')
elsif ($line=~ /^START (.*)$/){
# Send first test
$names{$sock}= $1;
......@@ -763,12 +731,13 @@ sub run_test_server ($$$) {
$test_failure= 1;
if ( !$opt_force ) {
# 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/) {
add_total_times($line);
main::add_total_times($line);
}
elsif ($line eq 'VALGREP' && $opt_valgrind) {
$valgrind_reports= 1;
......@@ -776,6 +745,69 @@ sub run_test_server ($$$) {
else {
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
# - Try to use same configuration as worker used last time
......@@ -788,7 +820,7 @@ sub run_test_server ($$$) {
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
#mtr_report("skip - Moving test $i to completed");
push(@$completed, splice(@$tests, $i, 1));
......@@ -889,7 +921,7 @@ sub run_test_server ($$$) {
# ----------------------------------------------------
# Check if test suite timer expired
# ----------------------------------------------------
if ( has_expired($suite_timeout) )
if ( main::has_expired($suite_timeout) )
{
mtr_report("Test suite timeout! Terminating...");
return ("Timeout", 1, $completed, $extra_warnings);
......@@ -897,6 +929,9 @@ sub run_test_server ($$$) {
}
}
1;
package main;
sub run_worker ($) {
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