[pve-devel] [PATCH v4 1/3] migrate: collect migration tunnel child process

Dietmar Maurer dietmar at proxmox.com
Thu Jun 2 16:15:42 CEST 2016


I can see the reason to use waitpid instead of check_process_running(),
but why do you change the rest of the code?

Can we have minimal patches, where each patch states the reason for the change
in the commit log?


> On June 2, 2016 at 2:44 PM Thomas Lamprecht <t.lamprecht at proxmox.com> wrote:
> 
> 
> 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
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 




More information about the pve-devel mailing list