env.log(format!("download last backup index for archive '{}'", archive_name));
let count = index.index_count();
+ let image_size = index.index_bytes();
for pos in 0..count {
let digest = index.index_digest(pos).unwrap();
- let size = index.chunk_size as u32;
+ // Note: last chunk can be smaller
+ let start = (pos*index.chunk_size) as u64;
+ let mut end = start + index.chunk_size as u64;
+ if end > image_size { end = image_size; }
+ let size = (end - start) as u32;
env.register_chunk(*digest, size)?;
}
pub struct FixedIndexReader {
_file: File,
pub chunk_size: usize,
- pub size: usize,
+ pub size: u64,
index_length: usize,
index: *mut u8,
pub uuid: [u8; 16],
bail!("got unknown magic number");
}
- let size = u64::from_le(header.size) as usize;
+ let size = u64::from_le(header.size);
let ctime = u64::from_le(header.ctime);
- let chunk_size = u64::from_le(header.chunk_size) as usize;
+ let chunk_size = u64::from_le(header.chunk_size);
- let index_length = (size + chunk_size - 1)/chunk_size;
+ let index_length = ((size + chunk_size - 1)/chunk_size) as usize;
let index_size = index_length*32;
let rawfd = file.as_raw_fd();
Ok(Self {
_file: file,
- chunk_size,
+ chunk_size: chunk_size as usize,
size,
index_length,
index: data,
}
fn index_bytes(&self) -> u64 {
- (self.index_length * self.chunk_size) as u64
+ self.size
}
}