This refactor will allow us to use the same code that decides which mountpoint will be backed up in multiple places and provide a reason for the decision.
Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> --- src/PVE/LXC/Config.pm | 38 ++++++++++++++++++++++++++++++++++++++ src/PVE/VZDump/LXC.pm | 42 +++++++++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm index 760ec23..1dcfc40 100644 --- a/src/PVE/LXC/Config.pm +++ b/src/PVE/LXC/Config.pm @@ -1558,4 +1558,42 @@ sub get_replicatable_volumes { return $volhash; } +sub get_volumes_backup_status { + my ($class, $conf) = @_; + + my $volhash = {}; + + my $test_volid = sub { + my ($volid, $attr) = @_; + + return if !$volid; + + my $status = $class->mountpoint_backup_enabled($volid, $attr); + my $reason = 'not able to determine reason'; + + if ($status == 0) { + if ($attr->{type} ne 'volume') { + $reason = 'not a volume'; + } else { + $reason = 'default exclude'; + } + } elsif ($status == 1) { + if ($volid eq 'rootfs') { + $reason = 'rootfs'; + } elsif (exists($attr->{backup}) && $attr->{backup}) { + $reason = 'manual'; + } + } + + $volhash->{$volid}->{included} = $status; + $volhash->{$volid}->{reason} = $reason; + $volhash->{$volid}->{volume} = $attr->{volume}; + $volhash->{$volid}->{data} = $attr; + }; + + PVE::LXC::Config->foreach_mountpoint($conf, $test_volid); + + return $volhash; +} + 1; diff --git a/src/PVE/VZDump/LXC.pm b/src/PVE/VZDump/LXC.pm index 0260184..df60d08 100644 --- a/src/PVE/VZDump/LXC.pm +++ b/src/PVE/VZDump/LXC.pm @@ -118,24 +118,32 @@ sub prepare { $task->{rootgid} = $rootgid; my $volids = $task->{volids} = []; - PVE::LXC::Config->foreach_mountpoint($conf, sub { - my ($name, $data) = @_; - my $volid = $data->{volume}; - my $mount = $data->{mp}; - my $type = $data->{type}; - - return if !$volid || !$mount; - - if (!PVE::LXC::Config->mountpoint_backup_enabled($name, $data)) { - push @$exclude_dirs, $mount; - $self->loginfo("excluding $type mount point $name ('$mount') from backup"); - return; - } - push @$disks, $data; - push @$volids, $volid - if $type eq 'volume'; - }); + my $backup_status = PVE::LXC::Config->get_volumes_backup_status($conf); + + # mp order is important. rootfs needs to be processed before mpX + my @mp_keys = sort keys %{$backup_status}; + unshift(@mp_keys, pop @mp_keys); + + foreach my $name (@mp_keys) { + my $disk = $backup_status->{$name}; + + my $volid = $disk->{data}->{volume}; + my $mount = $disk->{data}->{mp}; + my $type = $disk->{data}->{type}; + + return if !$volid || !$mount; + + if (exists $disk->{included} && !$disk->{included}) { + push @$exclude_dirs, $mount; + $self->loginfo("excluding $type mount point $name ('$mount') from backup"); + next; + } + + push @$disks, $disk->{data}; + push @$volids, $volid + if $disk->{included}; + } if ($mode eq 'snapshot') { if (!PVE::LXC::Config->has_feature('snapshot', $conf, $storage_cfg, undef, undef, 1)) { -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel