From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 15344B77B for ; Thu, 7 Apr 2022 12:06:20 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id AF5F53536 for ; Thu, 7 Apr 2022 12:05:49 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 5596234CD for ; Thu, 7 Apr 2022 12:05:47 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 2D1D8459DA for ; Thu, 7 Apr 2022 12:05:47 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Thu, 7 Apr 2022 12:05:40 +0200 Message-Id: <20220407100543.130953-4-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220407100543.130953-1-f.ebner@proxmox.com> References: <20220407100543.130953-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.107 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [vzdump.pm] Subject: [pve-devel] [PATCH v3 manager 1/4] vzdump: support setting protected status X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Apr 2022 10:06:20 -0000 Check the number of protected backups early if the protected flag is set. Suggested-by: Thomas Lamprecht Signed-off-by: Fabian Ebner --- No changes from v2. PVE/VZDump.pm | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm index f34a5969..f0a28a76 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; @@ -780,21 +781,33 @@ 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 = grep { !$_->{mark} || $_->{mark} ne "protected" } get_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 = PVE::Storage::get_max_protected_backups( + $opts->{scfg}, + $opts->{storage}, + ); + 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}) { @@ -995,6 +1008,18 @@ 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 ($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