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 C29F71FF17A for ; Mon, 5 Aug 2024 11:24:42 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 567531ED5; Mon, 5 Aug 2024 11:24:49 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Mon, 5 Aug 2024 11:24:14 +0200 Message-Id: <20240805092414.1178930-6-d.csapak@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240805092414.1178930-1-d.csapak@proxmox.com> References: <20240805092414.1178930-1-d.csapak@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.016 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 Subject: [pbs-devel] [PATCH proxmox-backup v3 5/5] datastore: DataBlob encode: simplify code X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" by combining the compression call from both encrypted and unencrypted paths and deciding on the header magic at one site. No functional changes intended, besides reusing the same buffer for compression. Signed-off-by: Dominik Csapak --- changes from v2: * adapt to cahnges in previous patches pbs-datastore/src/data_blob.rs | 89 ++++++++++++++-------------------- 1 file changed, 37 insertions(+), 52 deletions(-) diff --git a/pbs-datastore/src/data_blob.rs b/pbs-datastore/src/data_blob.rs index 4e689364..ee1bb664 100644 --- a/pbs-datastore/src/data_blob.rs +++ b/pbs-datastore/src/data_blob.rs @@ -104,28 +104,42 @@ impl DataBlob { bail!("data blob too large ({} bytes).", data.len()); } - let mut blob = if let Some(config) = config { - let compr_data; - let (_compress, data, magic) = if compress { - compr_data = zstd::bulk::compress(data, 1)?; - // Note: We only use compression if result is shorter - if compr_data.len() < data.len() { - (true, &compr_data[..], ENCR_COMPR_BLOB_MAGIC_1_0) - } else { - (false, data, ENCRYPTED_BLOB_MAGIC_1_0) + let header_len = if config.is_some() { + std::mem::size_of::() + } else { + std::mem::size_of::() + }; + + let mut compressed = false; + let mut data_compressed = vec![0u8; header_len + data.len()]; + if compress { + match zstd_safe::compress(&mut data_compressed[header_len..], data, 1) { + Ok(size) if size <= data.len() => { + data_compressed.truncate(header_len + size); + compressed = true; } - } else { - (false, data, ENCRYPTED_BLOB_MAGIC_1_0) - }; + Err(err) if !zstd_error_is_target_too_small(err) => { + log::warn!("zstd compression error: {err}"); + } + _ => {} + } + } - let header_len = std::mem::size_of::(); + let (magic, encryption_source) = match (compressed, config.is_some()) { + (true, true) => (ENCR_COMPR_BLOB_MAGIC_1_0, &data_compressed[header_len..]), + (true, false) => (COMPRESSED_BLOB_MAGIC_1_0, &data_compressed[header_len..]), + (false, true) => (ENCRYPTED_BLOB_MAGIC_1_0, data), + (false, false) => { + (&mut data_compressed[header_len..]).write_all(data)?; + (UNCOMPRESSED_BLOB_MAGIC_1_0, data) + } + }; + + let raw_data = if let Some(config) = config { let mut raw_data = Vec::with_capacity(data.len() + header_len); let dummy_head = EncryptedDataBlobHeader { - head: DataBlobHeader { - magic: [0u8; 8], - crc: [0; 4], - }, + head: DataBlobHeader { magic, crc: [0; 4] }, iv: [0u8; 16], tag: [0u8; 16], }; @@ -133,7 +147,7 @@ impl DataBlob { raw_data.write_le_value(dummy_head)?; } - let (iv, tag) = Self::encrypt_to(config, data, &mut raw_data)?; + let (iv, tag) = Self::encrypt_to(config, encryption_source, &mut raw_data)?; let head = EncryptedDataBlobHeader { head: DataBlobHeader { magic, crc: [0; 4] }, @@ -145,46 +159,17 @@ impl DataBlob { (&mut raw_data[0..header_len]).write_le_value(head)?; } - DataBlob { raw_data } + raw_data } else { - let header_len = std::mem::size_of::(); - let max_data_len = data.len() + header_len; - let mut raw_data = vec![0; max_data_len]; - if compress { - let head = DataBlobHeader { - magic: COMPRESSED_BLOB_MAGIC_1_0, - crc: [0; 4], - }; - unsafe { - (&mut raw_data[0..header_len]).write_le_value(head)?; - } - - match zstd_safe::compress(&mut raw_data[header_len..], data, 1) { - Ok(size) if size <= data.len() => { - raw_data.truncate(header_len + size); - let mut blob = DataBlob { raw_data }; - blob.set_crc(blob.compute_crc()); - return Ok(blob); - } - Err(err) if !zstd_error_is_target_too_small(err) => { - log::warn!("zstd compression error: {err}"); - } - _ => {} - } - } - - let head = DataBlobHeader { - magic: UNCOMPRESSED_BLOB_MAGIC_1_0, - crc: [0; 4], - }; + let head = DataBlobHeader { magic, crc: [0; 4] }; unsafe { - (&mut raw_data[0..header_len]).write_le_value(head)?; + (&mut data_compressed[0..header_len]).write_le_value(head)?; } - (&mut raw_data[header_len..]).write_all(data)?; - DataBlob { raw_data } + data_compressed }; + let mut blob = DataBlob { raw_data }; blob.set_crc(blob.compute_crc()); Ok(blob) -- 2.39.2 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel