From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id DC45D1FF13B for ; Wed, 06 May 2026 18:57:15 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 64E53CA6; Wed, 6 May 2026 18:57:14 +0200 (CEST) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox v2 01/10] pbs-api-types: add datastore create maintenance-mode type Date: Wed, 6 May 2026 18:56:42 +0200 Message-ID: <20260506165651.1322947-2-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260506165651.1322947-1-c.ebner@proxmox.com> References: <20260506165651.1322947-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: 1778086518630 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.070 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [datastore.rs] Message-ID-Hash: YIW4PPRTO5O4CZJLCF7CJPLYF7ECMBF5 X-Message-ID-Hash: YIW4PPRTO5O4CZJLCF7CJPLYF7ECMBF5 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 098d2b7c..065afc2f 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -648,6 +648,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 fc7d240d..9d3b769a 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