[pve-devel] [PATCH qemu-server 4/4] collect errors from all local volumes
Fabian Grünbichler
f.gruenbichler at proxmox.com
Fri Jun 24 09:46:37 CEST 2016
and then die with more meaningful output, instead of on the
first encountered error.
---
PVE/QemuMigrate.pm | 64 ++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 52 insertions(+), 12 deletions(-)
diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
index 2b383fa..6415032 100644
--- a/PVE/QemuMigrate.pm
+++ b/PVE/QemuMigrate.pm
@@ -227,9 +227,23 @@ sub sync_disks {
# found local volumes and their origin
my $local_volumes = {};
+ my $local_volumes_errors = {};
+ my $other_errors = [];
+ my $abort = 0;
my $sharedvm = 1;
+ my $log_error = sub {
+ my ($msg, $volid) = @_;
+
+ if (defined($volid)) {
+ $local_volumes_errors->{$volid} = $msg;
+ } else {
+ push @$other_errors, $msg;
+ }
+ $abort = 1;
+ };
+
my @sids = PVE::Storage::storage_ids($self->{storecfg});
foreach my $storeid (@sids) {
my $scfg = PVE::Storage::storage_config($self->{storecfg}, $storeid);
@@ -257,10 +271,20 @@ sub sync_disks {
return if !$volid;
- die "can't migrate local file/device '$volid'\n" if $volid =~ m|^/|;
+ if ($volid =~ m|^/|) {
+ $local_volumes->{$volid} = 'config';
+ die "local file/device\n";
+ }
if ($is_cdrom) {
- die "can't migrate local cdrom drive\n" if $volid eq 'cdrom';
+ if ($volid eq 'cdrom') {
+ my $msg = "can't migrate local cdrom drive";
+ $msg .= " (referenced in snapshot '$snapname')"
+ if defined($snapname);
+
+ &$log_error("$msg\n");
+ return;
+ }
return if $volid eq 'none';
}
@@ -276,11 +300,11 @@ sub sync_disks {
$local_volumes->{$volid} = defined($snapname) ? 'snapshot' : 'config';
- die "can't migrate local cdrom '$volid'\n" if $is_cdrom;
+ die "local cdrom image\n" if $is_cdrom;
my ($path, $owner) = PVE::Storage::path($self->{storecfg}, $volid);
- die "can't migrate volume '$volid' - owned by other VM (owner = VM $owner)\n"
+ die "owned by other VM (owner = VM $owner)\n"
if !$owner || ($owner != $self->{vmid});
if (defined($snapname)) {
@@ -289,24 +313,29 @@ sub sync_disks {
my $format = PVE::QemuServer::qemu_img_format($scfg, $volname);
- if (($scfg->{type} eq 'zfspool') || ($format eq 'qcow2')) {
- return;
+ if (!($scfg->{type} eq 'zfspool') || ($format eq 'qcow2')) {
+ die "non-migratable snapshot exists\n";
}
-
- die "can't migrate snapshot of local volume '$volid'\n";
-
}
};
my $test_drive = sub {
my ($ds, $drive, $snapname) = @_;
- &$test_volid($drive->{file}, PVE::QemuServer::drive_is_cdrom($drive), $snapname);
+ eval {
+ &$test_volid($drive->{file}, PVE::QemuServer::drive_is_cdrom($drive), $snapname);
+ };
+
+ &$log_error($@, $drive->{file}) if $@;
};
foreach my $snapname (keys %{$conf->{snapshots}}) {
- &$test_volid($conf->{snapshots}->{$snapname}->{'vmstate'}, 0, undef)
- if defined($conf->{snapshots}->{$snapname}->{'vmstate'});
+ eval {
+ &$test_volid($conf->{snapshots}->{$snapname}->{'vmstate'}, 0, undef)
+ if defined($conf->{snapshots}->{$snapname}->{'vmstate'});
+ };
+ &$log_error($@, $conf->{snapshots}->{$snapname}->{'vmstate'}) if $@;
+
PVE::QemuServer::foreach_drive($conf->{snapshots}->{$snapname}, $test_drive, $snapname);
}
PVE::QemuServer::foreach_drive($conf, $test_drive);
@@ -323,10 +352,21 @@ sub sync_disks {
}
}
+ foreach my $vol (sort keys %$local_volumes_errors) {
+ $self->log('warn', "can't migrate local disk '$vol': $local_volumes_errors->{$vol}");
+ }
+ foreach my $err (@$other_errors) {
+ $self->log('warn', "$err");
+ }
+
if ($self->{running} && !$sharedvm) {
die "can't do online migration - VM uses local disks\n";
}
+ if ($abort) {
+ die "can't migrate VM - check log\n";
+ }
+
# additional checks for local storage
foreach my $volid (keys %$local_volumes) {
my ($sid, $volname) = PVE::Storage::parse_volume_id($volid);
--
2.1.4
More information about the pve-devel
mailing list