From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 87E2E63A03 for ; Thu, 16 Jul 2020 14:07:11 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 7EC3613CEE for ; Thu, 16 Jul 2020 14:07:11 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 3DEEC13CDD for ; Thu, 16 Jul 2020 14:07:10 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 0AB6A430FE for ; Thu, 16 Jul 2020 14:07:10 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Thu, 16 Jul 2020 14:06:59 +0200 Message-Id: <20200716120700.15846-1-f.ebner@proxmox.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.092 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH qemu-server 1/2] migration: factor out starting remote tunnel X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jul 2020 12:07:11 -0000 so the '-S' check can be avoided with mocking. Signed-off-by: Fabian Ebner --- PVE/QemuMigrate.pm | 119 ++++++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index cd4a005..0d8dc82 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -204,6 +204,69 @@ sub finish_tunnel { die $err if $err; } +sub start_remote_tunnel { + my ($self, $raddr, $rport, $ruri, $unix_socket_info) = @_; + + my $nodename = PVE::INotify::nodename(); + my $migration_type = $self->{opts}->{migration_type}; + + if ($migration_type eq 'secure') { + + if ($ruri =~ /^unix:/) { + my $ssh_forward_info = ["$raddr:$raddr"]; + $unix_socket_info->{$raddr} = 1; + + my $unix_sockets = [ keys %$unix_socket_info ]; + for my $sock (@$unix_sockets) { + push @$ssh_forward_info, "$sock:$sock"; + unlink $sock; + } + + $self->{tunnel} = $self->fork_tunnel($ssh_forward_info); + + my $unix_socket_try = 0; # wait for the socket to become ready + while ($unix_socket_try <= 100) { + $unix_socket_try++; + my $available = 0; + foreach my $sock (@$unix_sockets) { + if (-S $sock) { + $available++; + } + } + + if ($available == @$unix_sockets) { + last; + } + + usleep(50000); + } + if ($unix_socket_try > 100) { + $self->{errors} = 1; + $self->finish_tunnel($self->{tunnel}); + die "Timeout, migration socket $ruri did not get ready"; + } + $self->{tunnel}->{unix_sockets} = $unix_sockets if (@$unix_sockets); + + } elsif ($ruri =~ /^tcp:/) { + my $ssh_forward_info = []; + if ($raddr eq "localhost") { + # for backwards compatibility with older qemu-server versions + my $pfamily = PVE::Tools::get_host_address_family($nodename); + my $lport = PVE::Tools::next_migrate_port($pfamily); + push @$ssh_forward_info, "$lport:localhost:$rport"; + } + + $self->{tunnel} = $self->fork_tunnel($ssh_forward_info); + + } else { + die "unsupported protocol in migration URI: $ruri\n"; + } + } else { + #fork tunnel for insecure migration, to send faster commands like resume + $self->{tunnel} = $self->fork_tunnel(); + } +} + sub lock_vm { my ($self, $vmid, $code, @param) = @_; @@ -795,62 +858,8 @@ sub phase2 { } $self->log('info', "start remote tunnel"); + $self->start_remote_tunnel($raddr, $rport, $ruri, $unix_socket_info); - if ($migration_type eq 'secure') { - - if ($ruri =~ /^unix:/) { - my $ssh_forward_info = ["$raddr:$raddr"]; - $unix_socket_info->{$raddr} = 1; - - my $unix_sockets = [ keys %$unix_socket_info ]; - for my $sock (@$unix_sockets) { - push @$ssh_forward_info, "$sock:$sock"; - unlink $sock; - } - - $self->{tunnel} = $self->fork_tunnel($ssh_forward_info); - - my $unix_socket_try = 0; # wait for the socket to become ready - while ($unix_socket_try <= 100) { - $unix_socket_try++; - my $available = 0; - foreach my $sock (@$unix_sockets) { - if (-S $sock) { - $available++; - } - } - - if ($available == @$unix_sockets) { - last; - } - - usleep(50000); - } - if ($unix_socket_try > 100) { - $self->{errors} = 1; - $self->finish_tunnel($self->{tunnel}); - die "Timeout, migration socket $ruri did not get ready"; - } - $self->{tunnel}->{unix_sockets} = $unix_sockets if (@$unix_sockets); - - } elsif ($ruri =~ /^tcp:/) { - my $ssh_forward_info = []; - if ($raddr eq "localhost") { - # for backwards compatibility with older qemu-server versions - my $pfamily = PVE::Tools::get_host_address_family($nodename); - my $lport = PVE::Tools::next_migrate_port($pfamily); - push @$ssh_forward_info, "$lport:localhost:$rport"; - } - - $self->{tunnel} = $self->fork_tunnel($ssh_forward_info); - - } else { - die "unsupported protocol in migration URI: $ruri\n"; - } - } else { - #fork tunnel for insecure migration, to send faster commands like resume - $self->{tunnel} = $self->fork_tunnel(); - } my $start = time(); my $opt_bwlimit = $self->{opts}->{bwlimit}; -- 2.20.1