src/backup/fixed_index.rs: compute checksum over the index
This commit is contained in:
parent
16ff6b7cd8
commit
9335d74eba
@ -24,7 +24,9 @@ pub struct FixedIndexHeader {
|
|||||||
pub ctime: u64,
|
pub ctime: u64,
|
||||||
pub size: u64,
|
pub size: u64,
|
||||||
pub chunk_size: u64,
|
pub chunk_size: u64,
|
||||||
reserved: [u8; 4040], // overall size is one page (4096 bytes)
|
/// Sha256 over the index ``SHA256(digest1||digest2||...)``
|
||||||
|
pub index_csum: [u8; 32],
|
||||||
|
reserved: [u8; 4008], // overall size is one page (4096 bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// split image into fixed size chunks
|
// split image into fixed size chunks
|
||||||
@ -39,6 +41,7 @@ pub struct FixedIndexReader {
|
|||||||
index: *mut u8,
|
index: *mut u8,
|
||||||
pub uuid: [u8; 16],
|
pub uuid: [u8; 16],
|
||||||
pub ctime: u64,
|
pub ctime: u64,
|
||||||
|
pub index_csum: [u8; 32],
|
||||||
}
|
}
|
||||||
|
|
||||||
// `index` is mmap()ed which cannot be thread-local so should be sendable
|
// `index` is mmap()ed which cannot be thread-local so should be sendable
|
||||||
@ -122,6 +125,7 @@ impl FixedIndexReader {
|
|||||||
index: data,
|
index: data,
|
||||||
ctime,
|
ctime,
|
||||||
uuid: header.uuid,
|
uuid: header.uuid,
|
||||||
|
index_csum: header.index_csum,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,6 +190,7 @@ impl IndexFile for FixedIndexReader {
|
|||||||
|
|
||||||
pub struct FixedIndexWriter {
|
pub struct FixedIndexWriter {
|
||||||
store: Arc<ChunkStore>,
|
store: Arc<ChunkStore>,
|
||||||
|
file: File,
|
||||||
_lock: tools::ProcessLockSharedGuard,
|
_lock: tools::ProcessLockSharedGuard,
|
||||||
filename: PathBuf,
|
filename: PathBuf,
|
||||||
tmp_filename: PathBuf,
|
tmp_filename: PathBuf,
|
||||||
@ -246,6 +251,8 @@ impl FixedIndexWriter {
|
|||||||
header.chunk_size = u64::to_le(chunk_size as u64);
|
header.chunk_size = u64::to_le(chunk_size as u64);
|
||||||
header.uuid = *uuid.as_bytes();
|
header.uuid = *uuid.as_bytes();
|
||||||
|
|
||||||
|
header.index_csum = [0u8; 32];
|
||||||
|
|
||||||
file.write_all(&buffer)?;
|
file.write_all(&buffer)?;
|
||||||
|
|
||||||
let index_length = (size + chunk_size - 1)/chunk_size;
|
let index_length = (size + chunk_size - 1)/chunk_size;
|
||||||
@ -260,9 +267,9 @@ impl FixedIndexWriter {
|
|||||||
file.as_raw_fd(),
|
file.as_raw_fd(),
|
||||||
header_size as i64) }? as *mut u8;
|
header_size as i64) }? as *mut u8;
|
||||||
|
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
store,
|
store,
|
||||||
|
file,
|
||||||
_lock: shared_lock,
|
_lock: shared_lock,
|
||||||
filename: full_path,
|
filename: full_path,
|
||||||
tmp_filename: tmp_path,
|
tmp_filename: tmp_path,
|
||||||
@ -294,17 +301,28 @@ impl FixedIndexWriter {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn close(&mut self) -> Result<(), Error> {
|
pub fn close(&mut self) -> Result<[u8; 32], Error> {
|
||||||
|
|
||||||
if self.index == std::ptr::null_mut() { bail!("cannot close already closed index file."); }
|
if self.index == std::ptr::null_mut() { bail!("cannot close already closed index file."); }
|
||||||
|
|
||||||
|
let index_size = self.index_length*32;
|
||||||
|
let data = unsafe { std::slice::from_raw_parts(self.index, index_size) };
|
||||||
|
let index_csum = openssl::sha::sha256(data);
|
||||||
|
|
||||||
self.unmap()?;
|
self.unmap()?;
|
||||||
|
|
||||||
|
use std::io::Seek;
|
||||||
|
|
||||||
|
let csum_offset = proxmox::tools::offsetof!(FixedIndexHeader, index_csum);
|
||||||
|
self.file.seek(std::io::SeekFrom::Start(csum_offset as u64))?;
|
||||||
|
self.file.write_all(&index_csum)?;
|
||||||
|
self.file.flush()?;
|
||||||
|
|
||||||
if let Err(err) = std::fs::rename(&self.tmp_filename, &self.filename) {
|
if let Err(err) = std::fs::rename(&self.tmp_filename, &self.filename) {
|
||||||
bail!("Atomic rename file {:?} failed - {}", self.filename, err);
|
bail!("Atomic rename file {:?} failed - {}", self.filename, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(index_csum)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: We want to add data out of order, so do not assume any order here.
|
// Note: We want to add data out of order, so do not assume any order here.
|
||||||
|
Loading…
Reference in New Issue
Block a user