From: Jakob Klocker <j.klocker@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [PATCH proxmox-backup v3 1/3] server: pull: run blocking file operations on the blocking pool
Date: Tue, 22 Sep 2026 15:11:08 +0200 [thread overview]
Message-ID: <20260922131110.313302-2-j.klocker@proxmox.com> (raw)
In-Reply-To: <20260922131110.313302-1-j.klocker@proxmox.com>
The atomic renames and the unreferenced-file cleanup are blocking
operations that ran directly on the runtime's worker threads, stalling
other tasks scheduled there for their duration.
Use the tokio counterpart for the renames, the removes, and move the
cleanup onto the blocking thread pool.
Note that tokio::fs runs these on the blocking thread pool, which
carries some overhead over std::fs, but that is acceptable here as these
are one-off operations rather than tight loops.
Signed-off-by: Jakob Klocker <j.klocker@proxmox.com>
---
src/server/pull.rs | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/server/pull.rs b/src/server/pull.rs
index 8165719c4..d4bd07d94 100644
--- a/src/server/pull.rs
+++ b/src/server/pull.rs
@@ -452,7 +452,7 @@ async fn pull_single_archive<'a>(
.with_context(|| archive_prefix.clone())?
.is_none()
{
- let _ = std::fs::remove_file(&tmp_path);
+ let _ = tokio::fs::remove_file(&tmp_path).await;
bail!("{archive_prefix}: archive missing on source");
};
@@ -593,14 +593,14 @@ async fn pull_single_archive<'a>(
}
}
let source_path = if crypt_config.is_some() {
- if let Err(err) = std::fs::remove_file(&tmp_path) {
+ if let Err(err) = tokio::fs::remove_file(&tmp_path).await {
bail!("{archive_prefix}: Failed to remove temp. file {tmp_path:?} failed - {err}");
}
tmp_dec_path
} else {
tmp_path
};
- if let Err(err) = std::fs::rename(&source_path, &path) {
+ if let Err(err) = tokio::fs::rename(&source_path, &path).await {
bail!("{archive_prefix}: Atomic rename file {path:?} failed - {err}");
}
@@ -659,7 +659,7 @@ async fn pull_snapshot<'a>(
.await
.with_context(|| prefix.clone())?
else {
- let _ = std::fs::remove_file(&tmp_manifest_name);
+ let _ = tokio::fs::remove_file(&tmp_manifest_name).await;
log_sender
.log(
Level::INFO,
@@ -710,7 +710,7 @@ async fn pull_snapshot<'a>(
log_sender
.log(Level::INFO, format!("{prefix}: no data changes"))
.await?;
- let _ = std::fs::remove_file(&tmp_manifest_name);
+ let _ = tokio::fs::remove_file(&tmp_manifest_name).await;
Ok::<(), Error>(())
};
@@ -749,7 +749,7 @@ async fn pull_snapshot<'a>(
params.verified_only,
params.encrypted_only,
) {
- let _ = std::fs::remove_file(&tmp_manifest_name);
+ let _ = tokio::fs::remove_file(&tmp_manifest_name).await;
log_sender
.log(
Level::INFO,
@@ -890,7 +890,7 @@ async fn pull_snapshot<'a>(
nix::unistd::fsync(tmp_manifest_file.as_raw_fd())?;
}
- if let Err(err) = std::fs::rename(&tmp_manifest_name, &manifest_name) {
+ if let Err(err) = tokio::fs::rename(&tmp_manifest_name, &manifest_name).await {
bail!("{prefix}: Atomic rename file {manifest_name:?} failed - {err}");
}
if let DatastoreBackend::S3(s3_client) = backend {
@@ -910,8 +910,9 @@ async fn pull_snapshot<'a>(
fetch_log(crypt_config).await?;
- snapshot
- .cleanup_unreferenced_files(&manifest)
+ let snapshot = snapshot.clone();
+ tokio::task::spawn_blocking(move || snapshot.cleanup_unreferenced_files(&manifest))
+ .await?
.map_err(|err| format_err!("{prefix}: failed to cleanup unreferenced files - {err}"))?;
Ok(Some(sync_stats))
--
2.47.3
next prev parent reply other threads:[~2026-09-22 13:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 13:11 [PATCH proxmox-backup v3 0/3] fix #6990: server: drop verify state on push & pull job Jakob Klocker
2026-09-22 13:11 ` Jakob Klocker [this message]
2026-09-22 13:11 ` [PATCH proxmox-backup v3 2/3] fix #6990: server: drop verify state on push job Jakob Klocker
2026-09-22 13:11 ` [PATCH proxmox-backup v3 3/3] fix #6990: server: drop verify state on non-decrypt pull job Jakob Klocker
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=20260922131110.313302-2-j.klocker@proxmox.com \
--to=j.klocker@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox