diff --git a/crates/ecstore/src/disk/mod.rs b/crates/ecstore/src/disk/mod.rs index 8112aa194..0f9c28bee 100644 --- a/crates/ecstore/src/disk/mod.rs +++ b/crates/ecstore/src/disk/mod.rs @@ -1251,7 +1251,7 @@ pub struct VolumeInfo { pub created: Option, } -#[derive(Deserialize, Serialize, Debug, Default, Clone)] +#[derive(Deserialize, Serialize, Debug, Default, Clone, Copy)] pub struct ReadOptions { pub incl_free_versions: bool, pub read_data: bool, diff --git a/crates/ecstore/src/set_disk/core/io_primitives.rs b/crates/ecstore/src/set_disk/core/io_primitives.rs index a75e74218..c41385fae 100644 --- a/crates/ecstore/src/set_disk/core/io_primitives.rs +++ b/crates/ecstore/src/set_disk/core/io_primitives.rs @@ -2222,18 +2222,18 @@ impl SetDisks { let mut ress = Vec::with_capacity(disks.len()); let mut errors = Vec::with_capacity(disks.len()); let mut observations = observe.then(|| Vec::with_capacity(disks.len())); - let opts = Arc::new(ReadOptions { + let opts = ReadOptions { incl_free_versions, read_data, healing, - }); - let org_bucket = Arc::new(org_bucket.to_string()); - let bucket = Arc::new(bucket.to_string()); - let object = Arc::new(object.to_string()); - let version_id = Arc::new(version_id.to_string()); + }; + let org_bucket: Arc = Arc::from(org_bucket); + let bucket: Arc = Arc::from(bucket); + let object: Arc = Arc::from(object); + let version_id: Arc = Arc::from(version_id); let futures = disks.iter().enumerate().map(|(disk_index, disk)| { let disk = disk.clone(); - let opts = opts.clone(); + let task_opts = opts; let org_bucket = org_bucket.clone(); let bucket = bucket.clone(); let object = object.clone(); @@ -2242,7 +2242,8 @@ impl SetDisks { let response_start = observe.then(Instant::now); let result = if let Some(disk) = disk { Self::record_read_version_call(&object, disk_index); - disk.read_version(&org_bucket, &bucket, &object, &version_id, &opts).await + disk.read_version(&org_bucket, &bucket, &object, &version_id, &task_opts) + .await } else { Err(DiskError::DiskNotFound) }; @@ -2307,21 +2308,21 @@ impl SetDisks { let mut observations = Vec::with_capacity(disks.len()); let mut accumulator = MetadataQuorumAccumulator::new(disks.len(), default_parity_count, true).with_requested_version_id(version_id); - let opts = Arc::new(ReadOptions { + let opts = ReadOptions { incl_free_versions, read_data, healing, - }); - let org_bucket = Arc::new(org_bucket.to_string()); - let bucket = Arc::new(bucket.to_string()); - let object = Arc::new(object.to_string()); - let version_id = Arc::new(version_id.to_string()); + }; + let org_bucket: Arc = Arc::from(org_bucket); + let bucket: Arc = Arc::from(bucket); + let object: Arc = Arc::from(object); + let version_id: Arc = Arc::from(version_id); let mut join_set = JoinSet::new(); let bounded_fanout = is_get_metadata_early_stop_bounded_fanout_enabled(); let mut next_disk_index = 0usize; let spawn_read_version = |join_set: &mut JoinSet<(usize, disk::error::Result, Duration)>, index: usize, disk: Option| { - let opts = opts.clone(); + let task_opts = opts; let org_bucket = org_bucket.clone(); let bucket = bucket.clone(); let object = object.clone(); @@ -2332,7 +2333,8 @@ impl SetDisks { Self::record_read_version_call(&object, index); #[cfg(test)] Self::read_version_fanout_barrier(&object, index).await; - disk.read_version(&org_bucket, &bucket, &object, &version_id, &opts).await + disk.read_version(&org_bucket, &bucket, &object, &version_id, &task_opts) + .await } else { Err(DiskError::DiskNotFound) }; diff --git a/crates/ecstore/src/set_disk/ops/heal.rs b/crates/ecstore/src/set_disk/ops/heal.rs index 10d159781..4e6c81d96 100644 --- a/crates/ecstore/src/set_disk/ops/heal.rs +++ b/crates/ecstore/src/set_disk/ops/heal.rs @@ -362,9 +362,9 @@ impl SetDisks { healing: true, }; let checks = target_disks.into_iter().map(|disk| { - let read_options = read_options.clone(); + let task_read_options = read_options; async move { - let file_info = match disk.read_version("", bucket, object, version_id, &read_options).await { + let file_info = match disk.read_version("", bucket, object, version_id, &task_read_options).await { Ok(file_info) => file_info, Err( DiskError::DiskNotFound diff --git a/crates/ecstore/src/set_disk/read.rs b/crates/ecstore/src/set_disk/read.rs index ae7461f75..2404a567a 100644 --- a/crates/ecstore/src/set_disk/read.rs +++ b/crates/ecstore/src/set_disk/read.rs @@ -224,7 +224,7 @@ impl SetDisks { let bucket = bucket.to_string(); let object = object.to_string(); let version_id = version_id.to_string(); - let opts = opts.clone(); + let opts = *opts; let processor = runtime_sources::batch_processors().read_processor(); let tasks: Vec<_> = disks @@ -235,9 +235,9 @@ impl SetDisks { let bucket = bucket.clone(); let object = object.clone(); let version_id = version_id.clone(); - let opts = opts.clone(); + let task_opts = opts; - async move { disk.read_version(&bucket, &bucket, &object, &version_id, &opts).await } + async move { disk.read_version(&bucket, &bucket, &object, &version_id, &task_opts).await } }) }) .collect();