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 99F5570908 for ; Mon, 6 Sep 2021 12:58:30 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6F5E8F955 for ; Mon, 6 Sep 2021 12:58:00 +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 E4D29F8CF for ; Mon, 6 Sep 2021 12:57:56 +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 B9388445CA for ; Mon, 6 Sep 2021 12:57:56 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Mon, 6 Sep 2021 12:57:46 +0200 Message-Id: <20210906105755.2651203-4-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210906105755.2651203-1-d.csapak@proxmox.com> References: <20210906105755.2651203-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.434 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 Subject: [pbs-devel] [PATCH proxmox-backup 03/12] add protected info of snapshots to api and task logs X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Sep 2021 10:58:30 -0000 adds the info that a snapshot is protected to: * snapshot list * manual pruning (also dry-run) * prune jobs Signed-off-by: Dominik Csapak --- pbs-api-types/src/lib.rs | 2 ++ pbs-datastore/src/prune.rs | 11 +++++++---- src/api2/admin/datastore.rs | 11 ++++++++--- src/server/prune_job.rs | 4 ++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs index 427b2d9f..eba68ce5 100644 --- a/pbs-api-types/src/lib.rs +++ b/pbs-api-types/src/lib.rs @@ -411,6 +411,8 @@ pub struct SnapshotListItem { /// The owner of the snapshots group #[serde(skip_serializing_if = "Option::is_none")] pub owner: Option, + /// Protection from prunes + pub protected: bool, } #[api( diff --git a/pbs-datastore/src/prune.rs b/pbs-datastore/src/prune.rs index 6b76e9d7..6b9c2bbb 100644 --- a/pbs-datastore/src/prune.rs +++ b/pbs-datastore/src/prune.rs @@ -225,7 +225,7 @@ impl PruneOptions { pub fn compute_prune_info( mut list: Vec, options: &PruneOptions, -) -> Result, Error> { +) -> Result, Error> { let mut mark = HashMap::new(); @@ -273,15 +273,18 @@ pub fn compute_prune_info( })?; } - let prune_info: Vec<(BackupInfo, bool)> = list.into_iter() + let prune_info: Vec<(BackupInfo, bool, bool)> = list.into_iter() .map(|info| { let backup_id = info.backup_dir.relative_path(); + let protected = info.protected; let keep = match mark.get(&backup_id) { Some(PruneMark::Keep) => true, Some(PruneMark::KeepPartial) => true, - _ => false, + Some(PruneMark::Protected) => true, + _ => if protected { true } else { false }, }; - (info, keep) + + (info, keep, protected) }) .collect(); diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 5470de73..f49cdbee 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -444,6 +444,7 @@ pub fn list_snapshots ( let backup_type = group.backup_type().to_string(); let backup_id = group.backup_id().to_string(); let backup_time = info.backup_dir.backup_time(); + let protected = info.backup_dir.is_protected(base_path.clone()); match get_all_snapshot_files(&datastore, &info) { Ok((manifest, files)) => { @@ -482,6 +483,7 @@ pub fn list_snapshots ( files, size, owner, + protected, } }, Err(err) => { @@ -506,6 +508,7 @@ pub fn list_snapshots ( files, size: None, owner, + protected, } }, } @@ -849,7 +852,7 @@ pub fn prune( let keep_all = !prune_options.keeps_something(); if dry_run { - for (info, mut keep) in prune_info { + for (info, mut keep, protected) in prune_info { if keep_all { keep = true; } let backup_time = info.backup_dir.backup_time(); @@ -860,6 +863,7 @@ pub fn prune( "backup-id": group.backup_id(), "backup-time": backup_time, "keep": keep, + "protected": protected, })); } return Ok(json!(prune_result)); @@ -877,7 +881,7 @@ pub fn prune( store, backup_type, backup_id)); } - for (info, mut keep) in prune_info { + for (info, mut keep, protected) in prune_info { if keep_all { keep = true; } let backup_time = info.backup_dir.backup_time(); @@ -890,7 +894,7 @@ pub fn prune( group.backup_type(), group.backup_id(), timestamp, - if keep { "keep" } else { "remove" }, + if keep { if protected { "keep (protected)" } else { "keep" } } else { "remove" }, ); worker.log(msg); @@ -900,6 +904,7 @@ pub fn prune( "backup-id": group.backup_id(), "backup-time": backup_time, "keep": keep, + "protected": protected, })); if !(dry_run || keep) { diff --git a/src/server/prune_job.rs b/src/server/prune_job.rs index 2ea8b713..bfe2bd9e 100644 --- a/src/server/prune_job.rs +++ b/src/server/prune_job.rs @@ -66,12 +66,12 @@ pub fn prune_datastore( group.backup_id() ); - for (info, mut keep) in prune_info { + for (info, mut keep, protected) in prune_info { if keep_all { keep = true; } task_log!( worker, "{} {}/{}/{}", - if keep { "keep" } else { "remove" }, + if keep { if protected { "keep (protected)" } else { "keep" } } else { "remove" }, group.backup_type(), group.backup_id(), info.backup_dir.backup_time_string() -- 2.30.2