pub struct BlockInfo {
pub offset: u64,
pub length: u32,
pub logical_len: u32,
pub checksum: u32,
}Expand description
Metadata for a single compressed block in the snapshot.
Each block represents a contiguous chunk of logical data (typically 4KB-64KB) that has been compressed, optionally encrypted, and written to the snapshot file.
§Fields
- offset: Physical byte offset in the snapshot file (where compressed data starts)
- length: Compressed size in bytes (0 for sparse/zero blocks)
- logical_len: Uncompressed size in bytes (original data size)
- checksum: CRC32 of compressed data (for integrity verification)
§Special Values
offset = BLOCK_OFFSET_PARENT(u64::MAX): Block stored in parent snapshot (thin snapshots)length = 0: Sparse block (all zeros, not stored on disk)
§Size
This struct is 20 bytes, kept compact to minimize index overhead.
§Examples
use hexz_core::format::index::BlockInfo;
// Normal block
let block = BlockInfo {
offset: 4096, // Starts at byte 4096
length: 2048, // Compressed to 2KB
logical_len: 4096, // Original 4KB
checksum: 0x12345678,
};
// Sparse (zero) block
let sparse = BlockInfo {
offset: 0,
length: 0, // Not stored
logical_len: 4096, // But logically 4KB
checksum: 0,
};Fields§
§offset: u64Physical offset in the snapshot file (bytes).
length: u32Compressed size in bytes (0 for sparse blocks).
logical_len: u32Uncompressed logical size in bytes.
checksum: u32CRC32 checksum of compressed data.
Implementations§
Source§impl BlockInfo
impl BlockInfo
Sourcepub fn sparse(len: u32) -> Self
pub fn sparse(len: u32) -> Self
Creates a sparse (zero-filled) block descriptor.
Sparse blocks represent regions of all-zero data that are not physically stored in the snapshot file. This optimization significantly reduces snapshot size for sparse disk images (e.g., freshly created filesystems, swap areas).
§Returns
A BlockInfo with:
offset = 0(not stored on disk)length = 0(no compressed data)logical_len = len(representslenbytes of zeros)checksum = 0(no data to checksum)
§Parameters
len: Logical size of the zero-filled region in bytes
§Examples
use hexz_core::format::index::BlockInfo;
// Create a sparse 4KB block
let sparse = BlockInfo::sparse(4096);
assert_eq!(sparse.offset, 0);
assert_eq!(sparse.length, 0);
assert_eq!(sparse.logical_len, 4096);
// When reading this block, reader fills output buffer with zeros
// without performing any I/O.Sourcepub fn is_sparse(&self) -> bool
pub fn is_sparse(&self) -> bool
Tests whether this block is sparse (all zeros, not stored on disk).
§Returns
true if length == 0 and offset != BLOCK_OFFSET_PARENT, indicating
that this block is not stored in the snapshot file and should be read as zeros.
§Examples
use hexz_core::format::index::BlockInfo;
let sparse = BlockInfo::sparse(4096);
assert!(sparse.is_sparse());
let normal = BlockInfo {
offset: 4096,
length: 2048,
logical_len: 4096,
checksum: 0x12345678,
};
assert!(!normal.is_sparse());Sourcepub fn is_parent_ref(&self) -> bool
pub fn is_parent_ref(&self) -> bool
Tests whether this block is stored in the parent snapshot.
For thin snapshots, blocks that haven’t been modified are marked with
offset = BLOCK_OFFSET_PARENT (u64::MAX) and must be read from the
parent snapshot instead of the current file.
§Returns
true if offset == u64::MAX, indicating a parent reference.
§Examples
use hexz_core::format::index::BlockInfo;
let parent_block = BlockInfo {
offset: u64::MAX, // BLOCK_OFFSET_PARENT
length: 0,
logical_len: 4096,
checksum: 0,
};
assert!(parent_block.is_parent_ref());Trait Implementations§
Source§impl<'de> Deserialize<'de> for BlockInfo
impl<'de> Deserialize<'de> for BlockInfo
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Copy for BlockInfo
Auto Trait Implementations§
impl Freeze for BlockInfo
impl RefUnwindSafe for BlockInfo
impl Send for BlockInfo
impl Sync for BlockInfo
impl Unpin for BlockInfo
impl UnsafeUnpin for BlockInfo
impl UnwindSafe for BlockInfo
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more