[pve-devel] [PATCH container 3/3] collect errors from all local volumes
Fabian Grünbichler
f.gruenbichler at proxmox.com
Thu Jul 7 16:45:27 CEST 2016
and then die with more meaningful/complete output, instead
of on the first encountered error.
---
src/PVE/LXC/Migrate.pm | 65 ++++++++++++++++++++++++++++++++------------------
1 file changed, 42 insertions(+), 23 deletions(-)
diff --git a/src/PVE/LXC/Migrate.pm b/src/PVE/LXC/Migrate.pm
index 83d2cb9..e846e3b 100644
--- a/src/PVE/LXC/Migrate.pm
+++ b/src/PVE/LXC/Migrate.pm
@@ -101,6 +101,16 @@ sub phase1 {
$self->{volumes} = []; # list of already migrated volumes
my $volhash = {}; # 'config', 'snapshot' or 'storage' for local volumes
+ my $volhash_errors = {};
+ my $other_errors = [];
+ my $abort = 0;
+
+ my $log_error = sub {
+ my ($msg, $volid) = @_;
+
+ $volhash_errors->{$volid} = $msg if !defined($volhash_errors->{$volid});
+ $abort = 1;
+ };
my $test_volid = sub {
my ($volid, $snapname) = @_;
@@ -113,13 +123,17 @@ sub phase1 {
my $scfg = PVE::Storage::storage_check_node($self->{storecfg}, $sid);
PVE::Storage::storage_check_node($self->{storecfg}, $sid, $self->{node});
- return if $scfg->{shared};
+ if ($scfg->{shared}) {
+ $self->log('info', "volume '$volid' is on shared storage '$sid'")
+ if !$snapname;
+ return;
+ }
$volhash->{$volid} = defined($snapname) ? 'snapshot' : 'config';
my ($path, $owner) = PVE::Storage::path($self->{storecfg}, $volid);
- die "can't migrate volume '$volid' - owned by other guest (owner = $owner)\n"
+ die "owned by other guest (owner = $owner)\n"
if !$owner || ($owner != $self->{vmid});
if (defined($snapname)) {
@@ -128,7 +142,7 @@ sub phase1 {
if (($scfg->{type} eq 'zfspool')) {
return;
}
- die "can't migrate snapshot of local volume '$volid'\n";
+ die "non-migratable snapshot exists\n";
}
};
@@ -144,17 +158,11 @@ sub phase1 {
return;
}
- my ($storage, $volname) = PVE::Storage::parse_volume_id($volid);
- my $scfg = PVE::Storage::storage_check_node($self->{storecfg}, $storage);
+ eval {
+ &$test_volid($volid, $snapname);
+ };
- if (!$scfg->{shared}) {
- $self->log('info', "copy mountpoint '$ms' ($volid) to node ' $self->{node}'")
- if !$snapname;
- } else {
- $self->log('info', "mountpoint '$ms' is on shared storage '$storage'")
- if !$snapname;
- }
- &$test_volid($volid, $snapname);
+ &$log_error($@, $volid) if $@;
};
# first unused / lost volumes owned by this container
@@ -192,19 +200,22 @@ sub phase1 {
# additional checks for local storage
foreach my $volid (keys %$volhash) {
- my ($sid, $volname) = PVE::Storage::parse_volume_id($volid);
- my $scfg = PVE::Storage::storage_config($self->{storecfg}, $sid);
+ eval {
+ my ($sid, $volname) = PVE::Storage::parse_volume_id($volid);
+ my $scfg = PVE::Storage::storage_config($self->{storecfg}, $sid);
- my $migratable = ($scfg->{type} eq 'dir') || ($scfg->{type} eq 'zfspool') ||
- ($scfg->{type} eq 'lvmthin') || ($scfg->{type} eq 'lvm');
+ my $migratable = ($scfg->{type} eq 'dir') || ($scfg->{type} eq 'zfspool') ||
+ ($scfg->{type} eq 'lvmthin') || ($scfg->{type} eq 'lvm');
- die "can't migrate '$volid' - storage type '$scfg->{type}' not supported\n"
- if !$migratable;
+ die "storage type '$scfg->{type}' not supported\n"
+ if !$migratable;
- # image is a linked clone on local storage, se we can't migrate.
- if (my $basename = (PVE::Storage::parse_volname($self->{storecfg}, $volid))[3]) {
- die "can't migrate '$volid' as it's a clone of '$basename'";
- }
+ # image is a linked clone on local storage, se we can't migrate.
+ if (my $basename = (PVE::Storage::parse_volname($self->{storecfg}, $volid))[3]) {
+ die "clone of '$basename'";
+ }
+ };
+ &$log_error($@, $volid) if $@;
}
foreach my $volid (sort keys %$volhash) {
@@ -219,6 +230,14 @@ sub phase1 {
}
}
+ foreach my $volid (sort keys %$volhash_errors) {
+ $self->log('warn', "can't migrate local volume '$volid': $volhash_errors->{$volid}");
+ }
+
+ if ($abort) {
+ die "can't migrate CT - check log\n";
+ }
+
foreach my $volid (keys %$volhash) {
my ($sid, $volname) = PVE::Storage::parse_volume_id($volid);
push @{$self->{volumes}}, $volid;
--
2.1.4
More information about the pve-devel
mailing list