d03e1b3ce3
User-facing breaking change: The slirp submodule for user networking got removed. It would be necessary to add the --enable-slirp option to the build and/or install the appropriate library to continue building it. Since PVE is not explicitly supporting it, it would require additionally installing the libslirp0 package on all installations and there is *very* little mention on the community forum when searching for "slirp" or "netdev user", the plan is to only enable it again if there is some real demand for it. Notable changes: * The big change for this release is the rework of job locking, using a job mutex and introducing _locked() variants of job API functions moving away from call-side AioContext locking. See (in the qemu submodule) commit 6f592e5aca ("job.c: enable job lock/unlock and remove Aiocontext locks") and previous commits for context. Changes required for the backup patches: * Use WITH_JOB_LOCK_GUARD() and call the _locked() variant of job API functions where appropriate (many are only availalbe as a _locked() variant). * Remove acquiring/releasing AioContext around functions taking the job mutex lock internally. The patch introducing sequential transaction support for jobs needs to temporarily unlock the job mutex to call job_start() when starting the next job in the transaction. * The zeroinit block driver now marks its child as primary. The documentation in include/block/block-common.h states: > Filter node has exactly one FILTERED|PRIMARY child, and may have > other children which must not have these bits Without this, an assert will trigger when copying to a zeroinit target with qemu-img convert, because bdrv_child_cb_attach() expects any non-PRIMARY child to be not FILTERED: > qemu-img convert -n -p -f raw -O raw input.raw zeroinit:output.raw > qemu-img: ../block.c:1476: bdrv_child_cb_attach: Assertion > `!(child->role & BDRV_CHILD_FILTERED)' failed. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
145 lines
5.4 KiB
Diff
145 lines
5.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Fiona Ebner <f.ebner@proxmox.com>
|
|
Date: Mon, 3 Oct 2022 15:52:04 +0200
|
|
Subject: [PATCH] PVE Backup: allow passing max-workers performance setting
|
|
|
|
For query-proxmox-support, add an indication that it's possible to use
|
|
the setting.
|
|
|
|
For now, the other two BackupPerf settings are not exposed:
|
|
|
|
* use-copy-range: would need to be implemented by the backup-dump
|
|
block driver first, and in fact, the default for backup was changed,
|
|
because it wasn't as fast for backup in QEMU, see commit
|
|
6a30f663d4c0b3c45a544d541e0c4e214b2473a1.
|
|
|
|
* max-chunk: enforced to be at least the backup cluster size, which is
|
|
4 MiB for PBS and otherwise maximum of source and target cluster size.
|
|
And block-copy has a maximum buffer size of 1 MiB, so setting a larger
|
|
max-chunk doesn't even have an effect. To make the setting sensibly
|
|
usable the check would need to be removed and optionally the
|
|
block-copy max buffer size would need to be bumped. I tried doing just
|
|
that, and tested different source/target combinations with different
|
|
max-chunk settings, but there were no noticable improvements over the
|
|
default "unlimited" (resulting in 1 MiB for block-copy).
|
|
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
---
|
|
block/monitor/block-hmp-cmds.c | 4 +++-
|
|
pve-backup.c | 18 +++++++++++++-----
|
|
qapi/block-core.json | 9 +++++++--
|
|
3 files changed, 23 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
|
|
index 57b2457f1e..ab0c988ae9 100644
|
|
--- a/block/monitor/block-hmp-cmds.c
|
|
+++ b/block/monitor/block-hmp-cmds.c
|
|
@@ -1049,7 +1049,9 @@ void coroutine_fn hmp_backup(Monitor *mon, const QDict *qdict)
|
|
false, false, // PBS encrypt
|
|
true, dir ? BACKUP_FORMAT_DIR : BACKUP_FORMAT_VMA,
|
|
false, NULL, false, NULL, !!devlist,
|
|
- devlist, qdict_haskey(qdict, "speed"), speed, &error);
|
|
+ devlist, qdict_haskey(qdict, "speed"), speed,
|
|
+ false, 0, // BackupPerf max-workers
|
|
+ &error);
|
|
|
|
hmp_handle_error(mon, error);
|
|
}
|
|
diff --git a/pve-backup.c b/pve-backup.c
|
|
index 4067018dbe..3ca4f74cb8 100644
|
|
--- a/pve-backup.c
|
|
+++ b/pve-backup.c
|
|
@@ -55,6 +55,7 @@ static struct PVEBackupState {
|
|
bool starting;
|
|
} stat;
|
|
int64_t speed;
|
|
+ BackupPerf perf;
|
|
VmaWriter *vmaw;
|
|
ProxmoxBackupHandle *pbs;
|
|
GList *di_list;
|
|
@@ -490,8 +491,6 @@ static void create_backup_jobs_bh(void *opaque) {
|
|
}
|
|
backup_state.txn = job_txn_new_seq();
|
|
|
|
- BackupPerf perf = { .max_workers = 16 };
|
|
-
|
|
/* create and start all jobs (paused state) */
|
|
GList *l = backup_state.di_list;
|
|
while (l) {
|
|
@@ -511,8 +510,9 @@ static void create_backup_jobs_bh(void *opaque) {
|
|
|
|
BlockJob *job = backup_job_create(
|
|
NULL, di->bs, di->target, backup_state.speed, sync_mode, di->bitmap,
|
|
- bitmap_mode, false, NULL, &perf, BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
|
|
- JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn, &local_err);
|
|
+ bitmap_mode, false, NULL, &backup_state.perf, BLOCKDEV_ON_ERROR_REPORT,
|
|
+ BLOCKDEV_ON_ERROR_REPORT, JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn,
|
|
+ &local_err);
|
|
|
|
aio_context_release(aio_context);
|
|
|
|
@@ -583,7 +583,9 @@ UuidInfo coroutine_fn *qmp_backup(
|
|
bool has_config_file, const char *config_file,
|
|
bool has_firewall_file, const char *firewall_file,
|
|
bool has_devlist, const char *devlist,
|
|
- bool has_speed, int64_t speed, Error **errp)
|
|
+ bool has_speed, int64_t speed,
|
|
+ bool has_max_workers, int64_t max_workers,
|
|
+ Error **errp)
|
|
{
|
|
assert(qemu_in_coroutine());
|
|
|
|
@@ -913,6 +915,11 @@ UuidInfo coroutine_fn *qmp_backup(
|
|
|
|
backup_state.speed = (has_speed && speed > 0) ? speed : 0;
|
|
|
|
+ backup_state.perf = (BackupPerf){ .max_workers = 16 };
|
|
+ if (has_max_workers) {
|
|
+ backup_state.perf.max_workers = max_workers;
|
|
+ }
|
|
+
|
|
backup_state.vmaw = vmaw;
|
|
backup_state.pbs = pbs;
|
|
|
|
@@ -1088,5 +1095,6 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
|
ret->pbs_dirty_bitmap_migration = true;
|
|
ret->query_bitmap_info = true;
|
|
ret->pbs_masterkey = true;
|
|
+ ret->backup_max_workers = true;
|
|
return ret;
|
|
}
|
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
|
index 889726fc26..65795b7204 100644
|
|
--- a/qapi/block-core.json
|
|
+++ b/qapi/block-core.json
|
|
@@ -829,6 +829,8 @@
|
|
#
|
|
# @encrypt: use encryption ((optional for format 'pbs', defaults to true if there is a keyfile)
|
|
#
|
|
+# @max-workers: see @BackupPerf for details. Default 16.
|
|
+#
|
|
# Returns: the uuid of the backup job
|
|
#
|
|
##
|
|
@@ -847,7 +849,9 @@
|
|
'*format': 'BackupFormat',
|
|
'*config-file': 'str',
|
|
'*firewall-file': 'str',
|
|
- '*devlist': 'str', '*speed': 'int' },
|
|
+ '*devlist': 'str',
|
|
+ '*speed': 'int',
|
|
+ '*max-workers': 'int' },
|
|
'returns': 'UuidInfo', 'coroutine': true }
|
|
|
|
##
|
|
@@ -902,7 +906,8 @@
|
|
'pbs-dirty-bitmap-savevm': 'bool',
|
|
'pbs-dirty-bitmap-migration': 'bool',
|
|
'pbs-masterkey': 'bool',
|
|
- 'pbs-library-version': 'str' } }
|
|
+ 'pbs-library-version': 'str',
|
|
+ 'backup-max-workers': 'bool' } }
|
|
|
|
##
|
|
# @query-proxmox-support:
|