From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id C0E7D1FF09D for ; Mon, 02 Nov 2026 00:00:11 +0100 (CET) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id EFB312178C; Sun, 01 Nov 2026 23:59:15 +0100 (CET) From: Thomas Lamprecht To: pve-devel@lists.proxmox.com Subject: [PATCH guest-common 04/19] vzdump: add options for parallel guest backups and overlapping jobs Date: Sun, 1 Nov 2026 23:58:31 +0100 Message-ID: <20261101225849.884587-5-t.lamprecht@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261101225849.884587-1-t.lamprecht@proxmox.com> References: <20261101225849.884587-1-t.lamprecht@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1793573948035 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.398 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: L2MABXHXT3HA6KPHK2PTYKWDNAUENPHT X-Message-ID-Hash: L2MABXHXT3HA6KPHK2PTYKWDNAUENPHT X-MailFrom: t.lamprecht@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: A node only ever runs one backup job, and that job backs up its guests one after the other. How long a job takes thus depends on how its guests happen to be spread over the nodes, and a short job has to wait until a long one finished, failing once the lock wait time is exceeded. The new 'concurrency' option allows backing up several guests of a job at the same time, up to the backup concurrency of the node. The bandwidth limit then applies to each of them, as its description now says. The 'overlap' option lets a job run alongside other jobs that allow it as well. It is off by default, as existing hook scripts may rely on job phases never overlapping. With overlapping jobs the same guest can be part of two running backups, and with cluster-wide limits a guest backup can wait for a slot, so the lock wait now also bounds these waits. Signed-off-by: Thomas Lamprecht --- src/PVE/VZDump/Common.pm | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/PVE/VZDump/Common.pm b/src/PVE/VZDump/Common.pm index 67a4cf4..f98c9ae 100644 --- a/src/PVE/VZDump/Common.pm +++ b/src/PVE/VZDump/Common.pm @@ -297,7 +297,7 @@ my $confdesc = { }, bwlimit => { type => 'integer', - description => "Limit I/O bandwidth (in KiB/s).", + description => "Limit I/O bandwidth of each guest backup (in KiB/s).", optional => 1, minimum => 0, default => 0, @@ -327,11 +327,27 @@ my $confdesc = { }, lockwait => { type => 'integer', - description => "Maximal time to wait for the global lock (minutes).", + description => + "Maximal time to wait for the global lock, for guests that another backup" + . " is currently processing, and for cluster-wide backup slots (minutes).", optional => 1, minimum => 0, default => 3 * 60, # 3 hours }, + concurrency => { + type => 'integer', + description => "Maximal number of guests to back up at the same time on each node." + . " Defaults to, and is limited by, the backup concurrency configured for the node.", + optional => 1, + minimum => 1, + }, + overlap => { + type => 'boolean', + description => "Allow running at the same time as other backups on the same node that" + . " also allow it. The job phases of their hook scripts can then overlap.", + optional => 1, + default => 0, + }, stopwait => { type => 'integer', description => "Maximal time to wait until a guest system is stopped (minutes).", -- 2.47.3