From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pve-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9])
	by lore.proxmox.com (Postfix) with ESMTPS id ECF8F1FF170
	for <inbox@lore.proxmox.com>; Thu, 12 Jun 2025 16:03:33 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id 54E251F323;
	Thu, 12 Jun 2025 16:03:09 +0200 (CEST)
From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Date: Thu, 12 Jun 2025 16:02:42 +0200
Message-Id: <20250612140253.106555-12-f.ebner@proxmox.com>
X-Mailer: git-send-email 2.39.5
In-Reply-To: <20250612140253.106555-1-f.ebner@proxmox.com>
References: <20250612140253.106555-1-f.ebner@proxmox.com>
MIME-Version: 1.0
X-SPAM-LEVEL: Spam detection results:  0
 AWL -0.032 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DMARC_MISSING             0.1 Missing DMARC policy
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 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 11/22] introduce StateFile module
 for state file related helpers
X-BeenThere: pve-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/>
List-Post: <mailto:pve-devel@lists.proxmox.com>
List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: pve-devel-bounces@lists.proxmox.com
Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com>

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@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



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel