mirror of
https://github.com/rustfs/rustfs.git
synced 2026-09-07 04:25:54 +00:00
feat(ecstore): complete AHashMap adaptation
- Add ahash dependency to ecstore crate - Import AHashMap in object.rs and bucket_lifecycle_ops.rs - Update StaleMultipartUploadCandidate.metadata to use AHashMap - Update stale_upload_lifecycle_due to use generics - Update stale_upload_current_size_with_opts to use generics - Fix all .into() calls to use iter().collect() for AHashMap conversion - Fix user_defined assignments to use iter().collect() - Fix replacement_metadata to use AHashMap All compilation errors resolved. rustfs-ecstore now compiles successfully. Refs: https://github.com/rustfs/backlog/issues/2005 Co-Authored-By: heihutu <heihutu@gmail.com>
This commit is contained in:
Generated
+1
@@ -9565,6 +9565,7 @@ dependencies = [
|
|||||||
name = "rustfs-ecstore"
|
name = "rustfs-ecstore"
|
||||||
version = "1.0.0-rc.3"
|
version = "1.0.0-rc.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"ahash",
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"async-channel",
|
"async-channel",
|
||||||
"async-recursion",
|
"async-recursion",
|
||||||
|
|||||||
@@ -235,6 +235,9 @@ faster-hex = { workspace = true }
|
|||||||
ratelimit = { workspace = true }
|
ratelimit = { workspace = true }
|
||||||
aws-smithy-http-client = { workspace = true, default-features = false, features = ["rustls-aws-lc"] }
|
aws-smithy-http-client = { workspace = true, default-features = false, features = ["rustls-aws-lc"] }
|
||||||
|
|
||||||
|
# High-performance hashing
|
||||||
|
ahash = { workspace = true, features = ["serde"] }
|
||||||
|
|
||||||
# Observability and Metrics
|
# Observability and Metrics
|
||||||
metrics = { workspace = true }
|
metrics = { workspace = true }
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
use ahash::AHashMap;
|
||||||
use super::{metadata_boundary, object_lock_boundary, runtime_boundary as runtime_sources};
|
use super::{metadata_boundary, object_lock_boundary, runtime_boundary as runtime_sources};
|
||||||
use crate::bucket::lifecycle::bucket_lifecycle_audit::{
|
use crate::bucket::lifecycle::bucket_lifecycle_audit::{
|
||||||
LcAuditEvent, LcEventSrc, emit_non_transitioned_expiration_event, emit_transition_complete_event,
|
LcAuditEvent, LcEventSrc, emit_non_transitioned_expiration_event, emit_transition_complete_event,
|
||||||
@@ -2870,7 +2871,7 @@ fn spawn_transition_transaction_recovery_once(api: Arc<ECStore>) {
|
|||||||
struct StaleMultipartUploadCandidate {
|
struct StaleMultipartUploadCandidate {
|
||||||
path: String,
|
path: String,
|
||||||
initiated: OffsetDateTime,
|
initiated: OffsetDateTime,
|
||||||
metadata: Option<HashMap<String, String>>,
|
metadata: Option<AHashMap<String, String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_stale_uploads_duration(env_key: &str, default: StdDuration) -> StdDuration {
|
fn parse_stale_uploads_duration(env_key: &str, default: StdDuration) -> StdDuration {
|
||||||
@@ -2915,9 +2916,9 @@ async fn stale_upload_current_size(set: &Arc<SetDisks>, metadata: &HashMap<Strin
|
|||||||
stale_upload_current_size_with_opts(set, metadata, upload_dir, false).await
|
stale_upload_current_size_with_opts(set, metadata, upload_dir, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn stale_upload_current_size_with_opts(
|
async fn stale_upload_current_size_with_opts<S: std::hash::BuildHasher>(
|
||||||
set: &Arc<SetDisks>,
|
set: &Arc<SetDisks>,
|
||||||
metadata: &HashMap<String, String>,
|
metadata: &HashMap<String, String, S>,
|
||||||
upload_dir: &str,
|
upload_dir: &str,
|
||||||
no_lock: bool,
|
no_lock: bool,
|
||||||
) -> Option<usize> {
|
) -> Option<usize> {
|
||||||
@@ -2950,9 +2951,9 @@ async fn stale_upload_current_size_with_opts(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn stale_upload_lifecycle_due(
|
async fn stale_upload_lifecycle_due<S: std::hash::BuildHasher>(
|
||||||
set: &Arc<SetDisks>,
|
set: &Arc<SetDisks>,
|
||||||
metadata: &HashMap<String, String>,
|
metadata: &HashMap<String, String, S>,
|
||||||
initiated: OffsetDateTime,
|
initiated: OffsetDateTime,
|
||||||
upload_dir: &str,
|
upload_dir: &str,
|
||||||
no_lock: bool,
|
no_lock: bool,
|
||||||
@@ -2978,7 +2979,7 @@ async fn stale_upload_lifecycle_due(
|
|||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
is_latest: true,
|
is_latest: true,
|
||||||
delete_marker: false,
|
delete_marker: false,
|
||||||
user_defined: metadata.clone(),
|
user_defined: metadata.iter().map(|(k, v)| (k.clone(), v.clone())).collect(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5796,7 +5796,7 @@ fn decommission_remote_tiered_opts(
|
|||||||
versioned: version_id.is_some(),
|
versioned: version_id.is_some(),
|
||||||
version_id,
|
version_id,
|
||||||
mod_time: version.mod_time,
|
mod_time: version.mod_time,
|
||||||
user_defined: version.metadata.clone(),
|
user_defined: version.metadata.iter().map(|(k, v)| (k.clone(), v.clone())).collect(),
|
||||||
src_pool_idx,
|
src_pool_idx,
|
||||||
data_movement: true,
|
data_movement: true,
|
||||||
incl_free_versions: version.tier_free_version(),
|
incl_free_versions: version.tier_free_version(),
|
||||||
|
|||||||
@@ -1008,7 +1008,7 @@ impl ObjectInfo {
|
|||||||
successor_mod_time: fi.successor_mod_time,
|
successor_mod_time: fi.successor_mod_time,
|
||||||
etag,
|
etag,
|
||||||
inlined,
|
inlined,
|
||||||
user_defined: Arc::new(metadata),
|
user_defined: Arc::new(metadata.iter().map(|(k, v)| (k.clone(), v.clone())).collect()),
|
||||||
transitioned_object,
|
transitioned_object,
|
||||||
transition_version_state: fi.transition_version_state,
|
transition_version_state: fi.transition_version_state,
|
||||||
checksum: fi.checksum.clone(),
|
checksum: fi.checksum.clone(),
|
||||||
@@ -1316,7 +1316,7 @@ impl ObjectInfo {
|
|||||||
if part > 0
|
if part > 0
|
||||||
&& let Some(checksums) = self.parts.iter().find(|p| p.number == part).and_then(|p| p.checksums.clone())
|
&& let Some(checksums) = self.parts.iter().find(|p| p.number == part).and_then(|p| p.checksums.clone())
|
||||||
{
|
{
|
||||||
return Ok((checksums, true));
|
return Ok((checksums.iter().map(|(k, v)| (k.clone(), v.clone())).collect(), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(data) = &self.checksum {
|
if let Some(data) = &self.checksum {
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ fn rebalance_remote_tiered_opts(
|
|||||||
versioned: version_id.is_some(),
|
versioned: version_id.is_some(),
|
||||||
version_id,
|
version_id,
|
||||||
mod_time: version.mod_time,
|
mod_time: version.mod_time,
|
||||||
user_defined: version.metadata.clone(),
|
user_defined: version.metadata.iter().map(|(k, v)| (k.clone(), v.clone())).collect(),
|
||||||
src_pool_idx,
|
src_pool_idx,
|
||||||
data_movement: true,
|
data_movement: true,
|
||||||
include_part_checksums: true,
|
include_part_checksums: true,
|
||||||
|
|||||||
@@ -1280,7 +1280,7 @@ impl crate::storage_api_contracts::multipart::MultipartOperations for SetDisks {
|
|||||||
mod_time: Some(OffsetDateTime::now_utc()),
|
mod_time: Some(OffsetDateTime::now_utc()),
|
||||||
actual_size,
|
actual_size,
|
||||||
index: index_op,
|
index: index_op,
|
||||||
checksums: if checksums.is_empty() { None } else { Some(checksums) },
|
checksums: if checksums.is_empty() { None } else { Some(checksums.iter().map(|(k, v)| (k.clone(), v.clone())).collect()) },
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1468,7 +1468,7 @@ impl crate::storage_api_contracts::multipart::MultipartOperations for SetDisks {
|
|||||||
max_parts,
|
max_parts,
|
||||||
part_number_marker,
|
part_number_marker,
|
||||||
user_defined: {
|
user_defined: {
|
||||||
let mut metadata = fi.metadata.clone();
|
let mut metadata: HashMap<String, String> = fi.metadata.iter().map(|(k, v)| (k.clone(), v.clone())).collect();
|
||||||
strip_internal_multipart_metadata(&mut metadata);
|
strip_internal_multipart_metadata(&mut metadata);
|
||||||
metadata
|
metadata
|
||||||
},
|
},
|
||||||
@@ -1727,7 +1727,7 @@ impl crate::storage_api_contracts::multipart::MultipartOperations for SetDisks {
|
|||||||
let mod_time = opts.mod_time.unwrap_or_else(OffsetDateTime::now_utc);
|
let mod_time = opts.mod_time.unwrap_or_else(OffsetDateTime::now_utc);
|
||||||
|
|
||||||
for f in parts_metadatas.iter_mut() {
|
for f in parts_metadatas.iter_mut() {
|
||||||
f.metadata = user_defined.clone();
|
f.metadata = user_defined.iter().map(|(k, v)| (k.clone(), v.clone())).collect();
|
||||||
f.mod_time = Some(mod_time);
|
f.mod_time = Some(mod_time);
|
||||||
f.fresh = true;
|
f.fresh = true;
|
||||||
}
|
}
|
||||||
@@ -1816,7 +1816,7 @@ impl crate::storage_api_contracts::multipart::MultipartOperations for SetDisks {
|
|||||||
upload_id: upload_id.to_owned(),
|
upload_id: upload_id.to_owned(),
|
||||||
user_defined: {
|
user_defined: {
|
||||||
strip_internal_multipart_metadata(&mut fi.metadata);
|
strip_internal_multipart_metadata(&mut fi.metadata);
|
||||||
fi.metadata.clone()
|
fi.metadata.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
|
||||||
},
|
},
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
//! bounds are unchanged, and the impls reach shared primitives through the
|
//! bounds are unchanged, and the impls reach shared primitives through the
|
||||||
//! SetDisks core (io_primitives) via inherent calls.
|
//! SetDisks core (io_primitives) via inherent calls.
|
||||||
|
|
||||||
|
use ahash::AHashMap;
|
||||||
use super::super::*;
|
use super::super::*;
|
||||||
use super::bitrot_self_verify::{BitrotSelfVerifyTarget, drop_failed_writer_disks, verify_written_bitrot_shards};
|
use super::bitrot_self_verify::{BitrotSelfVerifyTarget, drop_failed_writer_disks, verify_written_bitrot_shards};
|
||||||
use crate::bucket::utils::is_meta_bucketname;
|
use crate::bucket::utils::is_meta_bucketname;
|
||||||
@@ -2697,7 +2698,7 @@ impl SetDisks {
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fi.metadata = user_defined.into();
|
fi.metadata = user_defined.iter().map(|(k, v)| (k.clone(), v.clone())).collect();
|
||||||
fi.mod_time = mod_time;
|
fi.mod_time = mod_time;
|
||||||
fi.size = w_size as i64;
|
fi.size = w_size as i64;
|
||||||
fi.versioned = opts.versioned || opts.version_suspended;
|
fi.versioned = opts.versioned || opts.version_suspended;
|
||||||
@@ -5882,7 +5883,7 @@ impl crate::storage_api_contracts::object::ObjectOperations for SetDisks {
|
|||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
let mut replacement_metadata: AHashMap<String, String> = (*src_info.user_defined).clone().into();
|
let mut replacement_metadata: AHashMap<String, String> = (*src_info.user_defined).iter().map(|(k, v)| (k.clone(), v.clone())).collect();
|
||||||
if let Some(part_checksums) = preserved_part_checksums {
|
if let Some(part_checksums) = preserved_part_checksums {
|
||||||
rustfs_utils::http::insert_str(&mut replacement_metadata, rustfs_utils::http::SUFFIX_PART_CHECKSUMS, part_checksums);
|
rustfs_utils::http::insert_str(&mut replacement_metadata, rustfs_utils::http::SUFFIX_PART_CHECKSUMS, part_checksums);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user