iAlways check and rebuild the cache - 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 12641354d5c6d5d5a06b889df69ec71cbbeca176 /scm/dedup/commit/12641354d5c6d5d5a06b889df69ec71cbbeca176.gph bitreich.org 70 1parent cc98da662594f5538942073561082e92be19d9fb /scm/dedup/commit/cc98da662594f5538942073561082e92be19d9fb.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Mon, 4 Mar 2019 16:12:01 +0000 Err bitreich.org 70 i Err bitreich.org 70 iAlways check and rebuild the cache Err bitreich.org 70 i Err bitreich.org 70 iIt might be dangerous to proceed with a corrupt cache. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 97 +++++++++++++++---------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 46 insertions(+), 51 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@@ -403,7 +403,7 @@ check_snap(struct snapshot *snap, void *arg) Err bitreich.org 70 i * that case. Err bitreich.org 70 i */ Err bitreich.org 70 i static int Err bitreich.org 70 i-check_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i+check_cache_entry(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i int *ret = arg; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i@@ -429,18 +429,7 @@ check_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-list(struct snapshot *snap, void *arg) Err bitreich.org 70 i-{ Err bitreich.org 70 i- print_md(stdout, snap->md, sizeof(snap->md)); Err bitreich.org 70 i- if (snap->msg[0] != '\0') Err bitreich.org 70 i- printf("\t%s\n", snap->msg); Err bitreich.org 70 i- else Err bitreich.org 70 i- putchar('\n'); Err bitreich.org 70 i- return WALK_CONTINUE; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static int Err bitreich.org 70 i-rebuild_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i+reload_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i uint8_t *buf; Err bitreich.org 70 i@@ -469,6 +458,17 @@ rebuild_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static int Err bitreich.org 70 i+list(struct snapshot *snap, void *arg) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ print_md(stdout, snap->md, sizeof(snap->md)); Err bitreich.org 70 i+ if (snap->msg[0] != '\0') Err bitreich.org 70 i+ printf("\t%s\n", snap->msg); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ putchar('\n'); Err bitreich.org 70 i+ return WALK_CONTINUE; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i /* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i static void Err bitreich.org 70 i walk_snap(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i@@ -514,11 +514,30 @@ cache_nr_entries(void) 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+static void Err bitreich.org 70 i+check_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- write_cache_entry(cfd, cache_entry); Err bitreich.org 70 i- return 0; Err bitreich.org 70 i+ int ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (cache_nr_entries() != snap_hdr.st.nr_blks) { Err bitreich.org 70 i+ ret = -1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i+ ret = 0; Err bitreich.org 70 i+ walk_snap(check_cache_entry, &ret); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ret != 0) { Err bitreich.org 70 i+ free_cache(cache); Err bitreich.org 70 i+ cache = alloc_cache(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ftruncate(cfd, 0) < 0) Err bitreich.org 70 i+ err(1, "ftruncate"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i+ xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i+ walk_snap(reload_cache, NULL); Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -527,19 +546,10 @@ load_cache(void) 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+ check_cache(); Err bitreich.org 70 i Err bitreich.org 70 i+ xlseek(cfd, 0, SEEK_SET); 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- fprintf(stderr, "Rebuilding cache..."); Err bitreich.org 70 i- walk_snap(rebuild_cache, NULL); Err bitreich.org 70 i- if (verbose > 0) Err bitreich.org 70 i- fprintf(stderr, "done\n"); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i for (i = 0; i < nr_entries; i++) { Err bitreich.org 70 i struct cache_entry cache_entry; Err bitreich.org 70 i Err bitreich.org 70 i@@ -548,6 +558,13 @@ load_cache(void) Err bitreich.org 70 i } 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+ write_cache_entry(cfd, cache_entry); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static void Err bitreich.org 70 i save_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -757,29 +774,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (ret != 0) Err bitreich.org 70 i errx(1, "%s or %s is corrupted", SNAPSF, STOREF); Err bitreich.org 70 i Err bitreich.org 70 i- if (cache_nr_entries() != snap_hdr.st.nr_blks) { Err bitreich.org 70 i- ret = -1; Err bitreich.org 70 i- } else { Err bitreich.org 70 i- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- ret = 0; Err bitreich.org 70 i- walk_snap(check_cache, &ret); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if (ret != 0) { Err bitreich.org 70 i- free_cache(cache); Err bitreich.org 70 i- cache = alloc_cache(); Err bitreich.org 70 i- Err bitreich.org 70 i- if (ftruncate(cfd, 0) < 0) Err bitreich.org 70 i- err(1, "ftruncate"); Err bitreich.org 70 i- Err bitreich.org 70 i- if (verbose > 0) Err bitreich.org 70 i- fprintf(stderr, "Cache is corrupted, rebuilding..."); Err bitreich.org 70 i- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- walk_snap(rebuild_cache, NULL); Err bitreich.org 70 i- if (verbose > 0) Err bitreich.org 70 i- fprintf(stderr, "done\n"); Err bitreich.org 70 i- } Err bitreich.org 70 i+ check_cache(); Err bitreich.org 70 i Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 .