mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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).
This commit is contained in:
committed by
Daniel Black
parent
92fb31f0b1
commit
0815a3b6b5
@ -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 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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 $suite_timeout= start_timer(suite_timeout());
|
|
||||||
|
|
||||||
my $s= IO::Select->new();
|
|
||||||
my $childs= 0;
|
|
||||||
my %names;
|
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');
|
sub parse_protocol($$) {
|
||||||
my @ready = $s->can_read(1); # Wake up once every second
|
my $sock= shift;
|
||||||
if (@ready > 0) {
|
my $line= shift;
|
||||||
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 ($$$) {
|
|||||||
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 ($$$) {
|
|||||||
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 ($$$) {
|
|||||||
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 ($$$) {
|
|||||||
$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 ($$$) {
|
|||||||
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 ($$$) {
|
|||||||
# 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 ($$$) {
|
|||||||
$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 ($$$) {
|
|||||||
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 ($$$) {
|
|||||||
|
|
||||||
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 ($$$) {
|
|||||||
# ----------------------------------------------------
|
# ----------------------------------------------------
|
||||||
# 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 ($$$) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
package main;
|
||||||
|
|
||||||
sub run_worker ($) {
|
sub run_worker ($) {
|
||||||
my ($server_port, $thread_num)= @_;
|
my ($server_port, $thread_num)= @_;
|
||||||
|
Reference in New Issue
Block a user