[pve-devel] [PATCH v4 1/3] migrate: collect migration tunnel child process
Thomas Lamprecht
t.lamprecht at proxmox.com
Thu Jun 2 14:44:57 CEST 2016
As we open2 it we also need to collect it to avoid zombies
Wait for 15 seconds if the tunnel is still running then send a
SIGTERM, after another 15 seconds a SIGKILL takes care if it totally
hung up.
As a this stage the tunnel is not used anymore it can safely be
killed, but we wait a little as a gracefull exit is always nicer.
Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
changes since v3:
* just signal the tunnel once with sigterm and eventually sigkill
* wait 15 seconds for sending a sigterm and another 15 for sending the sigkil
PVE/QemuMigrate.pm | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
index a25efff..8afe099 100644
--- a/PVE/QemuMigrate.pm
+++ b/PVE/QemuMigrate.pm
@@ -5,6 +5,7 @@ use warnings;
use PVE::AbstractMigrate;
use IO::File;
use IPC::Open2;
+use POSIX qw( WNOHANG );
use PVE::INotify;
use PVE::Tools;
use PVE::Cluster;
@@ -42,7 +43,10 @@ sub fork_command_pipe {
}
sub finish_command_pipe {
- my ($self, $cmdpipe, $timeout) = @_;
+ my ($self, $cmdpipe) = @_;
+
+ my $cpid = $cmdpipe->{pid};
+ return undef if !$cpid;
my $writer = $cmdpipe->{writer};
my $reader = $cmdpipe->{reader};
@@ -50,27 +54,23 @@ sub finish_command_pipe {
$writer->close();
$reader->close();
- my $cpid = $cmdpipe->{pid};
+ # collect child process
+ for (my $i = 1; $i <= 30; $i++) {
+ my $waitpid = waitpid($cpid, WNOHANG);
+ last if (defined($waitpid) && ($waitpid == $cpid));
- if ($timeout) {
- for (my $i = 0; $i < $timeout; $i++) {
- return if !PVE::ProcFSTools::check_process_running($cpid);
- sleep(1);
+ if ($i == 15) {
+ $self->log('info', "ssh tunnel still running - terminating now with SIGTERM");
+ kill(15, $cpid);
+ } elsif ($i == 29) { # kill for sure it and do an other round to collect it
+ $self->log('info', "ssh tunnel still running - terminating now with SIGKILL");
+ kill(9, $cpid);
}
- }
-
- $self->log('info', "ssh tunnel still running - terminating now with SIGTERM\n");
- kill(15, $cpid);
- # wait again
- for (my $i = 0; $i < 10; $i++) {
- return if !PVE::ProcFSTools::check_process_running($cpid);
- sleep(1);
+ sleep (1);
}
- $self->log('info', "ssh tunnel still running - terminating now with SIGKILL\n");
- kill 9, $cpid;
- sleep 1;
+ delete $cmdpipe->{cpid};
}
sub fork_tunnel {
@@ -114,7 +114,7 @@ sub finish_tunnel {
};
my $err = $@;
- $self->finish_command_pipe($tunnel, 30);
+ $self->finish_command_pipe($tunnel);
die $err if $err;
}
--
2.1.4
More information about the pve-devel
mailing list