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 2FB4D1FF0E5 for ; Wed, 29 Jul 2026 11:08:07 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id F3B4121375; Wed, 29 Jul 2026 11:08:06 +0200 (CEST) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox-backup v3 2/5] datastore: data blob: refactor decoding method Date: Wed, 29 Jul 2026 11:07:34 +0200 Message-ID: <20260729090737.135385-3-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260729090737.135385-1-c.ebner@proxmox.com> References: <20260729090737.135385-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: 1785316034233 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.146 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: RL7AXEA5QT6P7Y32QI76EO2I2SPCLN26 X-Message-ID-Hash: RL7AXEA5QT6P7Y32QI76EO2I2SPCLN26 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: Improve code style and readability by using a single match statement instead of chained if statements and deduplicate the common digest verificaton, performed on the decoded blob data. Signed-off-by: Christian Ebner Reviewed-by: Robert Obkircher --- pbs-datastore/src/data_blob.rs | 62 +++++++++++++++++----------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/pbs-datastore/src/data_blob.rs b/pbs-datastore/src/data_blob.rs index 465bcb280..44ab41e16 100644 --- a/pbs-datastore/src/data_blob.rs +++ b/pbs-datastore/src/data_blob.rs @@ -180,33 +180,33 @@ impl DataBlob { config: Option<&CryptConfig>, digest: Option<&[u8; 32]>, ) -> Result, Error> { - let magic = self.magic(); + let magic = *self.magic(); - if magic == &UNCOMPRESSED_BLOB_MAGIC_1_0 { - let data_start = std::mem::size_of::(); - let data = self.raw_data[data_start..].to_vec(); - if let Some(digest) = digest { - Self::verify_digest(&data, None, digest)?; + let (data, crypt_config) = match magic { + UNCOMPRESSED_BLOB_MAGIC_1_0 => { + let data_start = std::mem::size_of::(); + let data = self.raw_data[data_start..].to_vec(); + (data, None) } - Ok(data) - } else if magic == &COMPRESSED_BLOB_MAGIC_1_0 { - let data_start = std::mem::size_of::(); - let mut reader = &self.raw_data[data_start..]; - let data = zstd::stream::decode_all(&mut reader)?; - // zstd::block::decompress is about 10% slower - // let data = zstd::block::decompress(&self.raw_data[data_start..], MAX_BLOB_SIZE)?; - if let Some(digest) = digest { - Self::verify_digest(&data, None, digest)?; + COMPRESSED_BLOB_MAGIC_1_0 => { + let data_start = std::mem::size_of::(); + let mut reader = &self.raw_data[data_start..]; + let data = zstd::stream::decode_all(&mut reader)?; + // zstd::block::decompress is about 10% slower + // let data = zstd::block::decompress(&self.raw_data[data_start..], MAX_BLOB_SIZE)?; + (data, None) } - Ok(data) - } else if magic == &ENCR_COMPR_BLOB_MAGIC_1_0 || magic == &ENCRYPTED_BLOB_MAGIC_1_0 { - let header_len = std::mem::size_of::(); - let head = unsafe { - (&self.raw_data[..header_len]).read_le_value::()? - }; + ENCR_COMPR_BLOB_MAGIC_1_0 | ENCRYPTED_BLOB_MAGIC_1_0 => { + let header_len = std::mem::size_of::(); + let head = unsafe { + (&self.raw_data[..header_len]).read_le_value::()? + }; - if let Some(config) = config { - let data = if magic == &ENCR_COMPR_BLOB_MAGIC_1_0 { + let Some(config) = config else { + bail!("unable to decrypt blob - missing CryptConfig"); + }; + + let data = if magic == ENCR_COMPR_BLOB_MAGIC_1_0 { Self::decode_compressed_chunk( config, &self.raw_data[header_len..], @@ -221,16 +221,16 @@ impl DataBlob { &head.tag, )? }; - if let Some(digest) = digest { - Self::verify_digest(&data, Some(config), digest)?; - } - Ok(data) - } else { - bail!("unable to decrypt blob - missing CryptConfig"); + (data, Some(config)) } - } else { - bail!("Invalid blob magic number."); + _ => bail!("Invalid blob magic number."), + }; + + if let Some(digest) = digest { + Self::verify_digest(&data, crypt_config, digest)?; } + + Ok(data) } /// Load data blob via given sync ``reader`` and verify its CRC -- 2.47.3