From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 3B5811FF141 for ; Tue, 02 Jun 2026 15:01:07 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4AC57137B7; Tue, 2 Jun 2026 15:01:06 +0200 (CEST) From: Robert Obkircher To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox 1/5] pbs-api-types: propagate maintenance mode parse errors Date: Tue, 2 Jun 2026 14:58:52 +0200 Message-ID: <20260602130001.217482-2-r.obkircher@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260602130001.217482-1-r.obkircher@proxmox.com> References: <20260602130001.217482-1-r.obkircher@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1780405196873 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.054 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 Message-ID-Hash: 2ILAICPQ3PQYHR6AKFYQEUY2JLCUC6A6 X-Message-ID-Hash: 2ILAICPQ3PQYHR6AKFYQEUY2JLCUC6A6 X-MailFrom: r.obkircher@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: Do not silently ignore errors if the config file is invalid or contains a new mode from a future version. Upgrades to the new GarbageCollection maintenance mode should be fine even without this change, becausue it is unlikely that someone can enable it before older processes stop initiating new backups or S3 refreshes. There is however a risk that a sync job could unmount the datastore. Signed-off-by: Robert Obkircher --- pbs-api-types/src/datastore.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 7643b0de..b770bc03 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -629,18 +629,22 @@ impl DataStoreConfig { } } - pub fn get_maintenance_mode(&self) -> Option { - self.maintenance_mode.as_ref().and_then(|str| { - MaintenanceMode::deserialize(proxmox_schema::de::SchemaDeserializer::new( - str, - &MaintenanceMode::API_SCHEMA, - )) - .ok() - }) + pub fn get_maintenance_mode(&self) -> Result, Error> { + self.maintenance_mode + .as_ref() + .map(|str| { + MaintenanceMode::deserialize(proxmox_schema::de::SchemaDeserializer::new( + str, + &MaintenanceMode::API_SCHEMA, + )) + .map_err(|e| format_err!("failed to parse maintenance mode: {e}")) + }) + .transpose() } pub fn set_maintenance_mode(&mut self, new_mode: Option) -> Result<(), Error> { - let current_type = self.get_maintenance_mode().map(|mode| mode.ty); + // it is probably best to error out if the current mode can't be parsed: + let current_type = self.get_maintenance_mode()?.map(|mode| mode.ty); let new_type = new_mode.as_ref().map(|mode| mode.ty); match current_type { -- 2.47.3