[pve-devel] [PATCH qemu-server 11/22] introduce StateFile module for state file related helpers

Fiona Ebner f.ebner at proxmox.com
Thu Jun 12 16:02:42 CEST 2025


The following commit will also move the state file handling which uses
the migration IP to the module.

Since QemuServer.pm does not use QemuMigrate.pm and since state file
handling can be both network migration or regular state file, it seems
best to add a new module. The goal is to make vm_start_nolock() more
readable.

Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---
 PVE/QemuServer.pm           | 44 ++++++++++---------------------------
 PVE/QemuServer/Makefile     |  1 +
 PVE/QemuServer/StateFile.pm | 32 +++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 32 deletions(-)
 create mode 100644 PVE/QemuServer/StateFile.pm

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index b9705367..91b55cf9 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -72,6 +72,7 @@ use PVE::QemuServer::Monitor qw(mon_cmd);
 use PVE::QemuServer::PCI qw(print_pci_addr print_pcie_addr print_pcie_root_port parse_hostpci);
 use PVE::QemuServer::QMPHelpers qw(qemu_deviceadd qemu_devicedel qemu_objectadd qemu_objectdel);
 use PVE::QemuServer::RNG qw(parse_rng print_rng_device_commandline print_rng_object_commandline);
+use PVE::QemuServer::StateFile;
 use PVE::QemuServer::USB;
 use PVE::QemuServer::Virtiofs qw(max_virtiofs start_all_virtiofsd);
 
@@ -5574,6 +5575,7 @@ sub vm_start_nolock {
 
     my $migratedfrom = $migrate_opts->{migratedfrom};
     my $migration_type = $migrate_opts->{type};
+    my $nbd_protocol_version = $migrate_opts->{nbd_proto_version} // 0;
 
     my $res = {};
 
@@ -5638,35 +5640,14 @@ sub vm_start_nolock {
     );
 
     my $migration_ip;
-    my $get_migration_ip = sub {
-	my ($nodename) = @_;
-
-	return $migration_ip if defined($migration_ip);
-
-	my $cidr = $migrate_opts->{network};
-
-	if (!defined($cidr)) {
-	    my $dc_conf = PVE::Cluster::cfs_read_file('datacenter.cfg');
-	    $cidr = $dc_conf->{migration}->{network};
-	}
-
-	if (defined($cidr)) {
-	    my $ips = PVE::Network::get_local_ip_from_cidr($cidr);
-
-	    die "could not get IP: no address configured on local " .
-		"node for network '$cidr'\n" if scalar(@$ips) == 0;
-
-	    die "could not get IP: multiple addresses configured on local " .
-		"node for network '$cidr'\n" if scalar(@$ips) > 1;
-
-	    $migration_ip = @$ips[0];
-	}
-
-	$migration_ip = PVE::Cluster::remote_node_ip($nodename, 1)
-	    if !defined($migration_ip);
-
-	return $migration_ip;
-    };
+    if (
+	($statefile && $statefile eq 'tcp' && $migration_type eq 'insecure')
+	|| ($migrate_opts->{nbd} && ($nbd_protocol_version == 0 || $migration_type eq 'insecure'))
+    ) {
+	my $nodename = nodename();
+	$migration_ip = PVE::QemuServer::StateFile::get_migration_ip(
+	    $nodename, $migrate_opts->{network});
+    }
 
     if ($statefile) {
 	if ($statefile eq 'tcp') {
@@ -5684,7 +5665,7 @@ sub vm_start_nolock {
 	    }
 
 	    if ($migration_type eq 'insecure') {
-		$migrate->{addr} = $get_migration_ip->($nodename);
+		$migrate->{addr} = $migration_ip // die "internal error - no migration IP";
 		$migrate->{addr} = "[$migrate->{addr}]" if Net::IP::ip_is_ipv6($migrate->{addr});
 	    }
 
@@ -5896,7 +5877,6 @@ sub vm_start_nolock {
 
     #start nbd server for storage migration
     if (my $nbd = $migrate_opts->{nbd}) {
-	my $nbd_protocol_version = $migrate_opts->{nbd_proto_version} // 0;
 
 	my $migrate_storage_uri;
 	# nbd_protocol_version > 0 for unix socket support
@@ -5907,7 +5887,7 @@ sub vm_start_nolock {
 	    $res->{migrate}->{unix_sockets} = [$socket_path];
 	} else {
 	    my $nodename = nodename();
-	    my $localip = $get_migration_ip->($nodename);
+	    my $localip = $migration_ip // die "internal error - no migration IP";
 	    my $pfamily = PVE::Tools::get_host_address_family($nodename);
 	    my $storage_migrate_port = PVE::Tools::next_migrate_port($pfamily);
 
diff --git a/PVE/QemuServer/Makefile b/PVE/QemuServer/Makefile
index 8bcd484e..bbd5b5c0 100644
--- a/PVE/QemuServer/Makefile
+++ b/PVE/QemuServer/Makefile
@@ -13,6 +13,7 @@ SOURCES=PCI.pm		\
 	CGroup.pm	\
 	Drive.pm	\
 	QMPHelpers.pm	\
+	StateFile.pm	\
 	Virtiofs.pm
 
 .PHONY: install
diff --git a/PVE/QemuServer/StateFile.pm b/PVE/QemuServer/StateFile.pm
new file mode 100644
index 00000000..e297839b
--- /dev/null
+++ b/PVE/QemuServer/StateFile.pm
@@ -0,0 +1,32 @@
+package PVE::QemuServer::StateFile;
+
+use strict;
+use warnings;
+
+use PVE::Cluster;
+use PVE::Network;
+
+sub get_migration_ip {
+    my ($nodename, $cidr) = @_;
+
+    if (!defined($cidr)) {
+	my $dc_conf = PVE::Cluster::cfs_read_file('datacenter.cfg');
+	$cidr = $dc_conf->{migration}->{network};
+    }
+
+    if (defined($cidr)) {
+	my $ips = PVE::Network::get_local_ip_from_cidr($cidr);
+
+	die "could not get IP: no address configured on local " .
+	    "node for network '$cidr'\n" if scalar(@$ips) == 0;
+
+	die "could not get IP: multiple addresses configured on local " .
+	    "node for network '$cidr'\n" if scalar(@$ips) > 1;
+
+	return $ips->[0];
+    }
+
+    return PVE::Cluster::remote_node_ip($nodename, 1);
+}
+
+1;
-- 
2.39.5





More information about the pve-devel mailing list