backup/chunk_store: split insert_chunk
The protocol handler will receive chunk data plus a hash pre-calculated by the client. It will verify the hash before sending it up to the datastore in order to respond to the client with an error on a mismatch, so there's no need to recalculate the hash another time. Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
parent
3a50ddd0c9
commit
9ac6ec868a
@ -298,24 +298,30 @@ impl ChunkStore {
|
|||||||
pub fn insert_chunk(&self, chunk: &[u8]) -> Result<(bool, [u8; 32], u64), Error> {
|
pub fn insert_chunk(&self, chunk: &[u8]) -> Result<(bool, [u8; 32], u64), Error> {
|
||||||
|
|
||||||
// fixme: use Sha512/256 when available
|
// fixme: use Sha512/256 when available
|
||||||
let mut hasher = sha::Sha256::new();
|
let digest = sha::sha256(chunk);
|
||||||
hasher.update(chunk);
|
let (new, csize) = self.insert_chunk_noverify(&digest, chunk)?;
|
||||||
|
Ok((new, digest, csize))
|
||||||
|
}
|
||||||
|
|
||||||
let digest = hasher.finish();
|
pub fn insert_chunk_noverify(
|
||||||
|
&self,
|
||||||
|
digest: &[u8; 32],
|
||||||
|
chunk: &[u8],
|
||||||
|
) -> Result<(bool, u64), Error> {
|
||||||
|
|
||||||
//println!("DIGEST {}", tools::digest_to_hex(&digest));
|
//println!("DIGEST {}", tools::digest_to_hex(&digest));
|
||||||
|
|
||||||
let mut chunk_path = self.chunk_dir.clone();
|
let mut chunk_path = self.chunk_dir.clone();
|
||||||
let prefix = digest_to_prefix(&digest);
|
let prefix = digest_to_prefix(digest);
|
||||||
chunk_path.push(&prefix);
|
chunk_path.push(&prefix);
|
||||||
let digest_str = tools::digest_to_hex(&digest);
|
let digest_str = tools::digest_to_hex(digest);
|
||||||
chunk_path.push(&digest_str);
|
chunk_path.push(&digest_str);
|
||||||
|
|
||||||
let lock = self.mutex.lock();
|
let lock = self.mutex.lock();
|
||||||
|
|
||||||
if let Ok(metadata) = std::fs::metadata(&chunk_path) {
|
if let Ok(metadata) = std::fs::metadata(&chunk_path) {
|
||||||
if metadata.is_file() {
|
if metadata.is_file() {
|
||||||
return Ok((true, digest, metadata.len()));
|
return Ok((true, metadata.len()));
|
||||||
} else {
|
} else {
|
||||||
bail!("Got unexpected file type on store '{}' for chunk {}", self.name, digest_str);
|
bail!("Got unexpected file type on store '{}' for chunk {}", self.name, digest_str);
|
||||||
}
|
}
|
||||||
@ -351,7 +357,7 @@ impl ChunkStore {
|
|||||||
|
|
||||||
drop(lock);
|
drop(lock);
|
||||||
|
|
||||||
Ok((false, digest, compressed_size))
|
Ok((false, compressed_size))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn relative_path(&self, path: &Path) -> PathBuf {
|
pub fn relative_path(&self, path: &Path) -> PathBuf {
|
||||||
|
Loading…
Reference in New Issue
Block a user