diff --git a/src/backup/read_chunk.rs b/src/backup/read_chunk.rs index 6469111a..35095e64 100644 --- a/src/backup/read_chunk.rs +++ b/src/backup/read_chunk.rs @@ -45,7 +45,7 @@ impl ReadChunk for LocalChunkReader { } fn read_chunk(&mut self, digest: &[u8; 32]) -> Result, Error> { - let chunk = self.read_raw_chunk(digest)?; + let chunk = ReadChunk::read_raw_chunk(self, digest)?; let raw_data = chunk.decode(self.crypt_config.as_ref().map(Arc::as_ref))?; @@ -68,3 +68,38 @@ pub trait AsyncReadChunk: Send { digest: &'a [u8; 32], ) -> Pin, Error>> + Send + 'a>>; } + +impl AsyncReadChunk for LocalChunkReader { + fn read_raw_chunk<'a>( + &'a mut self, + digest: &'a [u8; 32], + ) -> Pin> + Send + 'a>> { + Box::pin(async move{ + let digest_str = proxmox::tools::digest_to_hex(digest); + println!("READ CHUNK {}", digest_str); + + let (path, _) = self.store.chunk_path(digest); + + let raw_data = tokio::fs::read(&path).await?; + let chunk = DataBlob::from_raw(raw_data)?; + chunk.verify_crc()?; + + Ok(chunk) + }) + } + + fn read_chunk<'a>( + &'a mut self, + digest: &'a [u8; 32], + ) -> Pin, Error>> + Send + 'a>> { + Box::pin(async move { + let chunk = AsyncReadChunk::read_raw_chunk(self, digest).await?; + + let raw_data = chunk.decode(self.crypt_config.as_ref().map(Arc::as_ref))?; + + // fixme: verify digest? + + Ok(raw_data) + }) + } +}