diff --git a/crates/ecstore/src/object_api/mod.rs b/crates/ecstore/src/object_api/mod.rs index 0099047c1..a57a7069b 100644 --- a/crates/ecstore/src/object_api/mod.rs +++ b/crates/ecstore/src/object_api/mod.rs @@ -62,7 +62,7 @@ pub(crate) const ENCRYPTED_FRAME_LAYOUT_FIXED8K_SUFFIX: &str = "encrypted-frame- pub(crate) const ENV_RUSTFS_ENCRYPTED_RANGE_SEEK: &str = "RUSTFS_ENCRYPTED_RANGE_SEEK"; pub(crate) const DEFAULT_RUSTFS_ENCRYPTED_RANGE_SEEK: bool = true; -pub(crate) fn has_encrypted_part_layout_marker(metadata: &HashMap, suffix: &str, expected: &str) -> bool { +pub(crate) fn has_encrypted_part_layout_marker(metadata: &HashMap, suffix: &str, expected: &str) -> bool { let mut value = None; for (key, candidate) in metadata { if !rustfs_utils::http::has_internal_suffix(key, suffix) { diff --git a/crates/ecstore/src/set_disk/metadata.rs b/crates/ecstore/src/set_disk/metadata.rs index 57a51f861..3842e516f 100644 --- a/crates/ecstore/src/set_disk/metadata.rs +++ b/crates/ecstore/src/set_disk/metadata.rs @@ -598,7 +598,7 @@ impl SetDisks { || Self::starts_with_ignore_ascii_case(suffix, http::SUFFIX_REPLICATION_DELETE_MARKER_VERSION_ARN_PREFIX) } - fn update_hash_quorum_metadata_map(hasher: &mut Sha256, entries: &HashMap) { + fn update_hash_quorum_metadata_map(hasher: &mut Sha256, entries: &HashMap) { let mut entries = entries .iter() .filter(|(name, _)| !Self::is_replication_quorum_metadata_key(name)) @@ -624,7 +624,7 @@ impl SetDisks { /// so the dual internal prefixes carrying the same mapping share one /// identity, while a genuine disagreement between disks still changes the /// hash and surfaces as a quorum difference. - fn update_hash_target_delete_marker_versions(hasher: &mut Sha256, metadata: &HashMap) { + fn update_hash_target_delete_marker_versions(hasher: &mut Sha256, metadata: &HashMap) { let (versions, corrupt) = http::target_delete_marker_versions(metadata); hasher.update([u8::from(corrupt)]); let mut versions = versions.iter().collect::>(); diff --git a/crates/ecstore/src/set_disk/ops/object.rs b/crates/ecstore/src/set_disk/ops/object.rs index 87f46e868..594814257 100644 --- a/crates/ecstore/src/set_disk/ops/object.rs +++ b/crates/ecstore/src/set_disk/ops/object.rs @@ -1013,13 +1013,13 @@ fn is_restore_control_metadata(key: &str) -> bool { .is_some_and(|remainder| remainder.is_empty()) } -fn restore_metadata_update_preserves_protected_metadata( - existing: &HashMap, - replacement: &HashMap, +fn restore_metadata_update_preserves_protected_metadata( + existing: &HashMap, + replacement: &HashMap, ) -> bool { - let mut existing = existing.clone(); + let mut existing: HashMap = existing.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); clean_metadata(&mut existing); - let mut replacement = replacement.clone(); + let mut replacement: HashMap = replacement.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); clean_metadata(&mut replacement); let existing_count = existing.keys().filter(|key| !is_restore_control_metadata(key)).count(); let replacement_count = replacement.keys().filter(|key| !is_restore_control_metadata(key)).count(); @@ -2064,9 +2064,9 @@ pub(in crate::set_disk) fn stored_replication_category_metadata(existing: &Objec /// /// Returns whether `inbound` was modified. Callers must hold the object write /// lock so the stored values compared here are the ones being replaced. -pub(in crate::set_disk) fn merge_replication_metadata_lww( - inbound: &mut HashMap, - existing: &HashMap, +pub(in crate::set_disk) fn merge_replication_metadata_lww( + inbound: &mut HashMap, + existing: &HashMap, opts: &ObjectOptions, ) -> bool { use rustfs_utils::http::headers::{ @@ -2697,7 +2697,7 @@ impl SetDisks { ))); } - fi.metadata = user_defined; + fi.metadata = user_defined.into(); fi.mod_time = mod_time; fi.size = w_size as i64; fi.versioned = opts.versioned || opts.version_suspended; @@ -5882,7 +5882,7 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks { } else { None }; - let mut replacement_metadata = (*src_info.user_defined).clone(); + let mut replacement_metadata: AHashMap = (*src_info.user_defined).clone().into(); if let Some(part_checksums) = preserved_part_checksums { rustfs_utils::http::insert_str(&mut replacement_metadata, rustfs_utils::http::SUFFIX_PART_CHECKSUMS, part_checksums); } @@ -7324,7 +7324,7 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks { X_AMZ_OBJECT_LOCK_RETAIN_UNTIL_DATE.as_str(), X_AMZ_OBJECT_LOCK_LEGAL_HOLD.as_str(), ] { - if let Some(value) = fi.metadata.lookup(header).filter(|value| !value.is_empty()) { + if let Some(value) = fi.metadata.get(header).filter(|value| !value.is_empty()) { transition_meta.insert(header.to_ascii_lowercase(), value.to_string()); } } diff --git a/crates/ecstore/src/store/utils.rs b/crates/ecstore/src/store/utils.rs index a39bca8f3..28f3fe907 100644 --- a/crates/ecstore/src/store/utils.rs +++ b/crates/ecstore/src/store/utils.rs @@ -26,18 +26,18 @@ static STRICT_BUCKET_NAME_REGEX: LazyLock = static NON_STRICT_BUCKET_NAME_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"^[A-Za-z0-9][A-Za-z0-9\.\-_:]{1,61}[A-Za-z0-9]$").expect("valid non-strict bucket name regex")); -pub fn clean_metadata(metadata: &mut HashMap) { +pub fn clean_metadata(metadata: &mut HashMap) { remove_standard_storage_class(metadata); clean_metadata_keys(metadata, &["md5Sum", "etag", "expires", AMZ_OBJECT_TAGGING, "last-modified"]); } -pub fn remove_standard_storage_class(metadata: &mut HashMap) { +pub fn remove_standard_storage_class(metadata: &mut HashMap) { if metadata.get(AMZ_STORAGE_CLASS) == Some(&STANDARD.to_string()) { metadata.remove(AMZ_STORAGE_CLASS); } } -pub fn clean_metadata_keys(metadata: &mut HashMap, key_names: &[&str]) { +pub fn clean_metadata_keys(metadata: &mut HashMap, key_names: &[&str]) { for key in key_names { metadata.remove(key.to_owned()); } diff --git a/crates/utils/src/http/header_compat.rs b/crates/utils/src/http/header_compat.rs index c36632d8e..182de3efe 100644 --- a/crates/utils/src/http/header_compat.rs +++ b/crates/utils/src/http/header_compat.rs @@ -89,7 +89,7 @@ pub fn is_object_encryption_marker(key: &str) -> bool { } /// Reads the logical object size recorded by encryption metadata. -pub fn get_object_encryption_original_size(metadata: &std::collections::HashMap) -> std::io::Result> { +pub fn get_object_encryption_original_size(metadata: &std::collections::HashMap) -> std::io::Result> { let actual_size = super::get_str(metadata, super::SUFFIX_ACTUAL_SIZE); let size = get_case_insensitive(metadata, RUSTFS_ENCRYPTION_ORIGINAL_SIZE) .or_else(|| get_case_insensitive(metadata, SSEC_ORIGINAL_SIZE)) @@ -103,7 +103,7 @@ pub fn get_object_encryption_original_size(metadata: &std::collections::HashMap< .map_err(|error| std::io::Error::other(format!("Failed to parse encryption original size: {error}"))) } -fn get_case_insensitive<'a>(metadata: &'a std::collections::HashMap, key: &str) -> Option<&'a str> { +fn get_case_insensitive<'a, S: std::hash::BuildHasher>(metadata: &'a std::collections::HashMap, key: &str) -> Option<&'a str> { metadata.get(key).map(String::as_str).or_else(|| { metadata .iter()