Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 29 additions & 16 deletions foyer-storage/src/device/direct_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
}

impl DirectFileDevice {
fn assert_io_range(&self, region: Option<RegionId>, offset: u64, len: usize) {
fn check_io_range(&self, region: Option<RegionId>, offset: u64, len: usize) -> Result<()> {
let offset = if let Some(region) = region {
self.region_size as u64 * region as u64 + offset
} else {
Expand All @@ -86,24 +86,29 @@
bits::assert_aligned(PAGE, offset as _);
bits::assert_aligned(PAGE, len);

let e = Error::InvalidIoRange {
range: offset as usize..offset as usize + len,
region_size: self.region_size(),
capacity: self.capacity(),
};

// Assert file capacity bound.
assert!(
offset as usize + len <= self.capacity(),
"offset ({offset}) + len ({len}) = total ({total}) <= capacity ({capacity})",
total = offset as usize + len,
capacity = self.capacity,
);
if offset as usize + len > self.capacity() {
tracing::error!(?e, "[direct fs]: io range out of capacity");
return Err(e);

Check warning on line 98 in foyer-storage/src/device/direct_file.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_file.rs#L97-L98

Added lines #L97 - L98 were not covered by tests
}

// Assert region capacity bound if region is given.
if region.is_some() && len != 0 {
let start_region = offset as usize / self.region_size;
let end_region = (offset as usize + len - 1) / self.region_size;
assert_eq!(
start_region, end_region,
"io range are not in the same region, region_size: {region_size}, offset: {offset}, len: {len}, start region: {start_region}, end region: {end_region}",
region_size = self.region_size,
);
if start_region != end_region {
tracing::error!(?e, "[direct fs]: io range not in the same region");
return Err(e);

Check warning on line 107 in foyer-storage/src/device/direct_file.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_file.rs#L106-L107

Added lines #L106 - L107 were not covered by tests
}
}

Ok(())
}

/// Positioned write API for the direct file device.
Expand All @@ -117,7 +122,9 @@
B: IoBuf,
{
let len = buf.len();
self.assert_io_range(None, offset, len);
if let Err(e) = self.check_io_range(None, offset, len) {
return (buf, Err(e));

Check warning on line 126 in foyer-storage/src/device/direct_file.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_file.rs#L126

Added line #L126 was not covered by tests
}

let file = self.file.clone();
asyncify_with_runtime(self.runtime.write(), move || {
Expand Down Expand Up @@ -159,7 +166,9 @@
B: IoBufMut,
{
let len = buf.len();
self.assert_io_range(None, offset, len);
if let Err(e) = self.check_io_range(None, offset, len) {
return (buf, Err(e));

Check warning on line 170 in foyer-storage/src/device/direct_file.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_file.rs#L170

Added line #L170 was not covered by tests
}

let file = self.file.clone();
asyncify_with_runtime(self.runtime.read(), move || {
Expand Down Expand Up @@ -253,7 +262,9 @@
B: IoBuf,
{
let len = buf.len();
self.assert_io_range(Some(region), offset, len);
if let Err(e) = self.check_io_range(Some(region), offset, len) {
return (buf, Err(e));

Check warning on line 266 in foyer-storage/src/device/direct_file.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_file.rs#L266

Added line #L266 was not covered by tests
}

let poffset = offset + region as u64 * self.region_size as u64;
self.pwrite(buf, poffset).await
Expand All @@ -265,7 +276,9 @@
B: IoBufMut,
{
let len = buf.len();
self.assert_io_range(Some(region), offset, len);
if let Err(e) = self.check_io_range(Some(region), offset, len) {
return (buf, Err(e));

Check warning on line 280 in foyer-storage/src/device/direct_file.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_file.rs#L280

Added line #L280 was not covered by tests
}

let poffset = offset + region as u64 * self.region_size as u64;
self.pread(buf, poffset).await
Expand Down
37 changes: 23 additions & 14 deletions foyer-storage/src/device/direct_fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,31 +88,36 @@
&self.inner.files[region as usize]
}

fn assert_io_range(&self, region: RegionId, offset: u64, len: usize) {
fn check_io_range(&self, region: RegionId, offset: u64, len: usize) -> Result<()> {
let offset = self.inner.file_size as u64 * region as u64 + offset;

// Assert alignment.
bits::assert_aligned(PAGE, offset as _);
bits::assert_aligned(PAGE, len);

let e = Error::InvalidIoRange {
range: offset as usize..offset as usize + len,
region_size: self.region_size(),
capacity: self.capacity(),
};

// Assert file capacity bound.
assert!(
offset as usize + len <= self.capacity(),
"offset ({offset}) + len ({len}) = total ({total}) <= capacity ({capacity})",
total = offset as usize + len,
capacity = self.inner.capacity,
);
if offset as usize + len > self.capacity() {
tracing::error!(?e, "[direct fs]: io range out of capacity");
return Err(e);

Check warning on line 107 in foyer-storage/src/device/direct_fs.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_fs.rs#L106-L107

Added lines #L106 - L107 were not covered by tests
}

// Assert region capacity bound if region is given.
if len != 0 {
let start_region = offset as usize / self.inner.file_size;
let end_region = (offset as usize + len - 1) / self.inner.file_size;
assert_eq!(
start_region, end_region,
"io range are not in the same region, region_size: {region_size}, offset: {offset}, len: {len}, start region: {start_region}, end region: {end_region}",
region_size = self.inner.file_size,
);
if start_region != end_region {
tracing::error!(?e, "[direct fs]: io range not in the same region");
return Err(e);

Check warning on line 116 in foyer-storage/src/device/direct_fs.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_fs.rs#L115-L116

Added lines #L115 - L116 were not covered by tests
}
}

Ok(())
}
}

Expand Down Expand Up @@ -177,7 +182,9 @@
B: IoBuf,
{
let len = buf.len();
self.assert_io_range(region, offset, len);
if let Err(e) = self.check_io_range(region, offset, len) {
return (buf, Err(e));

Check warning on line 186 in foyer-storage/src/device/direct_fs.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_fs.rs#L186

Added line #L186 was not covered by tests
}

let file = self.file(region).clone();
asyncify_with_runtime(self.inner.runtime.write(), move || {
Expand Down Expand Up @@ -214,7 +221,9 @@
B: IoBufMut,
{
let len = buf.len();
self.assert_io_range(region, offset, len);
if let Err(e) = self.check_io_range(region, offset, len) {
return (buf, Err(e));

Check warning on line 225 in foyer-storage/src/device/direct_fs.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/device/direct_fs.rs#L225

Added line #L225 was not covered by tests
}

let file = self.file(region).clone();
asyncify_with_runtime(self.inner.runtime.read(), move || {
Expand Down
10 changes: 10 additions & 0 deletions foyer-storage/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ pub enum Error {
/// Gotten range.
get: Range<usize>,
},
/// Invalid I/O range.
#[error("invalid io range: {range:?}, region size: {region_size}, capacity: {capacity}")]
InvalidIoRange {
/// I/O range
range: Range<usize>,
/// Region size
region_size: usize,
/// Capacity
capacity: usize,
},
/// Compression algorithm not supported.
#[error("compression algorithm not supported: {0}")]
CompressionAlgorithmNotSupported(u8),
Expand Down
32 changes: 26 additions & 6 deletions foyer-storage/src/large/generic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,21 @@

let buf = IoBuffer::new(bits::align_up(PAGE, addr.len as _));
let (buf, res) = device.read(buf, addr.region, addr.offset as _).await;
res?;
match res {

Check warning on line 356 in foyer-storage/src/large/generic.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/large/generic.rs#L356

Added line #L356 was not covered by tests
Ok(_) => {}
Err(e @ Error::InvalidIoRange { .. }) => {
tracing::warn!(?e, "[lodc load]: invalid io range, remove this entry and skip");
indexer.remove(hash);
metrics.storage_miss.increase(1);
metrics.storage_miss_duration.record(now.elapsed().as_secs_f64());
return Ok(None);

Check warning on line 363 in foyer-storage/src/large/generic.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/large/generic.rs#L358-L363

Added lines #L358 - L363 were not covered by tests
}
Err(e) => {
tracing::error!(hash, ?addr, ?e, "[lodc load]: load error");
metrics.storage_error.increase(1);
return Err(e);

Check warning on line 368 in foyer-storage/src/large/generic.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/large/generic.rs#L365-L368

Added lines #L365 - L368 were not covered by tests
}
}

stats
.cache_read_bytes
Expand All @@ -364,8 +378,9 @@
Err(e @ Error::MagicMismatch { .. })
| Err(e @ Error::ChecksumMismatch { .. })
| Err(e @ Error::CompressionAlgorithmNotSupported(_))
| Err(e @ Error::OutOfRange { .. }) => {
tracing::trace!(
| Err(e @ Error::OutOfRange { .. })
| Err(e @ Error::InvalidIoRange { .. }) => {

Check warning on line 382 in foyer-storage/src/large/generic.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/large/generic.rs#L381-L382

Added lines #L381 - L382 were not covered by tests
tracing::warn!(
hash,
?addr,
?e,
Expand All @@ -376,7 +391,11 @@
metrics.storage_miss_duration.record(now.elapsed().as_secs_f64());
return Ok(None);
}
Err(e) => return Err(e),
Err(e) => {
tracing::error!(hash, ?addr, ?e, "[lodc load]: load error");
metrics.storage_error.increase(1);
return Err(e);

Check warning on line 397 in foyer-storage/src/large/generic.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/large/generic.rs#L394-L397

Added lines #L394 - L397 were not covered by tests
}
};

let (k, v) = {
Expand All @@ -391,8 +410,9 @@
Ok(res) => res,
Err(e @ Error::MagicMismatch { .. })
| Err(e @ Error::ChecksumMismatch { .. })
| Err(e @ Error::OutOfRange { .. }) => {
tracing::trace!(
| Err(e @ Error::OutOfRange { .. })
| Err(e @ Error::InvalidIoRange { .. }) => {

Check warning on line 414 in foyer-storage/src/large/generic.rs

View check run for this annotation

Codecov / codecov/patch

foyer-storage/src/large/generic.rs#L413-L414

Added lines #L413 - L414 were not covered by tests
tracing::warn!(
hash,
?addr,
?header,
Expand Down
Loading