Check the number of protected backups early if the protected flag
is set.

Suggested-by: Thomas Lamprecht <t.lampre...@proxmox.com>
Signed-off-by: Fabian Ebner <f.eb...@proxmox.com>
---

Dependency bump for guest-common needed.

Arguably, a warning from failing to set notes is not very visible, but
I didn't want to make it a full-blown error.

 PVE/VZDump.pm | 46 +++++++++++++++++++++++++++++++++++++---------
 1 file changed, 37 insertions(+), 9 deletions(-)

diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm
index 8e20c320..1aa3822e 100644
--- a/PVE/VZDump.pm
+++ b/PVE/VZDump.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use Fcntl ':flock';
+use File::Basename;
 use File::Path;
 use IO::File;
 use IO::Select;
@@ -772,21 +773,30 @@ sub exec_backup_task {
            }
        }
 
-       if ($backup_limit && !$opts->{remove}) {
+       if (($backup_limit && !$opts->{remove}) || $opts->{protected}) {
            my $count;
+           my $protected_count;
            if (my $storeid = $opts->{storage}) {
-               my $backups = PVE::Storage::volume_list($cfg, $storeid, $vmid, 
'backup');
-               $count = grep {
-                   !$_->{protected} && (!$_->{subtype} || $_->{subtype} eq 
$vmtype)
-               } $backups->@*;
+               my @backups = grep {
+                   !$_->{subtype} || $_->{subtype} eq $vmtype
+               } PVE::Storage::volume_list($cfg, $storeid, $vmid, 
'backup')->@*;
+
+               $count = grep { !$_->{protected} } @backups;
+               $protected_count = scalar(@backups) - $count;
            } else {
                $count = 
scalar(get_unprotected_backup_file_list($opts->{dumpdir}, $bkname)->@*);
            }
 
-           die "There is a max backup limit of $backup_limit enforced by the".
-               " target storage or the vzdump parameters.".
-               " Either increase the limit or delete old backup(s).\n"
-               if $count >= $backup_limit;
+           if ($opts->{protected}) {
+               my $max_protected = $opts->{scfg}->{'max-protected-backups'} // 
5;
+               if ($max_protected > -1 && $protected_count >= $max_protected) {
+                   die "The number of protected backups per guest is limited 
to $max_protected ".
+                       "on storage '$opts->{storage}'\n";
+               }
+           } elsif ($count >= $backup_limit) {
+               die "There is a max backup limit of $backup_limit enforced by 
the target storage ".
+                   "or the vzdump parameters. Either increase the limit or 
delete old backups.\n";
+           }
        }
 
        if (!$self->{opts}->{pbs}) {
@@ -987,6 +997,24 @@ sub exec_backup_task {
            debugmsg ('info', "archive file size: $cs", $logfd);
        }
 
+       # Mark as protected before pruning.
+       if (my $storeid = $opts->{storage}) {
+           my $volname = $opts->{pbs} ? $task->{target} : 
basename($task->{target});
+           my $volid = "${storeid}:backup/${volname}";
+
+           if ((my $notes = $opts->{notes}) && $opts->{notes} ne '') {
+               debugmsg('info', "adding notes to backup", $logfd);
+               eval { PVE::Storage::update_volume_attribute($cfg, $volid, 
'notes', $notes) };
+               debugmsg('warn', "unable to add notes - $@", $logfd) if $@;
+           }
+
+           if ($opts->{protected}) {
+               debugmsg('info', "marking backup as protected", $logfd);
+               eval { PVE::Storage::update_volume_attribute($cfg, $volid, 
'protected', 1) };
+               die "unable to set protected flag - $@\n" if $@;
+           }
+       }
+
        if ($opts->{remove}) {
            my $keepstr = join(', ', map { "$_=$prune_options->{$_}" } sort 
keys %$prune_options);
            debugmsg ('info', "prune older backups with retention: $keepstr", 
$logfd);
-- 
2.30.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to