Commit bd20de01 authored by Bjorn Munch's avatar Bjorn Munch

Bug #51767 Implement --start-and-exit also for MTR v2

Added option and logic, bypass safe_process
Adapted after review comments
parent 937eabd3
...@@ -60,11 +60,12 @@ use My::Platform; ...@@ -60,11 +60,12 @@ use My::Platform;
my %running; my %running;
my $_verbose= 0; my $_verbose= 0;
my $start_exit= 0;
END { END {
# Kill any children still running # Kill any children still running
for my $proc (values %running){ for my $proc (values %running){
if ( $proc->is_child($$) ){ if ( $proc->is_child($$) and ! $start_exit){
#print "Killing: $proc\n"; #print "Killing: $proc\n";
if ($proc->wait_one(0)){ if ($proc->wait_one(0)){
$proc->kill(); $proc->kill();
...@@ -149,6 +150,11 @@ sub new { ...@@ -149,6 +150,11 @@ sub new {
push(@safe_args, "--"); push(@safe_args, "--");
push(@safe_args, $path); # The program safe_process should execute push(@safe_args, $path); # The program safe_process should execute
if ($start_exit) { # Bypass safe_process instead, start program directly
@safe_args= ();
$safe_path= $path;
}
push(@safe_args, @$$args); push(@safe_args, @$$args);
print "### safe_path: ", $safe_path, " ", join(" ", @safe_args), "\n" print "### safe_path: ", $safe_path, " ", join(" ", @safe_args), "\n"
...@@ -528,6 +534,13 @@ sub wait_all { ...@@ -528,6 +534,13 @@ sub wait_all {
} }
} }
#
# Set global flag to tell all safe_process to exit after starting child
#
sub start_exit {
$start_exit= 1;
}
# #
# Check if any process has exited, but don't wait. # Check if any process has exited, but don't wait.
......
...@@ -218,6 +218,7 @@ sub check_timeout { return $opt_testcase_timeout * 6; }; ...@@ -218,6 +218,7 @@ sub check_timeout { return $opt_testcase_timeout * 6; };
my $opt_start; my $opt_start;
my $opt_start_dirty; my $opt_start_dirty;
my $opt_start_exit;
my $start_only; my $start_only;
my $opt_wait_all; my $opt_wait_all;
my $opt_repeat= 1; my $opt_repeat= 1;
...@@ -345,6 +346,12 @@ sub main { ...@@ -345,6 +346,12 @@ sub main {
mtr_report("Using parallel: $opt_parallel"); mtr_report("Using parallel: $opt_parallel");
} }
if ($opt_parallel > 1 && $opt_start_exit) {
mtr_warning("Parallel and --start-and-exit cannot be combined\n" .
"Setting parallel to 1");
$opt_parallel= 1;
}
# Create server socket on any free port # Create server socket on any free port
my $server = new IO::Socket::INET my $server = new IO::Socket::INET
( (
...@@ -384,6 +391,8 @@ sub main { ...@@ -384,6 +391,8 @@ sub main {
my $completed= run_test_server($server, $tests, $opt_parallel); my $completed= run_test_server($server, $tests, $opt_parallel);
exit(0) if $opt_start_exit;
# Send Ctrl-C to any children still running # Send Ctrl-C to any children still running
kill("INT", keys(%children)); kill("INT", keys(%children));
...@@ -910,6 +919,7 @@ sub command_line_setup { ...@@ -910,6 +919,7 @@ sub command_line_setup {
'verbose-restart' => \&report_option, 'verbose-restart' => \&report_option,
'sleep=i' => \$opt_sleep, 'sleep=i' => \$opt_sleep,
'start-dirty' => \$opt_start_dirty, 'start-dirty' => \$opt_start_dirty,
'start-and-exit' => \$opt_start_exit,
'start' => \$opt_start, 'start' => \$opt_start,
'wait-all' => \$opt_wait_all, 'wait-all' => \$opt_wait_all,
'print-testcases' => \&collect_option, 'print-testcases' => \&collect_option,
...@@ -1316,7 +1326,7 @@ sub command_line_setup { ...@@ -1316,7 +1326,7 @@ sub command_line_setup {
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Modified behavior with --start options # Modified behavior with --start options
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
if ($opt_start or $opt_start_dirty) { if ($opt_start or $opt_start_dirty or $opt_start_exit) {
collect_option ('quick-collect', 1); collect_option ('quick-collect', 1);
$start_only= 1; $start_only= 1;
} }
...@@ -3400,6 +3410,18 @@ sub run_testcase ($) { ...@@ -3400,6 +3410,18 @@ sub run_testcase ($) {
mtr_print ($mysqld->name() . " " . $mysqld->value('port') . mtr_print ($mysqld->name() . " " . $mysqld->value('port') .
" " . $mysqld->value('socket')); " " . $mysqld->value('socket'));
} }
if ( $opt_start_exit )
{
mtr_print("Server(s) started, not waiting for them to finish");
if (IS_WINDOWS)
{
POSIX::_exit(0); # exit hangs here in ActiveState Perl
}
else
{
exit(0);
}
}
mtr_print("Waiting for server(s) to exit..."); mtr_print("Waiting for server(s) to exit...");
if ( $opt_wait_all ) { if ( $opt_wait_all ) {
My::SafeProcess->wait_all(); My::SafeProcess->wait_all();
...@@ -4644,6 +4666,12 @@ sub stop_servers($$) { ...@@ -4644,6 +4666,12 @@ sub stop_servers($$) {
sub start_servers($) { sub start_servers($) {
my ($tinfo)= @_; my ($tinfo)= @_;
# Make sure the safe_process also exits from now on
# Could not be done before, as we don't want this for the bootstrap
if ($opt_start_exit) {
My::SafeProcess->start_exit();
}
# Start clusters # Start clusters
foreach my $cluster ( clusters() ) foreach my $cluster ( clusters() )
{ {
......
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