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