summaryrefslogtreecommitdiff
path: root/mysql-test/lib/mtr_process.pl
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/lib/mtr_process.pl')
-rw-r--r--mysql-test/lib/mtr_process.pl767
1 files changed, 40 insertions, 727 deletions
diff --git a/mysql-test/lib/mtr_process.pl b/mysql-test/lib/mtr_process.pl
index 9f8eb8e92bd..5e21248790e 100644
--- a/mysql-test/lib/mtr_process.pl
+++ b/mysql-test/lib/mtr_process.pl
@@ -4,7 +4,6 @@
# and is part of the translation of the Bourne shell script with the
# same name.
-#use Carp qw(cluck);
use Socket;
use Errno;
use strict;
@@ -26,28 +25,6 @@ sub mtr_kill_processes ($);
sub mtr_ping_with_timeout($);
sub mtr_ping_port ($);
-# Private IM-related operations.
-
-sub mtr_im_kill_process ($$$);
-sub mtr_im_load_pids ($);
-sub mtr_im_terminate ($);
-sub mtr_im_check_alive ($);
-sub mtr_im_check_main_alive ($);
-sub mtr_im_check_angel_alive ($);
-sub mtr_im_check_mysqlds_alive ($);
-sub mtr_im_check_mysqld_alive ($$);
-sub mtr_im_cleanup ($);
-sub mtr_im_rm_file ($);
-sub mtr_im_errlog ($);
-sub mtr_im_kill ($);
-sub mtr_im_wait_for_connection ($$$);
-sub mtr_im_wait_for_mysqld($$$);
-
-# Public IM-related operations.
-
-sub mtr_im_start ($$);
-sub mtr_im_stop ($$);
-
# static in C
sub spawn_impl ($$$$$$$$);
@@ -115,8 +92,6 @@ sub spawn_impl ($$$$$$$$) {
my $pid_file= shift; # FIXME
my $spawn_opts= shift;
- mtr_error("Can't spawn with empty \"path\"") unless defined $path;
-
if ( $::opt_script_debug )
{
print STDERR "\n";
@@ -140,6 +115,9 @@ sub spawn_impl ($$$$$$$$) {
print STDERR "#### ", "-" x 78, "\n";
}
+ mtr_error("Can't spawn with empty \"path\"") unless defined $path;
+
+
FORK:
{
my $pid= fork();
@@ -358,9 +336,16 @@ sub mtr_process_exit_status {
# kill IM manager first, else it will restart the servers
sub mtr_kill_leftovers () {
+ mtr_report("Killing Possible Leftover Processes");
mtr_debug("mtr_kill_leftovers(): started.");
- mtr_im_stop($::instance_manager, 'mtr_kill_leftovers');
+ mkpath("$::opt_vardir/log"); # Needed for mysqladmin log
+
+ # Stop or kill Instance Manager and all its children. If we failed to do
+ # that, we can only abort -- there is nothing left to do.
+
+# mtr_error("Failed to stop Instance Manager.")
+# unless mtr_im_stop($::instance_manager);
# Start shutdown of masters and slaves. Don't touch IM-managed mysqld
# instances -- they should be stopped by mtr_im_stop().
@@ -392,40 +377,41 @@ sub mtr_kill_leftovers () {
$srv->{'pid'}= 0; # Assume we are done with it
}
- # Start shutdown of clusters.
-
- mtr_debug("Shutting down cluster...");
-
- foreach my $cluster (@{$::clusters})
+ if ( ! $::opt_skip_ndbcluster )
{
- mtr_debug(" - cluster " .
- "(pid: $cluster->{pid}; " .
- "pid file: '$cluster->{path_pid})");
-
- my $pid= mtr_ndbmgm_start($cluster, "shutdown");
-
- # Save the pid of the ndb_mgm process
- $admin_pids{$pid}= 1;
-
- push(@kill_pids,{
- pid => $cluster->{'pid'},
- pidfile => $cluster->{'path_pid'}
- });
+ # Start shutdown of clusters.
+ mtr_debug("Shutting down cluster...");
- $cluster->{'pid'}= 0; # Assume we are done with it
+ foreach my $cluster (@{$::clusters})
+ {
+ mtr_debug(" - cluster " .
+ "(pid: $cluster->{pid}; " .
+ "pid file: '$cluster->{path_pid})");
+ my $pid= mtr_ndbmgm_start($cluster, "shutdown");
- foreach my $ndbd (@{$cluster->{'ndbds'}})
- {
- mtr_debug(" - ndbd " .
- "(pid: $ndbd->{pid}; " .
- "pid file: '$ndbd->{path_pid})");
+ # Save the pid of the ndb_mgm process
+ $admin_pids{$pid}= 1;
push(@kill_pids,{
- pid => $ndbd->{'pid'},
- pidfile => $ndbd->{'path_pid'},
+ pid => $cluster->{'pid'},
+ pidfile => $cluster->{'path_pid'}
});
- $ndbd->{'pid'}= 0; # Assume we are done with it
+
+ $cluster->{'pid'}= 0; # Assume we are done with it
+
+ foreach my $ndbd (@{$cluster->{'ndbds'}})
+ {
+ mtr_debug(" - ndbd " .
+ "(pid: $ndbd->{pid}; " .
+ "pid file: '$ndbd->{path_pid})");
+
+ push(@kill_pids,{
+ pid => $ndbd->{'pid'},
+ pidfile => $ndbd->{'path_pid'},
+ });
+ $ndbd->{'pid'}= 0; # Assume we are done with it
+ }
}
}
@@ -1095,7 +1081,7 @@ sub mtr_kill_processes ($) {
{
foreach my $sig (15, 9)
{
- last if mtr_im_kill_process([ $pid ], $sig, 10);
+ last if mtr_im_kill_process([ $pid ], $sig, 10, 1);
}
}
}
@@ -1130,679 +1116,6 @@ sub mtr_exit ($) {
exit($code);
}
-##############################################################################
-#
-# Instance Manager management routines.
-#
-##############################################################################
-
-sub mtr_im_kill_process ($$$) {
- my $pid_lst= shift;
- my $signal= shift;
- my $timeout= shift;
- my $total_attempts= $timeout * 10;
-
- my %pids;
-
- foreach my $pid (@{$pid_lst})
- {
- $pids{$pid}= 1;
- }
-
- for (my $cur_attempt= 1; $cur_attempt <= $total_attempts; ++$cur_attempt)
- {
- foreach my $pid (keys %pids)
- {
- mtr_debug("Sending $signal to $pid...");
-
- kill($signal, $pid);
-
- unless (kill (0, $pid))
- {
- mtr_debug("Process $pid died.");
- delete $pids{$pid};
- }
- }
-
- return if scalar keys %pids == 0;
-
- mtr_debug("Sleeping 100ms waiting for processes to die...");
-
- select(undef, undef, undef, 0.1);
- }
-
- mtr_debug("Process(es) " .
- join(' ', keys %pids) .
- " is still alive after $total_attempts " .
- "of sending signal $signal.");
-}
-
-###########################################################################
-
-sub mtr_im_load_pids($) {
- my $instance_manager= shift;
-
- mtr_debug("Loading PID files...");
-
- # Obtain mysqld-process pids.
-
- my $instances = $instance_manager->{'instances'};
-
- for (my $idx= 0; $idx < 2; ++$idx)
- {
- mtr_debug("IM-guarded mysqld[$idx] PID file: '" .
- $instances->[$idx]->{'path_pid'} . "'.");
-
- my $mysqld_pid;
-
- if (-r $instances->[$idx]->{'path_pid'})
- {
- $mysqld_pid= mtr_get_pid_from_file($instances->[$idx]->{'path_pid'});
- mtr_debug("IM-guarded mysqld[$idx] PID: $mysqld_pid.");
- }
- else
- {
- $mysqld_pid= undef;
- mtr_debug("IM-guarded mysqld[$idx]: no PID file.");
- }
-
- $instances->[$idx]->{'pid'}= $mysqld_pid;
- }
-
- # Re-read Instance Manager PIDs from the file, since during tests Instance
- # Manager could have been restarted, so its PIDs could have been changed.
-
- # - IM-main
-
- mtr_debug("IM-main PID file: '$instance_manager->{path_pid}'.");
-
- if (-f $instance_manager->{'path_pid'})
- {
- $instance_manager->{'pid'} =
- mtr_get_pid_from_file($instance_manager->{'path_pid'});
-
- mtr_debug("IM-main PID: $instance_manager->{pid}.");
- }
- else
- {
- mtr_debug("IM-main: no PID file.");
- $instance_manager->{'pid'}= undef;
- }
-
- # - IM-angel
-
- mtr_debug("IM-angel PID file: '$instance_manager->{path_angel_pid}'.");
-
- if (-f $instance_manager->{'path_angel_pid'})
- {
- $instance_manager->{'angel_pid'} =
- mtr_get_pid_from_file($instance_manager->{'path_angel_pid'});
-
- mtr_debug("IM-angel PID: $instance_manager->{'angel_pid'}.");
- }
- else
- {
- mtr_debug("IM-angel: no PID file.");
- $instance_manager->{'angel_pid'} = undef;
- }
-}
-
-###########################################################################
-
-sub mtr_im_terminate($) {
- my $instance_manager= shift;
-
- # Load pids from pid-files. We should do it first of all, because IM deletes
- # them on shutdown.
-
- mtr_im_load_pids($instance_manager);
-
- mtr_debug("Shutting Instance Manager down...");
-
- # Ignoring SIGCHLD so that all children could rest in peace.
-
- start_reap_all();
-
- # Send SIGTERM to IM-main.
-
- if (defined $instance_manager->{'pid'})
- {
- mtr_debug("IM-main pid: $instance_manager->{pid}.");
- mtr_debug("Stopping IM-main...");
-
- mtr_im_kill_process([ $instance_manager->{'pid'} ], 'TERM', 10);
- }
- else
- {
- mtr_debug("IM-main pid: n/a.");
- }
-
- # If IM-angel was alive, wait for it to die.
-
- if (defined $instance_manager->{'angel_pid'})
- {
- mtr_debug("IM-angel pid: $instance_manager->{'angel_pid'}.");
- mtr_debug("Waiting for IM-angel to die...");
-
- my $total_attempts= 10;
-
- for (my $cur_attempt=1; $cur_attempt <= $total_attempts; ++$cur_attempt)
- {
- unless (kill (0, $instance_manager->{'angel_pid'}))
- {
- mtr_debug("IM-angel died.");
- last;
- }
-
- sleep(1);
- }
- }
- else
- {
- mtr_debug("IM-angel pid: n/a.");
- }
-
- stop_reap_all();
-
- # Re-load PIDs.
-
- mtr_im_load_pids($instance_manager);
-}
-
-###########################################################################
-
-sub mtr_im_check_alive($) {
- my $instance_manager= shift;
-
- mtr_debug("Checking whether IM-components are alive...");
-
- return 1 if mtr_im_check_main_alive($instance_manager);
-
- return 1 if mtr_im_check_angel_alive($instance_manager);
-
- return 1 if mtr_im_check_mysqlds_alive($instance_manager);
-
- return 0;
-}
-
-###########################################################################
-
-sub mtr_im_check_main_alive($) {
- my $instance_manager= shift;
-
- # Check that the process, that we know to be IM's, is dead.
-
- if (defined $instance_manager->{'pid'})
- {
- if (kill (0, $instance_manager->{'pid'}))
- {
- mtr_debug("IM-main (PID: $instance_manager->{pid}) is alive.");
- return 1;
- }
- else
- {
- mtr_debug("IM-main (PID: $instance_manager->{pid}) is dead.");
- }
- }
- else
- {
- mtr_debug("No PID file for IM-main.");
- }
-
- # Check that IM does not accept client connections.
-
- if (mtr_ping_port($instance_manager->{'port'}))
- {
- mtr_debug("IM-main (port: $instance_manager->{port}) " .
- "is accepting connections.");
-
- mtr_im_errlog("IM-main is accepting connections on port " .
- "$instance_manager->{port}, but there is no " .
- "process information.");
- return 1;
- }
- else
- {
- mtr_debug("IM-main (port: $instance_manager->{port}) " .
- "does not accept connections.");
- return 0;
- }
-}
-
-###########################################################################
-
-sub mtr_im_check_angel_alive($) {
- my $instance_manager= shift;
-
- # Check that the process, that we know to be the Angel, is dead.
-
- if (defined $instance_manager->{'angel_pid'})
- {
- if (kill (0, $instance_manager->{'angel_pid'}))
- {
- mtr_debug("IM-angel (PID: $instance_manager->{angel_pid}) is alive.");
- return 1;
- }
- else
- {
- mtr_debug("IM-angel (PID: $instance_manager->{angel_pid}) is dead.");
- return 0;
- }
- }
- else
- {
- mtr_debug("No PID file for IM-angel.");
- return 0;
- }
-}
-
-###########################################################################
-
-sub mtr_im_check_mysqlds_alive($) {
- my $instance_manager= shift;
-
- mtr_debug("Checking for IM-guarded mysqld instances...");
-
- my $instances = $instance_manager->{'instances'};
-
- for (my $idx= 0; $idx < 2; ++$idx)
- {
- mtr_debug("Checking mysqld[$idx]...");
-
- return 1
- if mtr_im_check_mysqld_alive($instance_manager, $instances->[$idx]);
- }
-}
-
-###########################################################################
-
-sub mtr_im_check_mysqld_alive($$) {
- my $instance_manager= shift;
- my $mysqld_instance= shift;
-
- # Check that the process is dead.
-
- if (defined $instance_manager->{'pid'})
- {
- if (kill (0, $instance_manager->{'pid'}))
- {
- mtr_debug("Mysqld instance (PID: $mysqld_instance->{pid}) is alive.");
- return 1;
- }
- else
- {
- mtr_debug("Mysqld instance (PID: $mysqld_instance->{pid}) is dead.");
- }
- }
- else
- {
- mtr_debug("No PID file for mysqld instance.");
- }
-
- # Check that mysqld does not accept client connections.
-
- if (mtr_ping_port($mysqld_instance->{'port'}))
- {
- mtr_debug("Mysqld instance (port: $mysqld_instance->{port}) " .
- "is accepting connections.");
-
- mtr_im_errlog("Mysqld is accepting connections on port " .
- "$mysqld_instance->{port}, but there is no " .
- "process information.");
- return 1;
- }
- else
- {
- mtr_debug("Mysqld instance (port: $mysqld_instance->{port}) " .
- "does not accept connections.");
- return 0;
- }
-}
-
-###########################################################################
-
-sub mtr_im_cleanup($) {
- my $instance_manager= shift;
-
- mtr_im_rm_file($instance_manager->{'path_pid'});
- mtr_im_rm_file($instance_manager->{'path_sock'});
-
- mtr_im_rm_file($instance_manager->{'path_angel_pid'});
-
- for (my $idx= 0; $idx < 2; ++$idx)
- {
- mtr_im_rm_file($instance_manager->{'instances'}->[$idx]->{'path_pid'});
- mtr_im_rm_file($instance_manager->{'instances'}->[$idx]->{'path_sock'});
- }
-}
-
-###########################################################################
-
-sub mtr_im_rm_file($)
-{
- my $file_path= shift;
-
- if (-f $file_path)
- {
- mtr_debug("Removing '$file_path'...");
-
- mtr_warning("Can not remove '$file_path'.")
- unless unlink($file_path);
- }
- else
- {
- mtr_debug("File '$file_path' does not exist already.");
- }
-}
-
-###########################################################################
-
-sub mtr_im_errlog($) {
- my $msg= shift;
-
- # Complain in error log so that a warning will be shown.
- #
- # TODO: unless BUG#20761 is fixed, we will print the warning to stdout, so
- # that it can be seen on console and does not produce pushbuild error.
-
- # my $errlog= "$opt_vardir/log/mysql-test-run.pl.err";
- #
- # open (ERRLOG, ">>$errlog") ||
- # mtr_error("Can not open error log ($errlog)");
- #
- # my $ts= localtime();
- # print ERRLOG
- # "Warning: [$ts] $msg\n";
- #
- # close ERRLOG;
-
- my $ts= localtime();
- print "Warning: [$ts] $msg\n";
-}
-
-###########################################################################
-
-sub mtr_im_kill($) {
- my $instance_manager= shift;
-
- # Re-load PIDs. That can be useful because some processes could have been
- # restarted.
-
- mtr_im_load_pids($instance_manager);
-
- # Ignoring SIGCHLD so that all children could rest in peace.
-
- start_reap_all();
-
- # Kill IM-angel first of all.
-
- if (defined $instance_manager->{'angel_pid'})
- {
- mtr_debug("Killing IM-angel (PID: $instance_manager->{angel_pid})...");
- mtr_im_kill_process([ $instance_manager->{'angel_pid'} ], 'KILL', 10);
- }
- else
- {
- mtr_debug("IM-angel is dead.");
- }
-
- # Re-load PIDs again.
-
- mtr_im_load_pids($instance_manager);
-
- # Kill IM-main.
-
- if (defined $instance_manager->{'pid'})
- {
- mtr_debug("Killing IM-main (PID: $instance_manager->pid})...");
- mtr_im_kill_process([ $instance_manager->{'pid'} ], 'KILL', 10);
- }
- else
- {
- mtr_debug("IM-main is dead.");
- }
-
- # Re-load PIDs again.
-
- mtr_im_load_pids($instance_manager);
-
- # Kill guarded mysqld instances.
-
- my @mysqld_pids;
-
- mtr_debug("Collecting PIDs of mysqld instances to kill...");
-
- for (my $idx= 0; $idx < 2; ++$idx)
- {
- my $pid= $instance_manager->{'instances'}->[$idx]->{'pid'};
-
- next unless defined $pid;
-
- mtr_debug(" - IM-guarded mysqld[$idx] PID: $pid.");
-
- push (@mysqld_pids, $pid);
- }
-
- if (scalar @mysqld_pids > 0)
- {
- mtr_debug("Killing IM-guarded mysqld instances...");
- mtr_im_kill_process(\@mysqld_pids, 'KILL', 10);
- }
-
- # That's all.
-
- stop_reap_all();
-}
-
-##############################################################################
-
-sub mtr_im_wait_for_connection($$$) {
- my $instance_manager= shift;
- my $total_attempts= shift;
- my $connect_timeout= shift;
-
- mtr_debug("Waiting for IM on port $instance_manager->{port} " .
- "to start accepting connections...");
-
- for (my $cur_attempt= 1; $cur_attempt <= $total_attempts; ++$cur_attempt)
- {
- mtr_debug("Trying to connect to IM ($cur_attempt of $total_attempts)...");
-
- if (mtr_ping_port($instance_manager->{'port'}))
- {
- mtr_debug("IM is accepting connections " .
- "on port $instance_manager->{port}.");
- return 1;
- }
-
- mtr_debug("Sleeping $connect_timeout...");
- sleep($connect_timeout);
- }
-
- mtr_debug("IM does not accept connections " .
- "on port $instance_manager->{port} after " .
- ($total_attempts * $connect_timeout) . " seconds.");
-
- return 0;
-}
-
-##############################################################################
-
-sub mtr_im_wait_for_mysqld($$$) {
- my $mysqld= shift;
- my $total_attempts= shift;
- my $connect_timeout= shift;
-
- mtr_debug("Waiting for IM-guarded mysqld on port $mysqld->{port} " .
- "to start accepting connections...");
-
- for (my $cur_attempt= 1; $cur_attempt <= $total_attempts; ++$cur_attempt)
- {
- mtr_debug("Trying to connect to mysqld " .
- "($cur_attempt of $total_attempts)...");
-
- if (mtr_ping_port($mysqld->{'port'}))
- {
- mtr_debug("Mysqld is accepting connections " .
- "on port $mysqld->{port}.");
- return 1;
- }
-
- mtr_debug("Sleeping $connect_timeout...");
- sleep($connect_timeout);
- }
-
- mtr_debug("Mysqld does not accept connections " .
- "on port $mysqld->{port} after " .
- ($total_attempts * $connect_timeout) . " seconds.");
-
- return 0;
-}
-
-##############################################################################
-
-sub mtr_im_start($$) {
- my $instance_manager = shift;
- my $opts = shift;
-
- mtr_debug("Starting Instance Manager...");
-
- my $args;
- mtr_init_args(\$args);
- mtr_add_arg($args, "--defaults-file=%s",
- $instance_manager->{'defaults_file'});
-
- foreach my $opt (@{$opts})
- {
- mtr_add_arg($args, $opt);
- }
-
- $instance_manager->{'pid'} =
- mtr_spawn(
- $::exe_im, # path to the executable
- $args, # cmd-line args
- '', # stdin
- $instance_manager->{'path_log'}, # stdout
- $instance_manager->{'path_err'}, # stderr
- '', # pid file path (not used)
- { append_log_file => 1 } # append log files
- );
-
- if ( ! $instance_manager->{'pid'} )
- {
- mtr_report('Could not start Instance Manager');
- return;
- }
-
- # Instance Manager can be run in daemon mode. In this case, it creates
- # several processes and the parent process, created by mtr_spawn(), exits just
- # after start. So, we have to obtain Instance Manager PID from the PID file.
-
- if ( ! sleep_until_file_created(
- $instance_manager->{'path_pid'},
- $instance_manager->{'start_timeout'},
- -1)) # real PID is still unknown
- {
- mtr_report("Instance Manager PID file is missing");
- return;
- }
-
- $instance_manager->{'pid'} =
- mtr_get_pid_from_file($instance_manager->{'path_pid'});
-
- mtr_debug("Instance Manager started. PID: $instance_manager->{pid}.");
-
- # Wait until we can connect to IM.
-
- my $IM_CONNECT_TIMEOUT= 30;
-
- unless (mtr_im_wait_for_connection($instance_manager,
- $IM_CONNECT_TIMEOUT, 1))
- {
- mtr_debug("Can not connect to Instance Manager " .
- "in $IM_CONNECT_TIMEOUT seconds after start.");
- mtr_debug("Aborting test suite...");
-
- mtr_kill_leftovers();
-
- mtr_error("Can not connect to Instance Manager " .
- "in $IM_CONNECT_TIMEOUT seconds after start.");
- }
-
- # Wait until we can connect to guarded mysqld-instances
- # (in other words -- wait for IM to start guarded instances).
-
- for (my $idx= 0; $idx < 2; ++$idx)
- {
- my $mysqld= $instance_manager->{'instances'}->[$idx];
-
- next if exists $mysqld->{'nonguarded'};
-
- mtr_debug("Waiting for mysqld[$idx] to start...");
-
- unless (mtr_im_wait_for_mysqld($mysqld, 30, 1))
- {
- mtr_debug("Can not connect to mysqld[$idx] " .
- "in $IM_CONNECT_TIMEOUT seconds after start.");
- mtr_debug("Aborting test suite...");
-
- mtr_kill_leftovers();
-
- mtr_error("Can not connect to mysqld[$idx] " .
- "in $IM_CONNECT_TIMEOUT seconds after start.");
- }
-
- mtr_debug("mysqld[$idx] started.");
- }
-
- mtr_debug("Instance Manager started.");
-
- mtr_im_load_pids($instance_manager);
-}
-
-##############################################################################
-
-sub mtr_im_stop($$) {
- my $instance_manager= shift;
- my $where= shift;
-
- mtr_debug("Stopping Instance Manager...");
-
- # Try graceful shutdown.
-
- mtr_im_terminate($instance_manager);
-
- # Check that all processes died.
-
- unless (mtr_im_check_alive($instance_manager))
- {
- mtr_debug("Instance Manager has been stopped successfully.");
- mtr_im_cleanup($instance_manager);
- return 1;
- }
-
- # Instance Manager don't want to die. We should kill it.
-
- mtr_im_errlog("[$where] Instance Manager did not shutdown gracefully.");
-
- mtr_im_kill($instance_manager);
-
- # Check again that all IM-related processes have been killed.
-
- my $im_is_alive= mtr_im_check_alive($instance_manager);
-
- mtr_im_cleanup($instance_manager);
-
- if ($im_is_alive)
- {
- mtr_error("Can not kill Instance Manager or its children.");
- return 0;
- }
-
- mtr_debug("Instance Manager has been killed successfully.");
- return 1;
-}
-
###########################################################################
1;