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 5BBF01FF138 for ; Tue, 21 Jul 2026 12:38:00 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id F22C721503; Tue, 21 Jul 2026 12:37:53 +0200 (CEST) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox v3 01/10] pbs-api-types: add datastore create maintenance-mode type Date: Tue, 21 Jul 2026 12:36:34 +0200 Message-ID: <20260721103643.333028-2-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260721103643.333028-1-c.ebner@proxmox.com> References: <20260721103643.333028-1-c.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1784630221110 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.243 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_LOW -0.7 Sender listed at https://www.dnswl.org/, low 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: DUGU6ZOYE4M7OEU7YVVIAHMW7XLEGEA6 X-Message-ID-Hash: DUGU6ZOYE4M7OEU7YVVIAHMW7XLEGEA6 X-MailFrom: c.ebner@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 Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Datastore creation can take some time, especially for stores located on network attached filesystems or datastores backed by S3. Therefore, add a maintenance-mode type `create`, which will be used to block access to the datastore while it is being created, without the need to hold the datasore configuration lock for the whole construction period. Rather the maintenance-mode will be locked until the operation is completed or failed. Signed-off-by: Christian Ebner --- pbs-api-types/src/datastore.rs | 8 ++++++++ pbs-api-types/src/maintenance.rs | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 7643b0de..89ec4dbf 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -658,6 +658,14 @@ impl DataStoreConfig { } } } + Some(MaintenanceType::Create) => { + match new_type { + Some(MaintenanceType::Delete) => { /* allows deletion if creation failed */ } + Some(MaintenanceType::S3Refresh) => { /* refresh from s3 during creation */ } + None => { /* switch to regular operation after successful creation */ } + _ => bail!("datastore is being created or creation failed"), + } + } #[cfg(feature = "enum-fallback")] Some(MaintenanceType::UnknownEnumValue(s)) => { bail!("unknown maintenance type: {s}") diff --git a/pbs-api-types/src/maintenance.rs b/pbs-api-types/src/maintenance.rs index 2adb5d84..d6bb8308 100644 --- a/pbs-api-types/src/maintenance.rs +++ b/pbs-api-types/src/maintenance.rs @@ -44,6 +44,8 @@ pub enum MaintenanceType { // - Add "GarbageCollection" or "DeleteOnly" as type and track GC (or all deletes) as separate // operation, so that one can enable a mode where nothing new can be added but stuff can be // cleaned + /// The datastore is being created + Create, /// Only read operations are allowed on the datastore. ReadOnly, /// Neither read nor write operations are allowed on the datastore. @@ -96,6 +98,8 @@ impl MaintenanceMode { pub fn check(&self, operation: Operation) -> Result<(), Error> { if self.ty == MaintenanceType::Delete { bail!("datastore is being deleted"); + } else if self.ty == MaintenanceType::Create { + bail!("datastore is being created"); } let message = percent_encoding::percent_decode_str(self.message.as_deref().unwrap_or("")) -- 2.47.3