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

Reply via email to