diff --git a/README.md b/README.md index 8648811..b067bcd 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,6 @@ Recommended: Brotli/2-7 ### Core functionality - Fix vacuum inconsistencies (either index related, or bundle syncing related) -- Proper bundle usage analysis with compressed size estimation - Recompress & combine bundles - Allow to use tar files for backup and restore (--tar, http://alexcrichton.com/tar-rs/tar/index.html) - Allow to mount backups (inode id == position in index, lru cache) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 8fd1c83..1d423fb 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -41,7 +41,7 @@ fn get_backup(repo: &Repository, backup_name: &str) -> Backup { checked(repo.get_backup(backup_name), "load backup") } -fn find_reference_backup(repo: &Repository, path: &str) -> Option { +fn find_reference_backup(repo: &Repository, path: &str) -> Option<(String, Backup)> { let mut matching = Vec::new(); let hostname = match get_hostname() { Ok(hostname) => hostname, @@ -58,12 +58,12 @@ fn find_reference_backup(repo: &Repository, path: &str) -> Option { exit(3) } }; - for (_name, backup) in backup_map { + for (name, backup) in backup_map { if backup.host == hostname && backup.path == path { - matching.push(backup); + matching.push((name, backup)); } } - matching.sort_by_key(|b| b.date); + matching.sort_by_key(|&(_, ref b)| b.date); matching.pop() } @@ -187,7 +187,7 @@ fn print_analysis(analysis: &HashMap) { println!("Reclaimable space (depending on vacuum ratio)"); #[allow(unknown_lints,needless_range_loop)] for i in 0..11 { - println!(" - ratio={:3}: {:10}, {:4.1} %", i*10, to_file_size(reclaim_space[i] as u64), reclaim_space[i] as f32 / data_total as f32 * 100.0); + println!(" - ratio={:3}: {:>10}, {:4.1} %", i*10, to_file_size(reclaim_space[i] as u64), reclaim_space[i] as f32 / data_total as f32 * 100.0); } } @@ -222,16 +222,20 @@ pub fn run() { let mut repo = open_repository(&repo_path); let mut reference_backup = None; if !full { - reference_backup = reference.map(|r| get_backup(&repo, &r)); + reference_backup = reference.map(|r| { + let b = get_backup(&repo, &r); + (r, b) + }); if reference_backup.is_none() { reference_backup = find_reference_backup(&repo, &src_path); } - if let Some(ref backup) = reference_backup { - info!("Using backup from {} as reference", Local.timestamp(backup.date, 0).to_rfc2822()); + if let Some(&(ref name, _)) = reference_backup.as_ref() { + info!("Using backup {} as reference", name); } else { info!("No reference backup found, doing a full scan instead"); } } + let reference_backup = reference_backup.map(|(_, backup)| backup); if let Some(excludes_from) = excludes_from { for line in BufReader::new(checked(File::open(excludes_from), "open excludes file")).lines() { excludes.push(checked(line, "read excludes file")); diff --git a/src/index.rs b/src/index.rs index 2aa0bab..6f4db35 100644 --- a/src/index.rs +++ b/src/index.rs @@ -13,7 +13,7 @@ use mmap::{MemoryMap, MapOption, MapError}; const MAGIC: [u8; 7] = *b"zvault\x02"; const VERSION: u8 = 1; pub const MAX_USAGE: f64 = 0.9; -pub const MIN_USAGE: f64 = 0.25; +pub const MIN_USAGE: f64 = 0.35; pub const INITIAL_SIZE: usize = 1024; diff --git a/src/repository/backup.rs b/src/repository/backup.rs index 88105c6..02616ae 100644 --- a/src/repository/backup.rs +++ b/src/repository/backup.rs @@ -75,26 +75,24 @@ impl Repository { backups.push((name, date, backup)); } } - backups.sort_by_key(|backup| backup.2.date); + backups.sort_by_key(|backup| -backup.2.date); let mut keep = Bitmap::new(backups.len()); fn mark_needed) -> K>(backups: &[(String, DateTime, Backup)], keep: &mut Bitmap, max: usize, keyfn: F) { - let mut unique = VecDeque::with_capacity(max+1); + let mut kept = 0; let mut last = None; for (i, backup) in backups.iter().enumerate() { let val = keyfn(&backup.1); let cur = Some(val); if cur != last { - last = cur; - unique.push_back(i); - if unique.len() > max { - unique.pop_front(); + if kept >= max { + break } + last = cur; + keep.set(i); + kept += 1; } } - for i in unique { - keep.set(i); - } } if let Some(max) = yearly { mark_needed(&backups, &mut keep, max, |d| d.year());