public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Fabian Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v2 manager 4/8] vzdump: support setting protected status
Date: Tue, 29 Mar 2022 14:53:20 +0200	[thread overview]
Message-ID: <20220329125324.120737-9-f.ebner@proxmox.com> (raw)
In-Reply-To: <20220329125324.120737-1-f.ebner@proxmox.com>

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

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

Changes from v1:
    * Split setting notes (now notes-template) into its own patch.
    * Use new helper from storage to determine max-protected-backups.

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

diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm
index fe8a9b28..eab4f240 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;
@@ -779,21 +780,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 = 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 = 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}) {
@@ -994,6 +1007,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





  parent reply	other threads:[~2022-03-29 12:53 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-29 12:53 [pve-devel] [PATCH-SERIES v2 storage/manager/guest-common/docs] improvements for protected backups Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 storage 1/1] plugins: allow limiting the number of protected backups per guest Fabian Ebner
2022-04-06 10:42   ` [pve-devel] applied: " Fabian Grünbichler
2022-03-29 12:53 ` [pve-devel] [PATCH v2 manager 1/8] vzdump: backup file list: drop unused parameter Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 manager 2/8] vzdump: backup limit: only count unprotected backups Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [RFC v2 manager 3/8] ui: storage edit: retention: add max-protected-backups setting Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 docs 1/2] storage: switch to prune-backups in examples Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 docs 2/2] vzdump/storage: mention protected backups limit and give an example Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 guest-common 1/1] vzdump: schema: add 'notes-template' and 'protected' properties Fabian Ebner
2022-03-29 12:53 ` Fabian Ebner [this message]
2022-03-29 12:53 ` [pve-devel] [PATCH v2 manager 5/8] partially close #438: vzdump: support setting notes-template Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 manager 6/8] ui: backup: allow setting protected and notes-template for manual backup Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 manager 7/8] close #438: ui: backup job: allow setting a notes-template for a job Fabian Ebner
2022-03-29 12:53 ` [pve-devel] [PATCH v2 manager 8/8] ui: backup job: set guest name as default notes-template Fabian Ebner
2022-04-06 12:10 ` [pve-devel] partially-applied: [PATCH-SERIES v2 storage/manager/guest-common/docs] improvements for protected backups Fabian Grünbichler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220329125324.120737-9-f.ebner@proxmox.com \
    --to=f.ebner@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal