mirror of https://github.com/dswd/zvault
parent
7e66d806b5
commit
1a2ea29d24
10 changed files with 524 additions and 41 deletions
@ -0,0 +1,259 @@ |
||||
++ mkdir repos |
||||
++ target/release/zvault init --compression brotli/3 repos/zvault_brotli3 |
||||
|
||||
real 0m0.009s |
||||
user 0m0.008s |
||||
sys 0m0.000s |
||||
++ target/release/zvault init --compression brotli/6 repos/zvault_brotli6 |
||||
|
||||
real 0m0.010s |
||||
user 0m0.004s |
||||
sys 0m0.004s |
||||
++ target/release/zvault init --compression lzma2/2 repos/zvault_lzma2 |
||||
|
||||
real 0m0.009s |
||||
user 0m0.004s |
||||
sys 0m0.004s |
||||
++ attic init repos/attic |
||||
Initializing repository at "repos/attic" |
||||
Encryption NOT enabled. |
||||
Use the "--encryption=passphrase|keyfile" to enable encryption. |
||||
Initializing cache... |
||||
|
||||
real 0m0.136s |
||||
user 0m0.100s |
||||
sys 0m0.016s |
||||
++ borg init -e none repos/borg |
||||
|
||||
real 0m0.253s |
||||
user 0m0.204s |
||||
sys 0m0.012s |
||||
++ borg init -e none repos/borg-zlib |
||||
|
||||
real 0m0.243s |
||||
user 0m0.200s |
||||
sys 0m0.008s |
||||
++ zbackup init --non-encrypted repos/zbackup |
||||
|
||||
real 0m0.003s |
||||
user 0m0.000s |
||||
sys 0m0.000s |
||||
++ cat |
||||
++ target/release/zvault put repos/zvault_brotli3::silesia1 test_data/silesia.tar |
||||
|
||||
real 0m3.389s |
||||
user 0m3.172s |
||||
sys 0m0.220s |
||||
++ target/release/zvault put repos/zvault_brotli3::silesia2 test_data/silesia.tar |
||||
|
||||
real 0m0.741s |
||||
user 0m0.708s |
||||
sys 0m0.032s |
||||
++ target/release/zvault put repos/zvault_brotli6::silesia1 test_data/silesia.tar |
||||
|
||||
real 0m10.166s |
||||
user 0m9.880s |
||||
sys 0m0.284s |
||||
++ target/release/zvault put repos/zvault_brotli6::silesia2 test_data/silesia.tar |
||||
|
||||
real 0m0.707s |
||||
user 0m0.660s |
||||
sys 0m0.044s |
||||
++ target/release/zvault put repos/zvault_lzma2::silesia1 test_data/silesia.tar |
||||
|
||||
real 0m26.277s |
||||
user 0m25.988s |
||||
sys 0m0.288s |
||||
++ target/release/zvault put repos/zvault_lzma2::silesia2 test_data/silesia.tar |
||||
|
||||
real 0m0.710s |
||||
user 0m0.656s |
||||
sys 0m0.052s |
||||
++ attic create repos/attic::silesia1 test_data/silesia.tar |
||||
|
||||
real 0m9.304s |
||||
user 0m8.440s |
||||
sys 0m0.328s |
||||
++ attic create repos/attic::silesia2 test_data/silesia.tar |
||||
|
||||
real 0m1.210s |
||||
user 0m1.128s |
||||
sys 0m0.040s |
||||
++ borg create -C none repos/borg::silesia1 test_data/silesia.tar |
||||
|
||||
real 0m4.805s |
||||
user 0m2.240s |
||||
sys 0m1.156s |
||||
++ borg create -C none repos/borg::silesia2 test_data/silesia.tar |
||||
|
||||
real 0m1.475s |
||||
user 0m1.260s |
||||
sys 0m0.164s |
||||
++ borg create -C zlib repos/borg-zlib::silesia1 test_data/silesia.tar |
||||
|
||||
real 0m10.093s |
||||
user 0m9.184s |
||||
sys 0m0.428s |
||||
++ borg create -C zlib repos/borg-zlib::silesia2 test_data/silesia.tar |
||||
|
||||
real 0m1.534s |
||||
user 0m1.280s |
||||
sys 0m0.192s |
||||
++ zbackup backup --non-encrypted repos/zbackup/backups/silesia1 |
||||
Loading index... |
||||
Index loaded. |
||||
Using up to 4 thread(s) for compression |
||||
|
||||
real 0m24.362s |
||||
user 1m32.292s |
||||
sys 0m0.776s |
||||
++ zbackup backup --non-encrypted repos/zbackup/backups/silesia2 |
||||
Loading index... |
||||
Loading index file 90cd1b771e3c068c6617b0089f4fe5fde4f654cb0473b7d7... |
||||
Index loaded. |
||||
Using up to 4 thread(s) for compression |
||||
|
||||
real 0m1.281s |
||||
user 0m1.248s |
||||
sys 0m0.032s |
||||
++ du -h test_data/silesia.tar |
||||
203M test_data/silesia.tar |
||||
++ du -sh repos/zbackup/bundles repos/zvault_brotli3/bundles repos/zvault_brotli6/bundles repos/zvault_lzma2/bundles repos/attic repos/borg repos/borg-zlib repos/zbackup |
||||
51M repos/zbackup/bundles |
||||
65M repos/zvault_brotli3/bundles |
||||
58M repos/zvault_brotli6/bundles |
||||
55M repos/zvault_lzma2/bundles |
||||
68M repos/attic |
||||
203M repos/borg |
||||
66M repos/borg-zlib |
||||
164K repos/zbackup |
||||
++ rm -rf repos |
||||
++ mkdir repos |
||||
++ target/release/zvault init --compression brotli/3 repos/zvault_brotli3 |
||||
|
||||
real 0m0.005s |
||||
user 0m0.000s |
||||
sys 0m0.004s |
||||
++ target/release/zvault init --compression brotli/6 repos/zvault_brotli6 |
||||
|
||||
real 0m0.005s |
||||
user 0m0.004s |
||||
sys 0m0.000s |
||||
++ target/release/zvault init --compression lzma2/2 repos/zvault_lzma2 |
||||
|
||||
real 0m0.005s |
||||
user 0m0.004s |
||||
sys 0m0.000s |
||||
++ attic init repos/attic |
||||
Initializing repository at "repos/attic" |
||||
Encryption NOT enabled. |
||||
Use the "--encryption=passphrase|keyfile" to enable encryption. |
||||
Initializing cache... |
||||
|
||||
real 0m0.095s |
||||
user 0m0.060s |
||||
sys 0m0.020s |
||||
++ borg init -e none repos/borg |
||||
|
||||
real 0m0.235s |
||||
user 0m0.184s |
||||
sys 0m0.016s |
||||
++ borg init -e none repos/borg-zlib |
||||
|
||||
real 0m0.262s |
||||
user 0m0.200s |
||||
sys 0m0.016s |
||||
++ zbackup init --non-encrypted repos/zbackup |
||||
|
||||
real 0m0.004s |
||||
user 0m0.000s |
||||
sys 0m0.000s |
||||
++ cat |
||||
++ target/release/zvault put repos/zvault_brotli3::ubuntu1 test_data/ubuntu.tar |
||||
|
||||
real 0m3.008s |
||||
user 0m2.748s |
||||
sys 0m0.260s |
||||
++ target/release/zvault put repos/zvault_brotli3::ubuntu2 test_data/ubuntu.tar |
||||
|
||||
real 0m0.621s |
||||
user 0m0.580s |
||||
sys 0m0.040s |
||||
++ target/release/zvault put repos/zvault_brotli6::ubuntu1 test_data/ubuntu.tar |
||||
|
||||
real 0m10.916s |
||||
user 0m10.680s |
||||
sys 0m0.232s |
||||
++ target/release/zvault put repos/zvault_brotli6::ubuntu2 test_data/ubuntu.tar |
||||
|
||||
real 0m0.619s |
||||
user 0m0.596s |
||||
sys 0m0.020s |
||||
++ target/release/zvault put repos/zvault_lzma2::ubuntu1 test_data/ubuntu.tar |
||||
|
||||
real 0m37.039s |
||||
user 0m36.792s |
||||
sys 0m0.244s |
||||
++ target/release/zvault put repos/zvault_lzma2::ubuntu2 test_data/ubuntu.tar |
||||
|
||||
real 0m0.640s |
||||
user 0m0.624s |
||||
sys 0m0.012s |
||||
++ attic create repos/attic::ubuntu1 test_data/ubuntu.tar |
||||
|
||||
real 0m9.309s |
||||
user 0m8.316s |
||||
sys 0m0.368s |
||||
++ attic create repos/attic::ubuntu2 test_data/ubuntu.tar |
||||
|
||||
real 0m1.093s |
||||
user 0m1.008s |
||||
sys 0m0.044s |
||||
++ borg create -C none repos/borg::ubuntu1 test_data/ubuntu.tar |
||||
|
||||
real 0m4.317s |
||||
user 0m1.988s |
||||
sys 0m1.032s |
||||
++ borg create -C none repos/borg::ubuntu2 test_data/ubuntu.tar |
||||
|
||||
real 0m1.402s |
||||
user 0m1.160s |
||||
sys 0m0.188s |
||||
++ borg create -C zlib repos/borg-zlib::ubuntu1 test_data/ubuntu.tar |
||||
|
||||
real 0m10.049s |
||||
user 0m8.788s |
||||
sys 0m0.532s |
||||
++ borg create -C zlib repos/borg-zlib::ubuntu2 test_data/ubuntu.tar |
||||
|
||||
real 0m1.291s |
||||
user 0m1.088s |
||||
sys 0m0.168s |
||||
++ zbackup backup --non-encrypted repos/zbackup/backups/ubuntu1 |
||||
Loading index... |
||||
Index loaded. |
||||
Using up to 4 thread(s) for compression |
||||
|
||||
real 0m17.972s |
||||
user 1m7.956s |
||||
sys 0m0.644s |
||||
++ zbackup backup --non-encrypted repos/zbackup/backups/ubuntu2 |
||||
Loading index... |
||||
Loading index file 3fea916708827f3f5cdfc18fca024ef9cf00aa92a0c8d676... |
||||
Index loaded. |
||||
Using up to 4 thread(s) for compression |
||||
|
||||
real 0m1.158s |
||||
user 0m1.132s |
||||
sys 0m0.024s |
||||
++ du -h test_data/ubuntu.tar |
||||
176M test_data/ubuntu.tar |
||||
++ du -sh repos/zbackup/bundles repos/zvault_brotli3/bundles repos/zvault_brotli6/bundles repos/zvault_lzma2/bundles repos/attic repos/borg repos/borg-zlib repos/zbackup |
||||
64M repos/zbackup/bundles |
||||
77M repos/zvault_brotli3/bundles |
||||
68M repos/zvault_brotli6/bundles |
||||
63M repos/zvault_lzma2/bundles |
||||
84M repos/attic |
||||
176M repos/borg |
||||
83M repos/borg-zlib |
||||
148K repos/zbackup |
@ -0,0 +1,79 @@ |
||||
use super::{Repository, Chunk}; |
||||
|
||||
use rmp_serde; |
||||
use serde::{Deserialize, Serialize}; |
||||
|
||||
use std::fs::{self, File}; |
||||
use std::path::Path; |
||||
|
||||
|
||||
#[derive(Default, Debug)] |
||||
pub struct Backup { |
||||
pub root: Vec<Chunk>, |
||||
pub total_data_size: u64, |
||||
pub changed_data_size: u64, |
||||
pub new_data_size: u64, |
||||
pub encoded_data_size: u64, |
||||
pub new_bundle_count: usize, |
||||
pub chunk_count: usize, |
||||
pub avg_chunk_size: f32, |
||||
pub date: i64, |
||||
pub duration: f32, |
||||
pub file_count: usize, |
||||
pub dir_count: usize |
||||
} |
||||
serde_impl!(Backup(u8) { |
||||
root: Vec<Chunk> => 0, |
||||
total_data_size: u64 => 1, |
||||
changed_data_size: u64 => 2, |
||||
new_data_size: u64 => 3, |
||||
encoded_data_size: u64 => 4, |
||||
new_bundle_count: usize => 5, |
||||
chunk_count: usize => 6, |
||||
avg_chunk_size: f32 => 7, |
||||
date: i64 => 8, |
||||
duration: f32 => 9, |
||||
file_count: usize => 10, |
||||
dir_count: usize => 11 |
||||
}); |
||||
|
||||
|
||||
impl Repository { |
||||
pub fn list_backups(&self) -> Result<Vec<String>, &'static str> { |
||||
let mut backups = Vec::new(); |
||||
let mut paths = Vec::new(); |
||||
let base_path = self.path.join("backups"); |
||||
paths.push(base_path.clone()); |
||||
while let Some(path) = paths.pop() { |
||||
for entry in try!(fs::read_dir(path).map_err(|_| "Failed to list files")) { |
||||
let entry = try!(entry.map_err(|_| "Failed to list files")); |
||||
let path = entry.path(); |
||||
if path.is_dir() { |
||||
paths.push(path); |
||||
} else { |
||||
let relpath = try!(path.strip_prefix(&base_path).map_err(|_| "Failed to obtain relative path")); |
||||
backups.push(relpath.to_string_lossy().to_string()); |
||||
} |
||||
} |
||||
} |
||||
Ok(backups) |
||||
} |
||||
|
||||
pub fn get_backup(&self, name: &str) -> Result<Backup, &'static str> { |
||||
let file = try!(File::open(self.path.join("backups").join(name)).map_err(|_| "Failed to load backup")); |
||||
let mut reader = rmp_serde::Deserializer::new(file); |
||||
Backup::deserialize(&mut reader).map_err(|_| "Failed to read backup data") |
||||
} |
||||
|
||||
pub fn save_backup(&mut self, backup: &Backup, name: &str) -> Result<(), &'static str> { |
||||
let mut file = try!(File::create(self.path.join("backups").join(name)).map_err(|_| "Failed to save backup")); |
||||
let mut writer = rmp_serde::Serializer::new(&mut file); |
||||
backup.serialize(&mut writer).map_err(|_| "Failed to write backup data") |
||||
} |
||||
|
||||
pub fn restore_backup<P: AsRef<Path>>(&mut self, backup: &Backup, path: P) -> Result<(), &'static str> { |
||||
let inode = try!(self.get_inode(&backup.root)); |
||||
try!(self.save_inode_at(&inode, path)); |
||||
Ok(()) |
||||
} |
||||
} |
@ -0,0 +1,60 @@ |
||||
set -ex |
||||
|
||||
mkdir repos |
||||
time target/release/zvault init --compression brotli/3 repos/zvault_brotli3 |
||||
time target/release/zvault init --compression brotli/6 repos/zvault_brotli6 |
||||
time target/release/zvault init --compression lzma2/2 repos/zvault_lzma2 |
||||
time attic init repos/attic |
||||
time borg init -e none repos/borg |
||||
time borg init -e none repos/borg-zlib |
||||
time zbackup init --non-encrypted repos/zbackup |
||||
|
||||
cat < test_data/silesia.tar > /dev/null |
||||
time target/release/zvault put repos/zvault_brotli3::silesia1 test_data/silesia.tar |
||||
time target/release/zvault put repos/zvault_brotli3::silesia2 test_data/silesia.tar |
||||
time target/release/zvault put repos/zvault_brotli6::silesia1 test_data/silesia.tar |
||||
time target/release/zvault put repos/zvault_brotli6::silesia2 test_data/silesia.tar |
||||
time target/release/zvault put repos/zvault_lzma2::silesia1 test_data/silesia.tar |
||||
time target/release/zvault put repos/zvault_lzma2::silesia2 test_data/silesia.tar |
||||
time attic create repos/attic::silesia1 test_data/silesia.tar |
||||
time attic create repos/attic::silesia2 test_data/silesia.tar |
||||
time borg create -C none repos/borg::silesia1 test_data/silesia.tar |
||||
time borg create -C none repos/borg::silesia2 test_data/silesia.tar |
||||
time borg create -C zlib repos/borg-zlib::silesia1 test_data/silesia.tar |
||||
time borg create -C zlib repos/borg-zlib::silesia2 test_data/silesia.tar |
||||
time zbackup backup --non-encrypted repos/zbackup/backups/silesia1 < test_data/silesia.tar |
||||
time zbackup backup --non-encrypted repos/zbackup/backups/silesia2 < test_data/silesia.tar |
||||
|
||||
du -h test_data/silesia.tar |
||||
du -sh repos/zvault*/bundles repos/attic repos/borg repos/borg-zlib repos/zbackup |
||||
|
||||
rm -rf repos |
||||
|
||||
|
||||
mkdir repos |
||||
time target/release/zvault init --compression brotli/3 repos/zvault_brotli3 |
||||
time target/release/zvault init --compression brotli/6 repos/zvault_brotli6 |
||||
time target/release/zvault init --compression lzma2/2 repos/zvault_lzma2 |
||||
time attic init repos/attic |
||||
time borg init -e none repos/borg |
||||
time borg init -e none repos/borg-zlib |
||||
time zbackup init --non-encrypted repos/zbackup |
||||
|
||||
cat < test_data/ubuntu.tar > /dev/null |
||||
time target/release/zvault put repos/zvault_brotli3::ubuntu1 test_data/ubuntu.tar |
||||
time target/release/zvault put repos/zvault_brotli3::ubuntu2 test_data/ubuntu.tar |
||||
time target/release/zvault put repos/zvault_brotli6::ubuntu1 test_data/ubuntu.tar |
||||
time target/release/zvault put repos/zvault_brotli6::ubuntu2 test_data/ubuntu.tar |
||||
time target/release/zvault put repos/zvault_lzma2::ubuntu1 test_data/ubuntu.tar |
||||
time target/release/zvault put repos/zvault_lzma2::ubuntu2 test_data/ubuntu.tar |
||||
time attic create repos/attic::ubuntu1 test_data/ubuntu.tar |
||||
time attic create repos/attic::ubuntu2 test_data/ubuntu.tar |
||||
time borg create -C none repos/borg::ubuntu1 test_data/ubuntu.tar |
||||
time borg create -C none repos/borg::ubuntu2 test_data/ubuntu.tar |
||||
time borg create -C zlib repos/borg-zlib::ubuntu1 test_data/ubuntu.tar |
||||
time borg create -C zlib repos/borg-zlib::ubuntu2 test_data/ubuntu.tar |
||||
time zbackup backup --non-encrypted repos/zbackup/backups/ubuntu1 < test_data/ubuntu.tar |
||||
time zbackup backup --non-encrypted repos/zbackup/backups/ubuntu2 < test_data/ubuntu.tar |
||||
|
||||
du -h test_data/ubuntu.tar |
||||
du -sh repos/zvault*/bundles repos/attic repos/borg repos/borg-zlib repos/zbackup |
Loading…
Reference in new issue