From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pbs-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 3A7B51FF16B for <inbox@lore.proxmox.com>; Thu, 17 Apr 2025 11:29:38 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id ADE44F48D; Thu, 17 Apr 2025 11:29:35 +0200 (CEST) Date: Thu, 17 Apr 2025 11:29:28 +0200 From: Fabian =?iso-8859-1?q?Gr=FCnbichler?= <f.gruenbichler@proxmox.com> To: Proxmox Backup Server development discussion <pbs-devel@lists.proxmox.com> References: <20250416141803.479125-1-c.ebner@proxmox.com> <20250416141803.479125-4-c.ebner@proxmox.com> In-Reply-To: <20250416141803.479125-4-c.ebner@proxmox.com> MIME-Version: 1.0 User-Agent: astroid/0.16.0 (https://github.com/astroidmail/astroid) Message-Id: <1744880920.s4f2qkbhp2.astroid@yuna.none> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.046 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy 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: Re: [pbs-devel] [RFC proxmox-backup 3/4] datastore: move snapshots to trash folder on destroy X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion <pbs-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/> List-Post: <mailto:pbs-devel@lists.proxmox.com> List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox Backup Server development discussion <pbs-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" <pbs-devel-bounces@lists.proxmox.com> On April 16, 2025 4:18 pm, Christian Ebner wrote: > Instead of directly deleting the snapshot directory and it's contents > on a prune, move the snapshot directory into the `.trash` subfolder > of the datastore. > > This allows to mark chunks which were used by these index files if > the snapshot was pruned during an ongoing garbage collection. > Garbage collection will clean up these files before starting with the > marking phase 1 and read all index files after completing that phase, > touching these chunks as well. some other variants to maybe consider: marking the snapshot itself as trash (in the manifest, or by adding a trash marker file inside the dir) - this would mean that there is no iterator race issue when undoing a prune, no double-pruning collisions, .. - but it also means we need to adapt all call sites that should skip trashed snapshots (most existing ones), which is more churn. having a trash dir per group instead of a global one for the whole datastore (less likely to incur extra costs in case somebody has a weird setup where namespaces/.. are symlinked or bindmounted or similar shenanigans). would need to postpone group removal to GC in case all snapshots are pruned. > > Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com> > Signed-off-by: Christian Ebner <c.ebner@proxmox.com> > --- > pbs-datastore/src/backup_info.rs | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/pbs-datastore/src/backup_info.rs b/pbs-datastore/src/backup_info.rs > index d4732fdd9..cd0d521c9 100644 > --- a/pbs-datastore/src/backup_info.rs > +++ b/pbs-datastore/src/backup_info.rs > @@ -588,11 +588,19 @@ impl BackupDir { > bail!("cannot remove protected snapshot"); // use special error type? > } > > + let relative_path = self.relative_path(); > + let mut trash_path = self.store.base_path(); > + trash_path.push(".trash/"); > + trash_path.push(relative_path); > + if let Some(parent) = trash_path.parent() { > + std::fs::create_dir_all(&parent) > + .with_context(|| format!("creating trash folders for {trash_path:?} failed"))?; > + } > + > let full_path = self.full_path(); > log::info!("removing backup snapshot {:?}", full_path); > - std::fs::remove_dir_all(&full_path).map_err(|err| { > - format_err!("removing backup snapshot {:?} failed - {}", full_path, err,) > - })?; > + std::fs::rename(&full_path, trash_path) > + .with_context(|| format!("moving backup snapshot {full_path:?} to trash failed"))?; > > // remove no longer needed lock files > let _ = std::fs::remove_file(self.manifest_lock_path()); // ignore errors > -- > 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