From e64ed14fb00de5db0458ddf8ef8c0668d39de6d7 Mon Sep 17 00:00:00 2001 From: Zhengchao An Date: Tue, 4 Aug 2026 06:36:49 +0800 Subject: [PATCH] fix(ecstore): address review comments for batch shard pread (#5680) fix: address review comments for batch shard pread --- crates/ecstore/src/disk/local.rs | 5 +++-- crates/ecstore/src/set_disk/core/io_primitives.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/ecstore/src/disk/local.rs b/crates/ecstore/src/disk/local.rs index 7257e12d7..bd2e9d608 100644 --- a/crates/ecstore/src/disk/local.rs +++ b/crates/ecstore/src/disk/local.rs @@ -6701,7 +6701,7 @@ pub(crate) async fn batch_shard_pread(requests: Vec<(std::path::PathBuf, usize, let r = (|| -> Result { let meta = std::fs::metadata(&file_path).map_err(DiskError::from)?; let end = offset.checked_add(length).ok_or(DiskError::FileCorrupt)?; - if meta.len() < end as u64 { + if meta.len() < u64::try_from(end).unwrap_or(u64::MAX) { return Err(DiskError::FileCorrupt); } @@ -6710,7 +6710,7 @@ pub(crate) async fn batch_shard_pread(requests: Vec<(std::path::PathBuf, usize, let mut total = 0usize; while total < length { let nbytes = file - .read_at(&mut buf[total..], (offset + total) as u64) + .read_at(&mut buf[total..], u64::try_from(offset + total).unwrap_or(u64::MAX)) .map_err(DiskError::from)?; if nbytes == 0 { return Err(DiskError::FileCorrupt); @@ -17986,5 +17986,6 @@ mod test { assert!(results[0].is_ok()); assert_eq!(results[0].as_ref().unwrap().as_ref(), b"good data"); assert!(results[1].is_err()); + assert!(matches!(results[1].as_ref().unwrap_err(), DiskError::Io(_))); } } diff --git a/crates/ecstore/src/set_disk/core/io_primitives.rs b/crates/ecstore/src/set_disk/core/io_primitives.rs index 60cff555b..8cbbb5b22 100644 --- a/crates/ecstore/src/set_disk/core/io_primitives.rs +++ b/crates/ecstore/src/set_disk/core/io_primitives.rs @@ -63,7 +63,6 @@ use metrics::counter; use std::{ collections::{HashMap, HashSet, VecDeque}, future::Future, - io::Cursor, pin::Pin, sync::OnceLock, task::{Context, Poll}, @@ -1425,6 +1424,7 @@ async fn try_create_bitrot_readers_via_batch_pread( skip_verify_bitrot: bool, ) -> Option { use crate::disk::local::batch_shard_pread; + use std::io::Cursor; let (adj_off, adj_len) = adjust_shard_read_params(read_offset, read_length, shard_size, &checksum_algo); if adj_len > object_mmap_read_max_length() {