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 4B1011FF139 for ; Tue, 27 Jan 2026 13:27:06 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1D932216B9; Tue, 27 Jan 2026 13:27:28 +0100 (CET) From: Christian Ebner To: pbs-devel@lists.proxmox.com Date: Tue, 27 Jan 2026 13:27:11 +0100 Message-ID: <20260127122712.505774-4-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260127122712.505774-1-c.ebner@proxmox.com> References: <20260127122712.505774-1-c.ebner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1769516780428 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.047 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 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. 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. [s3.amazonaws.com, client.rs] Subject: [pbs-devel] [PATCH proxmox 3/3] s3-client: extend provider quirks by delete objects via delete object 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" Provide a workaround for providers not implementing the delete objects S3 API method. If ProviderQuirks::DeleteObjectsViaDeleteObject is set, S3Client::delete_objects() performs individual S3Client::delete_object() calls on each provided object key instead of deleting the keys via the deleteObjects API call. This can also be used to reduce POST calls in favor of multiple DELETE calls, which might be charged differently by some S3 object store providers. Signed-off-by: Christian Ebner --- proxmox-s3-client/src/api_types.rs | 2 ++ proxmox-s3-client/src/client.rs | 31 +++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/proxmox-s3-client/src/api_types.rs b/proxmox-s3-client/src/api_types.rs index 93573fbd..b4fc24e0 100644 --- a/proxmox-s3-client/src/api_types.rs +++ b/proxmox-s3-client/src/api_types.rs @@ -87,6 +87,8 @@ pub const S3_BUCKET_NAME_SCHEMA: Schema = StringSchema::new("Bucket name for S3 pub enum ProviderQuirks { /// Prvider does not support the If-None-Match http header SkipIfNoneMatchHeader, + /// Prvider does not support DeleteObjects API endpoint, use delete object calls instead + DeleteObjectsViaDeleteObject, } serde_plain::derive_display_from_serialize!(ProviderQuirks); serde_plain::derive_fromstr_from_deserialize!(ProviderQuirks); diff --git a/proxmox-s3-client/src/client.rs b/proxmox-s3-client/src/client.rs index 3d0af5d6..a6a3c5f9 100644 --- a/proxmox-s3-client/src/client.rs +++ b/proxmox-s3-client/src/client.rs @@ -29,7 +29,7 @@ use crate::aws_sign_v4::AWS_SIGN_V4_DATETIME_FORMAT; use crate::aws_sign_v4::{aws_sign_v4_signature, aws_sign_v4_uri_encode}; use crate::object_key::S3ObjectKey; use crate::response_reader::{ - CopyObjectResponse, DeleteObjectsResponse, DeletedObject, GetObjectResponse, + CopyObjectResponse, DeleteObjectError, DeleteObjectsResponse, DeletedObject, GetObjectResponse, HeadObjectResponse, ListBucketsResponse, ListObjectsV2Response, PutObjectResponse, ResponseReader, }; @@ -567,6 +567,35 @@ impl S3Client { return Ok(DeleteObjectsResponse::default()); } + if self + .options + .provider_quirks + .contains(&ProviderQuirks::DeleteObjectsViaDeleteObject) + { + let mut response = DeleteObjectsResponse::default(); + response.deleted = Some(Vec::with_capacity(object_keys.len())); + + for object_key in object_keys { + match self.delete_object(object_key.clone()).await { + Ok(deleted_object) => { + let deleted = response.deleted.get_or_insert(Vec::new()); + deleted.push(deleted_object); + } + Err(err) => { + let mut errors = response.error.get_or_insert(Vec::new()); + errors.push(DeleteObjectError { + code: None, + key: Some(object_key.clone()), + message: Some(format!("{err}")), + version_id: None, + }); + } + } + } + + return Ok(response); + } + let mut body = String::from(r#""#); for object_key in object_keys { body.push_str(""); -- 2.47.3 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel