From bbc96c43a231bf4292c6021855f4d37681b1a7fa Mon Sep 17 00:00:00 2001 From: houseme Date: Wed, 26 Aug 2026 21:45:04 +0800 Subject: [PATCH] feat(ecstore): update functions to support AHashMap (partial) - Update restore_operation_id_from_metadata to use generics - Update require_restore_operation_id to use generics - Update restore_commit_operation_id_from_metadata to use generics - Update should_persist_encryption_original_size to use generics - Update strip_internal_multipart_metadata to use generics - Update multipart_bucket_incarnation_id to use generics - Update multipart_bucket_incarnation_matches to use generics - Update validate_multipart_bucket_incarnation to use generics - Update tier_destination_id_from_metadata to use generics - Update get_raw_etag to use generics Note: This is a partial implementation. There are still compilation errors in ecstore that need to be fixed. Refs: https://github.com/rustfs/backlog/issues/2005 Co-Authored-By: heihutu --- crates/ecstore/src/client/object_api_utils.rs | 2 +- crates/ecstore/src/services/tier/tier.rs | 2 +- crates/ecstore/src/set_disk/mod.rs | 10 +++++----- crates/ecstore/src/set_disk/ops/multipart.rs | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/ecstore/src/client/object_api_utils.rs b/crates/ecstore/src/client/object_api_utils.rs index b4bd3e0b5..32dc3384a 100644 --- a/crates/ecstore/src/client/object_api_utils.rs +++ b/crates/ecstore/src/client/object_api_utils.rs @@ -168,7 +168,7 @@ pub fn to_s3s_etag(etag: &str) -> ETag { ETag::Strong(etag.to_string()) } -pub fn get_raw_etag(metadata: &HashMap) -> String { +pub fn get_raw_etag(metadata: &HashMap) -> String { metadata .get("etag") .cloned() diff --git a/crates/ecstore/src/services/tier/tier.rs b/crates/ecstore/src/services/tier/tier.rs index ab5e02823..eb0108b85 100644 --- a/crates/ecstore/src/services/tier/tier.rs +++ b/crates/ecstore/src/services/tier/tier.rs @@ -1454,7 +1454,7 @@ fn tier_backend_identity(config: &TierConfig) -> io::Result { encode_tier_backend_identity(tier_type, endpoint, bucket, prefix, region, routing_account) } -pub(crate) fn tier_destination_id_from_metadata(metadata: &HashMap) -> io::Result> { +pub(crate) fn tier_destination_id_from_metadata(metadata: &HashMap) -> io::Result> { let Some(encoded) = rustfs_utils::http::metadata_compat::get_consistent_str( metadata, rustfs_utils::http::metadata_compat::SUFFIX_TRANSITION_TIER_DESTINATION_ID, diff --git a/crates/ecstore/src/set_disk/mod.rs b/crates/ecstore/src/set_disk/mod.rs index e26fcdd40..1909484c4 100644 --- a/crates/ecstore/src/set_disk/mod.rs +++ b/crates/ecstore/src/set_disk/mod.rs @@ -200,7 +200,7 @@ use tracing::error; use tracing::{Instrument, debug, info, warn}; use uuid::Uuid; -pub(super) fn restore_operation_id_from_metadata(metadata: &HashMap) -> Result> { +pub(super) fn restore_operation_id_from_metadata(metadata: &HashMap) -> Result> { let Some(value) = rustfs_utils::http::metadata_compat::get_consistent_str(metadata, SUFFIX_RESTORE_OPERATION_ID) else { if rustfs_utils::http::metadata_compat::contains_key_str(metadata, SUFFIX_RESTORE_OPERATION_ID) { return Err(Error::other("invalid restore operation id metadata".to_string())); @@ -214,14 +214,14 @@ pub(super) fn restore_operation_id_from_metadata(metadata: &HashMap, expected: Uuid) -> Result<()> { +pub(super) fn require_restore_operation_id(metadata: &HashMap, expected: Uuid) -> Result<()> { match restore_operation_id_from_metadata(metadata)? { Some(actual) if actual == expected => Ok(()), _ => Err(Error::other("restore operation id changed before copy-back".to_string())), } } -pub(super) fn restore_commit_operation_id_from_metadata(metadata: &HashMap) -> Result> { +pub(super) fn restore_commit_operation_id_from_metadata(metadata: &HashMap) -> Result> { if !metadata.contains_key(X_AMZ_RESTORE.as_str()) { return Ok(None); } @@ -476,13 +476,13 @@ fn release_materialized_read_lock(bucket: &str, object: &str, read_lock_guard: O drop(read_lock_guard); } -pub(crate) fn strip_internal_multipart_metadata(metadata: &mut HashMap) { +pub(crate) fn strip_internal_multipart_metadata(metadata: &mut HashMap) { metadata.remove(RUSTFS_MULTIPART_BUCKET_KEY); metadata.remove(RUSTFS_MULTIPART_OBJECT_KEY); rustfs_utils::http::metadata_compat::remove_str(metadata, SUFFIX_BUCKET_INCARNATION_ID); } -fn should_persist_encryption_original_size(metadata: &HashMap) -> bool { +fn should_persist_encryption_original_size(metadata: &HashMap) -> bool { metadata.keys().any(|key| is_object_encryption_marker(key)) } diff --git a/crates/ecstore/src/set_disk/ops/multipart.rs b/crates/ecstore/src/set_disk/ops/multipart.rs index cd9b83623..2c25ebeb8 100644 --- a/crates/ecstore/src/set_disk/ops/multipart.rs +++ b/crates/ecstore/src/set_disk/ops/multipart.rs @@ -310,7 +310,7 @@ fn fence_commit_on_lock_loss(guard: Option<&ObjectLockDiagGuard>, mode: &'static Ok(()) } -fn multipart_bucket_incarnation_id(metadata: &HashMap) -> Result> { +fn multipart_bucket_incarnation_id(metadata: &HashMap) -> Result> { let Some(value) = rustfs_utils::http::metadata_compat::get_consistent_str(metadata, SUFFIX_BUCKET_INCARNATION_ID) else { if rustfs_utils::http::metadata_compat::contains_key_str(metadata, SUFFIX_BUCKET_INCARNATION_ID) { return Err(Error::other("invalid multipart bucket incarnation metadata")); @@ -324,12 +324,12 @@ fn multipart_bucket_incarnation_id(metadata: &HashMap) -> Result Ok(Some(incarnation)) } -fn multipart_bucket_incarnation_matches(metadata: &HashMap, expected: Uuid) -> bool { +fn multipart_bucket_incarnation_matches(metadata: &HashMap, expected: Uuid) -> bool { matches!(multipart_bucket_incarnation_id(metadata), Ok(Some(actual)) if actual == expected) } -fn validate_multipart_bucket_incarnation( - metadata: &HashMap, +fn validate_multipart_bucket_incarnation( + metadata: &HashMap, bucket: &str, object: &str, upload_id: &str,