From 96df2fb44b256eeddbc52d396e6687c42adc3623 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 4 Jan 2019 12:50:54 +0100 Subject: [PATCH] backup/chunk_store.rs: implement read_chunk() --- src/backup/archive_index.rs | 16 ++++++++++++++++ src/backup/chunk_store.rs | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/backup/archive_index.rs b/src/backup/archive_index.rs index 44d7197b..3bcac8d5 100644 --- a/src/backup/archive_index.rs +++ b/src/backup/archive_index.rs @@ -129,6 +129,21 @@ impl <'a> ArchiveIndexReader<'a> { } Ok(()) } + + pub fn dump_catar(&self, mut writer: Box) -> Result<(), Error> { + + for pos in 0..self.index_entries { + let offset = unsafe { *(self.index.add(pos*40) as *const u64) }; + let digest = unsafe { std::slice::from_raw_parts(self.index.add(pos*40+8), 32) }; + + let chunk = self.store.read_chunk(digest)?; + println!("Dump {:08x} {}", offset, chunk.len()); + writer.write_all(&chunk)?; + + } + + Ok(()) + } } @@ -240,6 +255,7 @@ impl <'a> ArchiveIndexWriter<'a> { match self.store.insert_chunk(&self.chunk_buffer) { Ok((is_duplicate, digest)) => { println!("ADD CHUNK {:016x} {} {} {}", self.chunk_offset, chunk_size, is_duplicate, digest_to_hex(&digest)); + let chunk_end = self.writer.write(unsafe { &std::mem::transmute::(self.chunk_offset as u64) })?; self.writer.write(&digest)?; self.chunk_buffer.truncate(0); diff --git a/src/backup/chunk_store.rs b/src/backup/chunk_store.rs index 5d34f3ce..c0f637d2 100644 --- a/src/backup/chunk_store.rs +++ b/src/backup/chunk_store.rs @@ -165,6 +165,24 @@ impl ChunkStore { Ok(()) } + pub fn read_chunk(&self, digest:&[u8]) -> Result, Error> { + + let mut chunk_path = self.chunk_dir.clone(); + let prefix = digest_to_prefix(&digest); + chunk_path.push(&prefix); + let digest_str = digest_to_hex(&digest); + chunk_path.push(&digest_str); + + let mut f = std::fs::File::open(&chunk_path)?; + let mut chunk = Vec::with_capacity(64*1024); + + use std::io::Read; + + f.read_to_end(&mut chunk)?; + + Ok(chunk) + } + fn sweep_old_files(&self, handle: &mut nix::dir::Dir, status: &mut GarbageCollectionStatus) -> Result<(), Error> { let rawfd = handle.as_raw_fd();