Bug#25657 mysql-test-run.pl kill itself under ActiveState perl

- Read the pid from pidfile in order to be able to kill the real process
instead of the pseudo process. Most platforms will have the same real_pid
as pid
- Kill using the real pid
parent 6a9811b5
...@@ -562,7 +562,7 @@ sub mtr_check_stop_servers ($) { ...@@ -562,7 +562,7 @@ sub mtr_check_stop_servers ($) {
# Return if no processes are defined # Return if no processes are defined
return if ! @$spec; return if ! @$spec;
#mtr_report("mtr_check_stop_servers"); mtr_verbose("mtr_check_stop_servers");
mtr_ping_with_timeout(\@$spec); mtr_ping_with_timeout(\@$spec);
...@@ -605,7 +605,10 @@ sub mtr_check_stop_servers ($) { ...@@ -605,7 +605,10 @@ sub mtr_check_stop_servers ($) {
{ {
if ( $srv->{'pid'} ) if ( $srv->{'pid'} )
{ {
$mysqld_pids{$srv->{'pid'}}= 1; # Add the process pid to list of pids to kill
# if the process has a "real_pid" use it
$mysqld_pids{$srv->{'real_pid'} ?
$srv->{'real_pid'} : $srv->{'pid'}}= 1;
} }
else else
{ {
...@@ -638,13 +641,9 @@ sub mtr_check_stop_servers ($) { ...@@ -638,13 +641,9 @@ sub mtr_check_stop_servers ($) {
# that for true Win32 processes, kill(0,$pid) will not return 1. # that for true Win32 processes, kill(0,$pid) will not return 1.
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
start_reap_all(); # Avoid zombies
my @mysqld_pids= keys %mysqld_pids; my @mysqld_pids= keys %mysqld_pids;
mtr_kill_processes(\@mysqld_pids); mtr_kill_processes(\@mysqld_pids);
stop_reap_all(); # Get into control again
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Now, we check if all we can find using kill(0,$pid) are dead, # Now, we check if all we can find using kill(0,$pid) are dead,
# and just assume the rest are. We cleanup socket and PID files. # and just assume the rest are. We cleanup socket and PID files.
...@@ -654,14 +653,15 @@ sub mtr_check_stop_servers ($) { ...@@ -654,14 +653,15 @@ sub mtr_check_stop_servers ($) {
my $errors= 0; my $errors= 0;
foreach my $srv ( @$spec ) foreach my $srv ( @$spec )
{ {
if ( $srv->{'pid'} ) my $pid= $srv->{'real_pid'} ? $srv->{'real_pid'} : $srv->{'pid'};
if ( $pid )
{ {
if ( kill(0,$srv->{'pid'}) ) if ( kill(0, $pid) )
{ {
# FIXME In Cygwin there seem to be some fast reuse # FIXME In Cygwin there seem to be some fast reuse
# of PIDs, so dying may not be the right thing to do. # of PIDs, so dying may not be the right thing to do.
$errors++; $errors++;
mtr_warning("can't kill process $srv->{'pid'}"); mtr_warning("can't kill process $pid");
} }
else else
{ {
...@@ -682,6 +682,8 @@ sub mtr_check_stop_servers ($) { ...@@ -682,6 +682,8 @@ sub mtr_check_stop_servers ($) {
mtr_warning("couldn't delete $file"); mtr_warning("couldn't delete $file");
} }
} }
# Reap the child
waitpid($srv->{'pid'},&WNOHANG);
$srv->{'pid'}= 0; $srv->{'pid'}= 0;
} }
} }
...@@ -1063,7 +1065,10 @@ sub sleep_until_file_created ($$$) { ...@@ -1063,7 +1065,10 @@ sub sleep_until_file_created ($$$) {
{ {
if ( -r $pidfile ) if ( -r $pidfile )
{ {
return $pid; # Read real pid from pidfile
my $real_pid= mtr_fromfile($pidfile);
mtr_verbose("pid: $pid, real_pid: $real_pid");
return $real_pid;
} }
# Check if it died after the fork() was successful # Check if it died after the fork() was successful
......
...@@ -2549,10 +2549,16 @@ sub ndbcluster_wait_started($$){ ...@@ -2549,10 +2549,16 @@ sub ndbcluster_wait_started($$){
sub mysqld_wait_started($){ sub mysqld_wait_started($){
my $mysqld= shift; my $mysqld= shift;
my $res= sleep_until_file_created($mysqld->{'path_pid'}, my $pid_from_pidfile=
$mysqld->{'start_timeout'}, sleep_until_file_created($mysqld->{'path_pid'},
$mysqld->{'pid'}); $mysqld->{'start_timeout'},
return $res == 0; $mysqld->{'pid'});
# On platforms with pseudo threads we need to save
# the real pid of mysqld read from pidfile
$mysqld->{'real_pid'}= $pid_from_pidfile;
return $pid_from_pidfile == 0;
} }
...@@ -4047,6 +4053,7 @@ sub stop_all_servers () { ...@@ -4047,6 +4053,7 @@ sub stop_all_servers () {
push(@kill_pids,{ push(@kill_pids,{
pid => $mysqld->{'pid'}, pid => $mysqld->{'pid'},
real_pid => $mysqld->{'real_pid'},
pidfile => $mysqld->{'path_pid'}, pidfile => $mysqld->{'path_pid'},
sockfile => $mysqld->{'path_sock'}, sockfile => $mysqld->{'path_sock'},
port => $mysqld->{'port'}, port => $mysqld->{'port'},
...@@ -4253,6 +4260,7 @@ sub run_testcase_stop_servers($$$) { ...@@ -4253,6 +4260,7 @@ sub run_testcase_stop_servers($$$) {
push(@kill_pids,{ push(@kill_pids,{
pid => $mysqld->{'pid'}, pid => $mysqld->{'pid'},
real_pid => $mysqld->{'real_pid'},
pidfile => $mysqld->{'path_pid'}, pidfile => $mysqld->{'path_pid'},
sockfile => $mysqld->{'path_sock'}, sockfile => $mysqld->{'path_sock'},
port => $mysqld->{'port'}, port => $mysqld->{'port'},
...@@ -4303,6 +4311,7 @@ sub run_testcase_stop_servers($$$) { ...@@ -4303,6 +4311,7 @@ sub run_testcase_stop_servers($$$) {
push(@kill_pids,{ push(@kill_pids,{
pid => $mysqld->{'pid'}, pid => $mysqld->{'pid'},
real_pid => $mysqld->{'real_pid'},
pidfile => $mysqld->{'path_pid'}, pidfile => $mysqld->{'path_pid'},
sockfile => $mysqld->{'path_sock'}, sockfile => $mysqld->{'path_sock'},
port => $mysqld->{'port'}, port => $mysqld->{'port'},
......
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