From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: Proxmox Backup Server development discussion
<pbs-devel@lists.proxmox.com>
Subject: Re: [pbs-devel] [RFC v2 proxmox-backup 02/21] datastore: mark groups as trash on destroy
Date: Fri, 09 May 2025 14:27:51 +0200 [thread overview]
Message-ID: <1746790386.nzu2zcr38q.astroid@yuna.none> (raw)
In-Reply-To: <20250508130555.494782-3-c.ebner@proxmox.com>
On May 8, 2025 3:05 pm, Christian Ebner wrote:
> In order to implement the trash can functionality, mark all the
> snapshots of the group and the group itself as trash instead of
> deleting them right away. Cleanup of the group is deferred to the
> garbage collection.
>
> Groups and snapshots are marked by the trash marker file. New backups
> to this group will check for the marker file (see subsequent
> commits), clearing the whole group and all of the snapshots to
> create a new snapshot within that group. Otherwise ownership
> conflicts could arise. This implies that a new backup clears the
> whole trashed group.
this seems a bit surprising.. couldn't we check the new and older owner,
and abort if there's a mismatch, but proceed otherwise?
the implementation of this also doesn't happen in this patch though, so
maybe drop it here in any case - this just implements trashing groups..
> Snapshots already marked as trash within the same backup group will
> be cleared as well when the group is requested to be destroyed with
> skip trash.
this makes sense
>
> Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
> ---
> pbs-datastore/src/backup_info.rs | 19 ++++++++++++++++---
> pbs-datastore/src/datastore.rs | 4 ++--
> 2 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/pbs-datastore/src/backup_info.rs b/pbs-datastore/src/backup_info.rs
> index 76bcd15f5..9ce4cb0f8 100644
> --- a/pbs-datastore/src/backup_info.rs
> +++ b/pbs-datastore/src/backup_info.rs
> @@ -215,7 +215,7 @@ impl BackupGroup {
> ///
> /// Returns `BackupGroupDeleteStats`, containing the number of deleted snapshots
> /// and number of protected snaphsots, which therefore were not removed.
> - pub fn destroy(&self) -> Result<BackupGroupDeleteStats, Error> {
> + pub fn destroy(&self, skip_trash: bool) -> Result<BackupGroupDeleteStats, Error> {
> let _guard = self
> .lock()
> .with_context(|| format!("while destroying group '{self:?}'"))?;
> @@ -229,14 +229,20 @@ impl BackupGroup {
> delete_stats.increment_protected_snapshots();
> continue;
> }
> - snap.destroy(false, false)?;
> + snap.destroy(false, skip_trash)?;
> delete_stats.increment_removed_snapshots();
> }
>
> // Note: make sure the old locking mechanism isn't used as `remove_dir_all` is not safe in
> // that case
> if delete_stats.all_removed() && !*OLD_LOCKING {
> - self.remove_group_dir()?;
> + if skip_trash {
> + self.remove_group_dir()?;
> + } else {
> + let path = self.full_group_path().join(TRASH_MARKER_FILENAME);
> + let _trash_file =
> + std::fs::File::create(path).context("failed to set trash file")?;
> + }
> delete_stats.increment_removed_groups();
> }
>
> @@ -245,6 +251,13 @@ impl BackupGroup {
>
> /// Helper function, assumes that no more snapshots are present in the group.
> fn remove_group_dir(&self) -> Result<(), Error> {
> + let trash_path = self.full_group_path().join(TRASH_MARKER_FILENAME);
> + if let Err(err) = std::fs::remove_file(&trash_path) {
> + if err.kind() != std::io::ErrorKind::NotFound {
> + bail!("removing the trash file '{trash_path:?}' failed - {err}")
> + }
> + }
> +
> let owner_path = self.store.owner_path(&self.ns, &self.group);
>
> std::fs::remove_file(&owner_path).map_err(|err| {
> diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs
> index 6df26e825..e546bc532 100644
> --- a/pbs-datastore/src/datastore.rs
> +++ b/pbs-datastore/src/datastore.rs
> @@ -581,7 +581,7 @@ impl DataStore {
> let mut stats = BackupGroupDeleteStats::default();
>
> for group in self.iter_backup_groups(ns.to_owned())? {
> - let delete_stats = group?.destroy()?;
> + let delete_stats = group?.destroy(true)?;
> stats.add(&delete_stats);
> removed_all_groups = removed_all_groups && delete_stats.all_removed();
> }
> @@ -674,7 +674,7 @@ impl DataStore {
> ) -> Result<BackupGroupDeleteStats, Error> {
> let backup_group = self.backup_group(ns.clone(), backup_group.clone());
>
> - backup_group.destroy()
> + backup_group.destroy(true)
> }
>
> /// Remove a backup directory including all content
> --
> 2.39.5
>
>
>
> _______________________________________________
> pbs-devel mailing list
> pbs-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
>
>
>
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
next prev parent reply other threads:[~2025-05-09 12:27 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-08 13:05 [pbs-devel] [RFC v2 proxmox-backup 00/21] implement trash bin functionality Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 01/21] datastore/api: mark snapshots as trash on destroy Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 02/21] datastore: mark groups " Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler [this message]
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 03/21] datastore: allow filtering of backups by their trash status Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-12 9:32 ` Christian Ebner
2025-05-12 10:08 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 04/21] datastore: ignore trashed snapshots for last successful backup Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 05/21] sync: ignore trashed snapshots when reading from local source Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 06/21] api: tape: check trash marker when trying to write snapshot Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-12 9:19 ` Christian Ebner
2025-05-12 9:38 ` Fabian Grünbichler
2025-05-12 9:46 ` Christian Ebner
2025-05-12 9:55 ` Christian Ebner
2025-05-12 10:09 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 07/21] sync: ignore trashed groups in local source reader Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 08/21] datastore: namespace: add filter for trash status Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 09/21] datastore: refactor recursive namespace removal Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 10/21] datastore: mark namespace as trash instead of deleting it Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-12 7:47 ` Christian Ebner
2025-05-12 9:46 ` Fabian Grünbichler
2025-05-12 10:35 ` Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 11/21] datastore: check for trash marker in namespace exists check Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 12/21] datastore: clear trashed snapshot dir if re-creation requested Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-12 8:31 ` Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 13/21] datastore: recreate trashed backup groups if requested Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-12 8:05 ` Christian Ebner
2025-05-12 10:02 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 14/21] datastore: GC: clean-up trashed snapshots, groups and namespaces Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 15/21] client: expose skip trash flags for cli commands Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 16/21] api: datastore: add flag to list trashed snapshots only Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-12 7:57 ` Christian Ebner
2025-05-12 10:01 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 17/21] api: namespace: add option to list all namespaces, including trashed Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 18/21] api: admin: implement endpoints to restore trashed contents Christian Ebner
2025-05-09 12:27 ` Fabian Grünbichler
2025-05-09 12:59 ` Christian Ebner
2025-05-12 10:03 ` Fabian Grünbichler
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 19/21] ui: add recover for trashed items tab to datastore panel Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 20/21] ui: drop 'permanent' in group/snapshot forget, default is to trash Christian Ebner
2025-05-08 13:05 ` [pbs-devel] [RFC v2 proxmox-backup 21/21] ui: allow to skip trash on namespace deletion Christian Ebner
2025-05-13 13:54 ` [pbs-devel] superseded: [RFC v2 proxmox-backup 00/21] implement trash bin functionality Christian Ebner
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=1746790386.nzu2zcr38q.astroid@yuna.none \
--to=f.gruenbichler@proxmox.com \
--cc=pbs-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal