From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server 6/6] migration: intra-cluster: check config can be parsed on target node
Date: Fri, 20 Feb 2026 14:36:14 +0100 [thread overview]
Message-ID: <20260220133911.135593-7-f.ebner@proxmox.com> (raw)
In-Reply-To: <20260220133911.135593-1-f.ebner@proxmox.com>
For remote migration, we already check that the config can be parsed
on the target. Do the same for intra-cluster migration, to avoid
issues like [0] for future new settings, with lines being unexpectedly
and relatively silently dropped (there are warnings in the target's
system logs).
Unfortunately, before commit "qm: mtunnel: reply when a command is
unknown", which is part of the same patch series, when a command is
unknown, mtunnel did not reply at all. Therefore, this delays
backwards migrations to qemu-server versions less than the next bumped
version (at the time of this writing expected to be 9.1.5) by 3
seconds.
[0]: https://bugzilla.proxmox.com/show_bug.cgi?id=7341
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
For easier testing:
# commented out so 'git am' does not apply it O;)
# diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
# index 545758dc..b914314e 100644
# --- a/src/PVE/QemuServer.pm
# +++ b/src/PVE/QemuServer.pm
# @@ -236,6 +236,13 @@ my $spice_enhancements_fmt = {
# };
#
# my $confdesc = {
#+ 'shiny-new' => {
#+ type => 'string',
#+ enum => ['shiny', 'new'],
#+ default => 'shiny',
#+ optional => 1,
#+ description => "you know you want it",
#+ },
# onboot => {
# optional => 1,
# type => 'boolean',
src/PVE/API2/Qemu.pm | 4 +++-
src/PVE/QemuMigrate.pm | 23 +++++++++++++++++++++++
src/test/MigrationTest/QemuMigrateMock.pm | 11 ++++++++++-
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/PVE/API2/Qemu.pm b/src/PVE/API2/Qemu.pm
index c2e185a6..6828b1fc 100644
--- a/src/PVE/API2/Qemu.pm
+++ b/src/PVE/API2/Qemu.pm
@@ -5393,7 +5393,9 @@ __PACKAGE__->register_method({
force => {
type => 'boolean',
description =>
- "Allow to migrate VMs which use local devices. Only root may use this option.",
+ "Allow to migrate VMs which use local devices and for intra-cluster migration,"
+ . " configuration options not understood by the target. Only root may use this"
+ . " option.",
optional => 1,
},
migration_type => {
diff --git a/src/PVE/QemuMigrate.pm b/src/PVE/QemuMigrate.pm
index f7ec3227..0ea6385a 100644
--- a/src/PVE/QemuMigrate.pm
+++ b/src/PVE/QemuMigrate.pm
@@ -355,6 +355,29 @@ sub prepare {
my $cmd = [@{ $self->{rem_ssh} }, '/bin/true'];
eval { $self->cmd_quiet($cmd); };
die "Can't connect to destination address using public key\n" if $@;
+
+ if (!$self->{opts}->{force}) {
+ # Fork a short-lived tunnel for checking the config. Later, the proper tunnel with SSH
+ # forwaring info is forked.
+ my $tunnel = $self->fork_tunnel();
+ # Compared to remote migration, which also does volume activation, this only strictly
+ # parses the config, so no large timeout is needed. Unfortunately, mtunnel did not
+ # indicate that a command is unknown, but not reply at all, so the timeout must be very
+ # low right now.
+ # FIXME PVE 10 - bump timeout, the trade-off between delaying backwards migration and
+ # giving config check more time should now be in favor of config checking
+ eval {
+ my $nodename = PVE::INotify::nodename();
+ PVE::Tunnel::write_tunnel($tunnel, 3, "config $vmid $nodename");
+ };
+ if (my $err = $@) {
+ chomp($err);
+ # if there is no reply, assume target did not know the command yet
+ die "$err - use --force to migrate regardless\n" if $err !~ m/^no reply to command/;
+ }
+ eval { PVE::Tunnel::finish_tunnel($tunnel); };
+ $self->log('warn', "failed to finish tunnel in prepare() - $@") if $@;
+ }
}
return $running;
diff --git a/src/test/MigrationTest/QemuMigrateMock.pm b/src/test/MigrationTest/QemuMigrateMock.pm
index df8b575a..170634de 100644
--- a/src/test/MigrationTest/QemuMigrateMock.pm
+++ b/src/test/MigrationTest/QemuMigrateMock.pm
@@ -65,6 +65,10 @@ $tunnel_module->mock(
my $vmid = $1;
die "resuming wrong VM '$vmid'\n" if $vmid ne $test_vmid;
return;
+ } elsif ($command =~ m/^config (\d+) (\S+)$/) {
+ my ($vmid, $node) = ($1, $2);
+ die "check config for wrong VM '$vmid'\n" if $vmid ne $test_vmid;
+ return;
}
die "write_tunnel (mocked) - implement me: $command\n";
},
@@ -73,7 +77,12 @@ $tunnel_module->mock(
my $qemu_migrate_module = Test::MockModule->new("PVE::QemuMigrate");
$qemu_migrate_module->mock(
fork_tunnel => sub {
- die "fork_tunnel (mocked) - implement me\n"; # currently no call should lead here
+ return {
+ writer => "mocked",
+ reader => "mocked",
+ pid => 123456,
+ version => 1,
+ };
},
start_remote_tunnel => sub {
my ($self, $raddr, $rport, $ruri, $unix_socket_info) = @_;
--
2.47.3
prev parent reply other threads:[~2026-02-20 13:39 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-20 13:36 [PATCH-SERIES qemu-server 0/6] migration: strict config check for intra-cluster migration Fiona Ebner
2026-02-20 13:36 ` [PATCH qemu-server 1/6] d/control: bump versioned build dependency for libpve-common-perl to 9.0.12 Fiona Ebner
2026-02-20 13:36 ` [PATCH qemu-server 2/6] tests: migration: get rid of mocking for removed PVE::QemuMigrate::read_tunnel() Fiona Ebner
2026-02-20 13:36 ` [PATCH qemu-server 3/6] qm: mtunnel: avoid using deprecated check_running() helper Fiona Ebner
2026-02-20 13:36 ` [PATCH qemu-server 4/6] mtunnel: add 'conf' command to do strict configuration parsing Fiona Ebner
2026-02-20 13:36 ` [PATCH qemu-server 5/6] qm: mtunnel: reply when a command is unknown Fiona Ebner
2026-02-20 13:36 ` Fiona Ebner [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260220133911.135593-7-f.ebner@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.