iRebuild cache if it is larger than expected - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 5f1e1e970f10eb34b5392079a0b98827eb6a8af5 /scm/dedup/commit/5f1e1e970f10eb34b5392079a0b98827eb6a8af5.gph bitreich.org 70 1parent e2a7f03a6b43cf093fc814dd8610e2b73c1345a3 /scm/dedup/commit/e2a7f03a6b43cf093fc814dd8610e2b73c1345a3.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Mon, 4 Mar 2019 14:56:10 +0000 Err bitreich.org 70 i Err bitreich.org 70 iRebuild cache if it is larger than expected Err bitreich.org 70 i Err bitreich.org 70 iWe don't want bogus cache entries that could in theory match new Err bitreich.org 70 iblocks. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 27 +++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 19 insertions(+), 8 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -411,7 +411,7 @@ check_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i blk_desc = &snap->blk_desc[i]; Err bitreich.org 70 i memcpy(&cache_entry.md, blk_desc->md, sizeof(cache_entry.md)); Err bitreich.org 70 i if (lookup_cache_entry(cache, &cache_entry) < 0) { Err bitreich.org 70 i- if (verbose) Err bitreich.org 70 i+ if (verbose > 0) Err bitreich.org 70 i fprintf(stderr, "Cache is corrupted\n"); Err bitreich.org 70 i args->ret = -1; Err bitreich.org 70 i return WALK_STOP; Err bitreich.org 70 i@@ -497,6 +497,16 @@ match_ver(uint64_t v) Err bitreich.org 70 i VER_MAJ, VER_MIN, maj, min); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static uint64_t Err bitreich.org 70 i+cache_nr_entries(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct stat sb; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i+ err(1, "fstat"); Err bitreich.org 70 i+ return sb.st_size / CACHE_ENTRY_SIZE; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static int Err bitreich.org 70 i flush_cache(struct cache_entry *cache_entry) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -507,16 +517,12 @@ flush_cache(struct cache_entry *cache_entry) Err bitreich.org 70 i static void Err bitreich.org 70 i load_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct stat sb; Err bitreich.org 70 i uint64_t nr_entries; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i Err bitreich.org 70 i- if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat"); Err bitreich.org 70 i- Err bitreich.org 70 i- nr_entries = sb.st_size / CACHE_ENTRY_SIZE; Err bitreich.org 70 i+ nr_entries = cache_nr_entries(); Err bitreich.org 70 i if (nr_entries == 0) { Err bitreich.org 70 i xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i if (verbose > 0) Err bitreich.org 70 i@@ -741,9 +747,14 @@ main(int argc, char *argv[]) Err bitreich.org 70 i xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i walk_snap(check_snap, NULL); Err bitreich.org 70 i Err bitreich.org 70 i- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i args.ret = -1; Err bitreich.org 70 i- walk_snap(check_cache, &args); Err bitreich.org 70 i+ if (cache_nr_entries() == snap_hdr.st.nr_blks) { Err bitreich.org 70 i+ xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i+ walk_snap(check_cache, &args); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ if (verbose > 0) Err bitreich.org 70 i+ fprintf(stderr, "Cache is corrupted\n"); Err bitreich.org 70 i+ } Err bitreich.org 70 i if (args.ret != 0) { Err bitreich.org 70 i free_cache(cache); Err bitreich.org 70 i cache = alloc_cache(); Err bitreich.org 70 .