From: Christian Ebner <c.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com, pve-devel@lists.proxmox.com
Subject: [PATCH proxmox-backup-qemu 5/8] restore: implement `bw-limit` parameter imposing download rate limits
Date: Tue, 25 Aug 2026 11:17:37 +0200 [thread overview]
Message-ID: <20260825091741.162883-6-c.ebner@proxmox.com> (raw)
In-Reply-To: <20260825091741.162883-1-c.ebner@proxmox.com>
Add an optional `bw-limit` parameter to allow setting a download
bandwidth limit for pbs-restore. Since this is a breaking api change,
expose this in the public api as new function and refactor to keep
common code deduplicated.
Subsequently this new API function will be extend further by a
additional parameter.
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
Cargo.toml | 1 +
current-api.h | 13 +++++++++++++
src/lib.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
src/restore.rs | 9 +++++++--
4 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/Cargo.toml b/Cargo.toml
index 81c46b3..af7a84a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -32,6 +32,7 @@ once_cell = "1.5"
openssl = "0.10"
proxmox-async = "0.5"
+proxmox-human-byte = "1"
proxmox-lang = "1"
proxmox-schema = { version = "5", features = [ "api-macro" ] }
proxmox-sortable-macro = "1"
diff --git a/current-api.h b/current-api.h
index 60d7558..b9a3a44 100644
--- a/current-api.h
+++ b/current-api.h
@@ -319,6 +319,19 @@ struct ProxmoxRestoreHandle *proxmox_restore_new_ns(const char *repo,
const char *fingerprint,
char **error);
+/**
+ * Connect to the backup server for restore (sync)
+ */
+struct ProxmoxRestoreHandle *proxmox_restore_new_ns_rate_limited(const char *repo,
+ const char *snapshot,
+ const char *namespace_,
+ const char *password,
+ const char *keyfile,
+ const char *key_password,
+ const char *fingerprint,
+ const char *bw_limit,
+ char **error);
+
/**
* Open connection to the backup server (sync)
*
diff --git a/src/lib.rs b/src/lib.rs
index 1d4ea21..4d4c28b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -3,12 +3,16 @@
use anyhow::{format_err, Error};
use std::ffi::CString;
use std::os::raw::{c_char, c_int, c_long, c_uchar, c_void};
-use std::ptr;
+use std::ptr::{self, null};
use std::sync::{Arc, Condvar, Mutex};
+use proxmox_human_byte::HumanByte;
use proxmox_lang::try_block;
-use pbs_api_types::{Authid, BackupArchiveName, BackupDir, BackupNamespace, BackupType, CryptMode};
+use pbs_api_types::{
+ Authid, BackupArchiveName, BackupDir, BackupNamespace, BackupType, ClientRateLimitConfig,
+ CryptMode,
+};
use pbs_client::BackupRepository;
pub mod capi_types;
@@ -140,6 +144,7 @@ pub(crate) struct BackupSetup {
pub key_password: Option<String>,
pub master_keyfile: Option<std::path::PathBuf>,
pub fingerprint: Option<String>,
+ pub inbound_rate_limit: Option<ClientRateLimitConfig>,
}
// helper class to implement synchronous interface
@@ -304,6 +309,7 @@ pub extern "C" fn proxmox_backup_new_ns(
key_password,
master_keyfile,
fingerprint,
+ inbound_rate_limit: None,
};
BackupTask::new(setup, compress, crypt_mode)
@@ -816,6 +822,7 @@ pub extern "C" fn proxmox_restore_new(
key_password,
master_keyfile: None,
fingerprint,
+ inbound_rate_limit: None,
};
RestoreTask::new(setup)
@@ -842,6 +849,33 @@ pub extern "C" fn proxmox_restore_new_ns(
key_password: *const c_char,
fingerprint: *const c_char,
error: *mut *mut c_char,
+) -> *mut ProxmoxRestoreHandle {
+ proxmox_restore_new_ns_rate_limited(
+ repo,
+ snapshot,
+ namespace,
+ password,
+ keyfile,
+ key_password,
+ fingerprint,
+ null(),
+ error,
+ )
+}
+
+/// Connect to the backup server for restore (sync)
+#[no_mangle]
+#[allow(clippy::not_unsafe_ptr_arg_deref)]
+pub extern "C" fn proxmox_restore_new_ns_rate_limited(
+ repo: *const c_char,
+ snapshot: *const c_char,
+ namespace: *const c_char,
+ password: *const c_char,
+ keyfile: *const c_char,
+ key_password: *const c_char,
+ fingerprint: *const c_char,
+ bw_limit: *const c_char,
+ error: *mut *mut c_char,
) -> *mut ProxmoxRestoreHandle {
let result: Result<_, Error> = try_block!({
let repo: BackupRepository = tools::utf8_c_string(repo)?
@@ -862,6 +896,16 @@ pub extern "C" fn proxmox_restore_new_ns(
let keyfile = tools::utf8_c_string(keyfile)?.map(std::path::PathBuf::from);
let key_password = tools::utf8_c_string(key_password)?;
let fingerprint = tools::utf8_c_string(fingerprint)?;
+ let inbound_rate_limit = match tools::utf8_c_string(bw_limit)? {
+ Some(rate_limit) => {
+ let rate_limit: HumanByte = rate_limit.parse()?;
+ Some(ClientRateLimitConfig {
+ rate: Some(rate_limit),
+ burst: None,
+ })
+ }
+ None => None,
+ };
let setup = BackupSetup {
host: repo.host().to_owned(),
@@ -876,6 +920,7 @@ pub extern "C" fn proxmox_restore_new_ns(
key_password,
master_keyfile: None,
fingerprint,
+ inbound_rate_limit,
};
RestoreTask::new(setup)
diff --git a/src/restore.rs b/src/restore.rs
index bbe0016..fff0465 100644
--- a/src/restore.rs
+++ b/src/restore.rs
@@ -8,7 +8,7 @@ use tokio::runtime::Runtime;
use proxmox_async::runtime::get_runtime_with_builder;
-use pbs_api_types::BackupArchiveName;
+use pbs_api_types::{BackupArchiveName, RateLimitConfig};
use pbs_client::{BackupReader, HttpClient, HttpClientOptions, RemoteChunkReader};
use pbs_datastore::cached_chunk_reader::CachedChunkReader;
use pbs_datastore::data_blob::DataChunkBuilder;
@@ -91,11 +91,16 @@ impl RestoreTask {
}
pub async fn connect(&self) -> Result<libc::c_int, Error> {
- let options = HttpClientOptions::new_non_interactive(
+ let mut options = HttpClientOptions::new_non_interactive(
self.setup.password.clone(),
self.setup.fingerprint.clone(),
);
+ if let Some(limit) = self.setup.inbound_rate_limit.clone() {
+ let limit = RateLimitConfig::from_client_config(limit);
+ options = options.rate_limit(limit);
+ }
+
let http = HttpClient::new(
&self.setup.host,
self.setup.port,
--
2.47.3
next prev parent reply other threads:[~2026-08-25 9:18 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-25 9:17 [PATCH many 0/8] fix #7530: Implement download bandwidth and restore limits for pbs-restore Christian Ebner
2026-08-25 9:17 ` [PATCH proxmox 1/8] pbs-api-types: expose ClientRateLimitConfig fields as pub Christian Ebner
2026-08-25 9:17 ` [PATCH proxmox-backup-qemu 2/8] restore: fix useless borrow clippy warnings for archive names Christian Ebner
2026-08-25 9:17 ` [PATCH proxmox-backup-qemu 3/8] commands: fix clippy error for reimplementing Result::ok() Christian Ebner
2026-08-25 9:17 ` [PATCH proxmox-backup-qemu 4/8] submodules: bump proxmox-backup submodule to 4.2.5 and fix api changes Christian Ebner
2026-08-25 9:17 ` Christian Ebner [this message]
2026-08-25 9:17 ` [PATCH proxmox-backup-qemu 6/8] restore: implement `rate-limit` imposing chunk data stream limits Christian Ebner
2026-08-25 9:17 ` [PATCH pve-qemu 7/8] fix #7530: pbs-restore: expose optional rate limit parameters Christian Ebner
2026-08-25 9:17 ` [PATCH qemu-server 8/8] pbs-restore: set restore bandwidth limit for volumes 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=20260825091741.162883-6-c.ebner@proxmox.com \
--to=c.ebner@proxmox.com \
--cc=pbs-devel@lists.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