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 0350E1FF09D for ; Mon, 02 Nov 2026 00:01:27 +0100 (CET) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id AB7192169D; Sun, 01 Nov 2026 23:59:38 +0100 (CET) From: Thomas Lamprecht To: pve-devel@lists.proxmox.com Subject: [PATCH storage 03/19] add backup concurrency option to storages Date: Sun, 1 Nov 2026 23:58:30 +0100 Message-ID: <20261101225849.884587-4-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: 1793573947979 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.383 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: ZHH4RZDAN5EGGDNEVB64UV2ZXCC5BGFN X-Message-ID-Hash: ZHH4RZDAN5EGGDNEVB64UV2ZXCC5BGFN 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: Allows limiting how many guest backups use a storage at the same time, be it as backup target or because guest disks live on it. A backup server or a Ceph cluster can thus be protected from more backup load than it can handle, independent of how many nodes and jobs take part. For shared storages the limit counts for the whole cluster, for local storages on each node. The ESXi import storage is not a backup source or target and does not get the option. Signed-off-by: Thomas Lamprecht --- src/PVE/Storage/BTRFSPlugin.pm | 1 + src/PVE/Storage/CIFSPlugin.pm | 1 + src/PVE/Storage/CephFSPlugin.pm | 1 + src/PVE/Storage/DirPlugin.pm | 1 + src/PVE/Storage/ISCSIDirectPlugin.pm | 1 + src/PVE/Storage/ISCSIPlugin.pm | 1 + src/PVE/Storage/LVMPlugin.pm | 1 + src/PVE/Storage/LvmThinPlugin.pm | 1 + src/PVE/Storage/NFSPlugin.pm | 1 + src/PVE/Storage/PBSPlugin.pm | 1 + src/PVE/Storage/Plugin.pm | 9 +++++++++ src/PVE/Storage/RBDPlugin.pm | 1 + src/PVE/Storage/ZFSPlugin.pm | 1 + src/PVE/Storage/ZFSPoolPlugin.pm | 1 + 14 files changed, 22 insertions(+) diff --git a/src/PVE/Storage/BTRFSPlugin.pm b/src/PVE/Storage/BTRFSPlugin.pm index fa28592e..30e28402 100644 --- a/src/PVE/Storage/BTRFSPlugin.pm +++ b/src/PVE/Storage/BTRFSPlugin.pm @@ -66,6 +66,7 @@ sub options { return { path => { fixed => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, shared => { optional => 1 }, disable => { optional => 1 }, 'prune-backups' => { optional => 1 }, diff --git a/src/PVE/Storage/CIFSPlugin.pm b/src/PVE/Storage/CIFSPlugin.pm index 54f0f4ec..2d358809 100644 --- a/src/PVE/Storage/CIFSPlugin.pm +++ b/src/PVE/Storage/CIFSPlugin.pm @@ -166,6 +166,7 @@ sub options { share => { fixed => 1 }, subdir => { optional => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, 'prune-backups' => { optional => 1 }, 'max-protected-backups' => { optional => 1 }, diff --git a/src/PVE/Storage/CephFSPlugin.pm b/src/PVE/Storage/CephFSPlugin.pm index fbc97113..135d0aee 100644 --- a/src/PVE/Storage/CephFSPlugin.pm +++ b/src/PVE/Storage/CephFSPlugin.pm @@ -142,6 +142,7 @@ sub options { 'content-dirs' => { optional => 1 }, monhost => { optional => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, subdir => { optional => 1 }, disable => { optional => 1 }, options => { optional => 1 }, diff --git a/src/PVE/Storage/DirPlugin.pm b/src/PVE/Storage/DirPlugin.pm index 80c4a031..4161fa77 100644 --- a/src/PVE/Storage/DirPlugin.pm +++ b/src/PVE/Storage/DirPlugin.pm @@ -82,6 +82,7 @@ sub options { path => { fixed => 1 }, 'content-dirs' => { optional => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, shared => { optional => 1 }, disable => { optional => 1 }, 'prune-backups' => { optional => 1 }, diff --git a/src/PVE/Storage/ISCSIDirectPlugin.pm b/src/PVE/Storage/ISCSIDirectPlugin.pm index fb732850..ad13966c 100644 --- a/src/PVE/Storage/ISCSIDirectPlugin.pm +++ b/src/PVE/Storage/ISCSIDirectPlugin.pm @@ -75,6 +75,7 @@ sub options { portal => { fixed => 1 }, target => { fixed => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, content => { optional => 1 }, bwlimit => { optional => 1 }, diff --git a/src/PVE/Storage/ISCSIPlugin.pm b/src/PVE/Storage/ISCSIPlugin.pm index 801b5d1b..808081fd 100644 --- a/src/PVE/Storage/ISCSIPlugin.pm +++ b/src/PVE/Storage/ISCSIPlugin.pm @@ -357,6 +357,7 @@ sub options { portal => { fixed => 1 }, target => { fixed => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, content => { optional => 1 }, bwlimit => { optional => 1 }, diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm index 98dd48c6..47ed6d9c 100644 --- a/src/PVE/Storage/LVMPlugin.pm +++ b/src/PVE/Storage/LVMPlugin.pm @@ -795,6 +795,7 @@ sub options { return { vgname => { fixed => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, shared => { optional => 1 }, disable => { optional => 1 }, saferemove => { optional => 1 }, diff --git a/src/PVE/Storage/LvmThinPlugin.pm b/src/PVE/Storage/LvmThinPlugin.pm index 6b953693..0ace1b0d 100644 --- a/src/PVE/Storage/LvmThinPlugin.pm +++ b/src/PVE/Storage/LvmThinPlugin.pm @@ -55,6 +55,7 @@ sub options { thinpool => { fixed => 1 }, vgname => { fixed => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, content => { optional => 1 }, bwlimit => { optional => 1 }, diff --git a/src/PVE/Storage/NFSPlugin.pm b/src/PVE/Storage/NFSPlugin.pm index 4cc02c9e..a5a4d815 100644 --- a/src/PVE/Storage/NFSPlugin.pm +++ b/src/PVE/Storage/NFSPlugin.pm @@ -92,6 +92,7 @@ sub options { server => { fixed => 1 }, export => { fixed => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, 'prune-backups' => { optional => 1 }, 'max-protected-backups' => { optional => 1 }, diff --git a/src/PVE/Storage/PBSPlugin.pm b/src/PVE/Storage/PBSPlugin.pm index 6adafa34..c05e0fd7 100644 --- a/src/PVE/Storage/PBSPlugin.pm +++ b/src/PVE/Storage/PBSPlugin.pm @@ -67,6 +67,7 @@ sub options { namespace => { optional => 1 }, port => { optional => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, content => { optional => 1 }, username => { optional => 1 }, diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm index 3d07f749..67ee4e9c 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -195,6 +195,15 @@ my $defaultData = { default => "Unlimited for users with Datastore.Allocate privilege, 5 for other users", }, + 'backup-concurrency' => { + description => + "Maximal number of guest backups using this storage at the same time," + . " either as backup target or for guest disks. Counted for the whole cluster if" + . " the storage is shared, for each node otherwise.", + type => 'integer', + minimum => 1, + optional => 1, + }, shared => { description => "Indicate that this is a single storage with the same contents on all " diff --git a/src/PVE/Storage/RBDPlugin.pm b/src/PVE/Storage/RBDPlugin.pm index ea875463..fa7ed375 100644 --- a/src/PVE/Storage/RBDPlugin.pm +++ b/src/PVE/Storage/RBDPlugin.pm @@ -462,6 +462,7 @@ sub properties { sub options { return { nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, monhost => { optional => 1 }, pool => { optional => 1 }, diff --git a/src/PVE/Storage/ZFSPlugin.pm b/src/PVE/Storage/ZFSPlugin.pm index eba85bfa..70690372 100644 --- a/src/PVE/Storage/ZFSPlugin.pm +++ b/src/PVE/Storage/ZFSPlugin.pm @@ -222,6 +222,7 @@ sub properties { sub options { return { nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, portal => { fixed => 1 }, target => { fixed => 1 }, diff --git a/src/PVE/Storage/ZFSPoolPlugin.pm b/src/PVE/Storage/ZFSPoolPlugin.pm index 1a4ebc65..68de1de8 100644 --- a/src/PVE/Storage/ZFSPoolPlugin.pm +++ b/src/PVE/Storage/ZFSPoolPlugin.pm @@ -92,6 +92,7 @@ sub options { blocksize => { optional => 1 }, sparse => { optional => 1 }, nodes => { optional => 1 }, + 'backup-concurrency' => { optional => 1 }, disable => { optional => 1 }, content => { optional => 1 }, bwlimit => { optional => 1 }, -- 2.47.3