]> git.proxmox.com Git - qemu-server.git/commitdiff
qemuserver: foreach_volid: include pending volumes
authorAaron Lauterer <a.lauterer@proxmox.com>
Mon, 19 Jun 2023 09:29:28 +0000 (11:29 +0200)
committerFiona Ebner <f.ebner@proxmox.com>
Wed, 21 Jun 2023 10:48:11 +0000 (12:48 +0200)
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 <a.lauterer@proxmox.com>
PVE/API2/Qemu.pm
PVE/QemuConfig.pm
PVE/QemuMigrate.pm
PVE/QemuServer.pm

index 593071331b82880fbb1bace2c2c37dae6c395ad9..c75d95502960101796e93ec46c873bc08412f598 100644 (file)
@@ -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);
index 10e692998e9cdb089273f77a0ce69b262e179c5c..5e46db211da94f510edd467de53a7ef11a4fcd4d 100644 (file)
@@ -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;
 }
index 600eeb7f74acd5fafae8feb45a53b1bad9546b6a..4058a56e686b5f344e3d7df32da1b6adf26119be 100644 (file)
@@ -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 = $@) {
index a79655ddbd159954dc5c66a1040e161c19cb3fa1..e1a048c88f266101674a566e1c66cf9faeeb9c2b 100644 (file)
@@ -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|^/|;