proper compression handling of ranges
This commit is contained in:
parent
8ba04a0b94
commit
15089abba2
|
@ -572,63 +572,55 @@ impl<R: super::Read> Fs<R> {
|
||||||
let extent_start = *offset;
|
let extent_start = *offset;
|
||||||
let extent_end = extent_start + extent.len();
|
let extent_end = extent_start + extent.len();
|
||||||
|
|
||||||
|
// length of the entire range to be read
|
||||||
let range_len = end.map(|end| end - start);
|
let range_len = end.map(|end| end - start);
|
||||||
|
|
||||||
|
// bounds and length of the intersection of the current extent and
|
||||||
|
// the entire range to be read
|
||||||
let start2 = start.min(extent_start);
|
let start2 = start.min(extent_start);
|
||||||
let end = end.map(|end| end.max(extent_end));
|
let end = end.map(|end| end.max(extent_end)).unwrap_or(extent.len());
|
||||||
let len = end.map(|end| (end - start2));
|
let len = end - start2;
|
||||||
|
|
||||||
if let (Some(len), Some(range_len)) = (len, range_len) {
|
// check if current extent intersects the range we want to read
|
||||||
|
if let Some(range_len) = range_len {
|
||||||
range_len + range_len < len
|
range_len + range_len < len
|
||||||
} else {
|
} else {
|
||||||
start2 < extent_end
|
start2 < extent_end
|
||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
//
|
|
||||||
let start = start.saturating_sub(offset);
|
let start = start.saturating_sub(offset);
|
||||||
|
let end = end.map(|end| end - offset).unwrap_or(extent.len());
|
||||||
let end = end.map(|end| end - offset);
|
let len = end - start;
|
||||||
|
|
||||||
log::info!("reading {}..{:?} from extent.", start, end);
|
log::info!("reading {}..{:?} from extent.", start, end);
|
||||||
|
|
||||||
let data: alloc::borrow::Cow<[u8]> = match &extent {
|
let data: alloc::borrow::Cow<[u8]> = match &extent {
|
||||||
ExtentData::Inline { data, .. } => {
|
ExtentData::Inline { data, .. } => (&data[start as usize..end as usize]).into(),
|
||||||
// TODO: handle compression and encryption
|
|
||||||
let data = if let Some(end) = end {
|
|
||||||
&data[start as usize..end as usize]
|
|
||||||
} else {
|
|
||||||
&data[start as usize..]
|
|
||||||
};
|
|
||||||
|
|
||||||
data.into()
|
|
||||||
}
|
|
||||||
ExtentData::Other(extent) => {
|
ExtentData::Other(extent) => {
|
||||||
let address = extent.address() + extent.offset() + start;
|
let address = extent.address() + extent.offset() + start;
|
||||||
log::info!(
|
|
||||||
"address: {} = {} + {} + {}",
|
|
||||||
address,
|
|
||||||
extent.address(),
|
|
||||||
extent.offset(),
|
|
||||||
start
|
|
||||||
);
|
|
||||||
let address = self
|
let address = self
|
||||||
.volume
|
.volume
|
||||||
.inner
|
.inner
|
||||||
.offset_from_logical(address)
|
.offset_from_logical(address)
|
||||||
.ok_or(Error::BadLogicalAddress)?;
|
.ok_or(Error::BadLogicalAddress)?;
|
||||||
let data = self
|
|
||||||
.volume
|
let range = address
|
||||||
.inner
|
..(address
|
||||||
.read_range(address..address + end.unwrap_or(extent.num_bytes()))
|
+ match extent.extent_data1().compression() {
|
||||||
.expect("bytes");
|
crate::structs::CompressionType::Zlib
|
||||||
|
| crate::structs::CompressionType::Lzo
|
||||||
|
| crate::structs::CompressionType::ZStd => extent.size(), // compressed size
|
||||||
|
_ => len,
|
||||||
|
});
|
||||||
|
|
||||||
|
let data = self.volume.inner.read_range(range).expect("bytes");
|
||||||
data.into()
|
data.into()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
log::info!("reading {} bytes from file", data.len());
|
log::info!("reading {} bytes from file", data.len());
|
||||||
log::info!("extent type: {:?}", extent.header().ty());
|
|
||||||
log::info!("compression: {:?}", extent.header().compression());
|
log::info!("compression: {:?}", extent.header().compression());
|
||||||
log::info!("raw bytes: {:?}", data);
|
|
||||||
let data = match extent.header().compression() {
|
let data = match extent.header().compression() {
|
||||||
crate::structs::CompressionType::None => data,
|
crate::structs::CompressionType::None => data,
|
||||||
crate::structs::CompressionType::Zlib => {
|
crate::structs::CompressionType::Zlib => {
|
||||||
|
@ -683,7 +675,7 @@ impl<R: super::Read> Fs<R> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
contents.extend_from_slice(&data);
|
contents.extend_from_slice(&data[..len as usize]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(contents)
|
Ok(contents)
|
||||||
|
|
Loading…
Reference in a new issue