Currently, volume activation, PCI reservation and resetting systemd scope happen in between and the 5 second expiretime used for port reservation might not be enough.
Still not ideal, because entering systemd scope and maybe starting swtpm still happen after reservation before the QEMU binary can be invoked and actually use the port, but the reservation needs to happen outside of the fork, because the result is used there too. Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> --- PVE/QemuServer.pm | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index c465fb6f..aeaea8eb 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -5697,6 +5697,9 @@ sub vm_start_nolock { return $migration_ip; }; + # helper to move port reservation and usage closer together to avoid expiry (bug #4501) + my $append_tcp_migration_cmdline; + if ($statefile) { if ($statefile eq 'tcp') { my $migrate = $res->{migrate} = { proto => 'tcp' }; @@ -5717,12 +5720,13 @@ sub vm_start_nolock { $migrate->{addr} = "[$migrate->{addr}]" if Net::IP::ip_is_ipv6($migrate->{addr}); } - my $pfamily = PVE::Tools::get_host_address_family($nodename); - $migrate->{port} = PVE::Tools::next_migrate_port($pfamily); - $migrate->{uri} = "tcp:$migrate->{addr}:$migrate->{port}"; - push @$cmd, '-incoming', $migrate->{uri}; - push @$cmd, '-S'; - + $append_tcp_migration_cmdline = sub { + my $pfamily = PVE::Tools::get_host_address_family($nodename); + $migrate->{port} = PVE::Tools::next_migrate_port($pfamily); + $migrate->{uri} = "tcp:$migrate->{addr}:$migrate->{port}"; + push @$cmd, '-incoming', $migrate->{uri}; + push @$cmd, '-S'; + }; } elsif ($statefile eq 'unix') { # should be default for secure migrations as a ssh TCP forward # tunnel is not deterministic reliable ready and fails regurarly @@ -5840,6 +5844,10 @@ sub vm_start_nolock { $systemd_properties{timeout} = 10 if $statefile; # setting up the scope shoul be quick my $run_qemu = sub { + # sets the port+uri for $res->{migrate} which is printed below and part of the result, so + # needs to happen outside of the fork. + $append_tcp_migration_cmdline->() if $append_tcp_migration_cmdline; + PVE::Tools::run_fork sub { PVE::Systemd::enter_systemd_scope($vmid, "Proxmox VE VM $vmid", %systemd_properties); -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel