From 6328c554c1e9925df73c8891f8061271b7422511 Mon Sep 17 00:00:00 2001 From: Aaron Lauterer Date: Mon, 19 Jun 2023 11:29:28 +0200 Subject: [PATCH] qemuserver: foreach_volid: include pending volumes Make it possible to optionally iterate over disks in the pending section of VMs, similar as to how snapshots are handled already. This is for example useful in the migration if we don't want to rely on the scanning of all storages. All calling sites are adapted and enable it, except for QemuConfig::get_replicatable_volumes as that would cause a change for the replication if pending disks would be included. The following lists the calling sites and if they should be fine with the change (source [0]): 1. QemuMigrate: scan_local_volumes(): needed to include pending disk images 2. API2/Qemu.pm: check_vm_disks_local() for migration precondition: related to migration, so more consistent with pending 3. QemuConfig.pm: get_replicatable_volumes(): would change the behavior of the replication, will not use it for now. 4. QemuServer.pm: get_vm_volumes(): is used multiple times by: 4a. vm_stop_cleanup() to deactivate/unmap: should also be fine with including pending 4b. QemuMigrate.pm: in prepare(): part of migration, so more consistent with pending 4c. QemuMigrate.pm: in phase3_cleanup() for deactivation: part of migration, so more consistent with pending [0] https://lists.proxmox.com/pipermail/pve-devel/2023-May/056868.html Signed-off-by: Aaron Lauterer --- PVE/API2/Qemu.pm | 2 +- PVE/QemuConfig.pm | 2 +- PVE/QemuMigrate.pm | 2 +- PVE/QemuServer.pm | 15 +++++++++++---- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 59307133..c75d9550 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -4232,7 +4232,7 @@ my $check_vm_disks_local = sub { my $local_disks = {}; # add some more information to the disks e.g. cdrom - PVE::QemuServer::foreach_volid($vmconf, sub { + PVE::QemuServer::foreach_volid($vmconf, 1, sub { my ($volid, $attr) = @_; my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid, 1); diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm index 10e69299..5e46db21 100644 --- a/PVE/QemuConfig.pm +++ b/PVE/QemuConfig.pm @@ -161,7 +161,7 @@ sub get_replicatable_volumes { $volhash->{$volid} = 1; }; - PVE::QemuServer::foreach_volid($conf, $test_volid); + PVE::QemuServer::foreach_volid($conf, undef, $test_volid); return $volhash; } diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index 600eeb7f..4058a56e 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -468,7 +468,7 @@ sub scan_local_volumes { if PVE::Storage::volume_is_base_and_used($storecfg, $volid); }; - PVE::QemuServer::foreach_volid($conf, sub { + PVE::QemuServer::foreach_volid($conf, 1, sub { my ($volid, $attr) = @_; eval { $test_volid->($volid, $attr); }; if (my $err = $@) { diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index a79655dd..e1a048c8 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -4840,12 +4840,12 @@ sub set_migration_caps { } sub foreach_volid { - my ($conf, $func, @param) = @_; + my ($conf, $include_pending, $func, @param) = @_; my $volhash = {}; my $test_volid = sub { - my ($key, $drive, $snapname) = @_; + my ($key, $drive, $snapname, $pending) = @_; my $volid = $drive->{file}; return if !$volid; @@ -4861,11 +4861,13 @@ sub foreach_volid { $volhash->{$volid}->{shared} = 1 if $drive->{shared}; $volhash->{$volid}->{referenced_in_config} //= 0; - $volhash->{$volid}->{referenced_in_config} = 1 if !defined($snapname); + $volhash->{$volid}->{referenced_in_config} = 1 if !defined($snapname) && !defined($pending); $volhash->{$volid}->{referenced_in_snapshot}->{$snapname} = 1 if defined($snapname); + $volhash->{$volid}->{referenced_in_pending} = 1 if defined($pending); + my $size = $drive->{size}; $volhash->{$volid}->{size} //= $size if $size; @@ -4887,6 +4889,11 @@ sub foreach_volid { }; PVE::QemuConfig->foreach_volume_full($conf, $include_opts, $test_volid); + + if ($include_pending && defined($conf->{pending}) && $conf->{pending}->%*) { + PVE::QemuConfig->foreach_volume_full($conf->{pending}, $include_opts, $test_volid, undef, 1); + } + foreach my $snapname (keys %{$conf->{snapshots}}) { my $snap = $conf->{snapshots}->{$snapname}; PVE::QemuConfig->foreach_volume_full($snap, $include_opts, $test_volid, $snapname); @@ -6141,7 +6148,7 @@ sub get_vm_volumes { my ($conf) = @_; my $vollist = []; - foreach_volid($conf, sub { + foreach_volid($conf, 1, sub { my ($volid, $attr) = @_; return if $volid =~ m|^/|;