proper compression handling of ranges

This commit is contained in:
Janis 2023-04-11 01:58:37 +02:00
parent 8ba04a0b94
commit 15089abba2

View file

@ -572,63 +572,55 @@ impl<R: super::Read> Fs<R> {
let extent_start = *offset;
let extent_end = extent_start + extent.len();
// length of the entire range to be read
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 end = end.map(|end| end.max(extent_end));
let len = end.map(|end| (end - start2));
let end = end.map(|end| end.max(extent_end)).unwrap_or(extent.len());
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
} else {
start2 < extent_end
}
}) {
//
let start = start.saturating_sub(offset);
let end = end.map(|end| end - offset);
let end = end.map(|end| end - offset).unwrap_or(extent.len());
let len = end - start;
log::info!("reading {}..{:?} from extent.", start, end);
let data: alloc::borrow::Cow<[u8]> = match &extent {
ExtentData::Inline { data, .. } => {
// 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::Inline { data, .. } => (&data[start as usize..end as usize]).into(),
ExtentData::Other(extent) => {
let address = extent.address() + extent.offset() + start;
log::info!(
"address: {} = {} + {} + {}",
address,
extent.address(),
extent.offset(),
start
);
let address = self
.volume
.inner
.offset_from_logical(address)
.ok_or(Error::BadLogicalAddress)?;
let data = self
.volume
.inner
.read_range(address..address + end.unwrap_or(extent.num_bytes()))
.expect("bytes");
let range = address
..(address
+ match extent.extent_data1().compression() {
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()
}
};
log::info!("reading {} bytes from file", data.len());
log::info!("extent type: {:?}", extent.header().ty());
log::info!("compression: {:?}", extent.header().compression());
log::info!("raw bytes: {:?}", data);
let data = match extent.header().compression() {
crate::structs::CompressionType::None => data,
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)