From 3b62116ce655fbda4c7ccb32a48189015d2fa7f2 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Thu, 18 Jun 2020 13:55:26 +0200 Subject: [PATCH] implement AsyncReadChunk for LocalChunkReader same as the sync ReadChunk but uses tokio::fs::read instead of file_get_contents Signed-off-by: Dominik Csapak --- src/backup/read_chunk.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) 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) + }) + } +}