iSimplify dedup() function - 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 893ee1895fb91a98344ba68192d2e9ad678bc203 /scm/dedup/commit/893ee1895fb91a98344ba68192d2e9ad678bc203.gph bitreich.org 70 1parent e8056ddcaccd7972a5008983d9bc60a3a36498c5 /scm/dedup/commit/e8056ddcaccd7972a5008983d9bc60a3a36498c5.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 21 Feb 2019 10:54:35 +0000 Err bitreich.org 70 i Err bitreich.org 70 iSimplify dedup() function Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 122 +++++++++++++++++++------------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 74 insertions(+), 48 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@@ -230,6 +230,12 @@ alloc_cache_entry(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i+free_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ free(ent); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i add_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i { Err bitreich.org 70 i RB_INSERT(cache, &cache_head, ent); Err bitreich.org 70 i@@ -255,7 +261,7 @@ free_cache(void) Err bitreich.org 70 i Err bitreich.org 70 i RB_FOREACH_SAFE(ent, cache, &cache_head, tmp) { Err bitreich.org 70 i RB_REMOVE(cache, &cache_head, ent); Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i+ free_cache_entry(ent); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -295,6 +301,12 @@ alloc_snap(void) Err bitreich.org 70 i return snap; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+void Err bitreich.org 70 i+free_snap(struct snapshot *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ free(snap); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i struct snapshot * Err bitreich.org 70 i grow_snap(struct snapshot *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -320,6 +332,12 @@ alloc_buf(size_t size) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i+free_buf(uint8_t *buf) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i hash_blk(uint8_t *buf, size_t size, uint8_t *md) Err bitreich.org 70 i { Err bitreich.org 70 i SHA256_CTX ctx; Err bitreich.org 70 i@@ -360,64 +378,73 @@ lookup_blk_desc(uint8_t *md, struct blk_desc *blk_desc) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i+dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t md[MDSIZE]; Err bitreich.org 70 i+ uint8_t *comp_buf; Err bitreich.org 70 i+ struct blk_desc blk_desc; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ comp_buf = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = comp(chunkp, comp_buf, chunk_size, comp_size(BLKSIZE)); Err bitreich.org 70 i+ hash_blk(comp_buf, n, md); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snaphdr.st.orig_size += chunk_size; Err bitreich.org 70 i+ snaphdr.st.comp_size += n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (lookup_blk_desc(md, &blk_desc) < 0) { Err bitreich.org 70 i+ struct cache_entry *ent; Err bitreich.org 70 i+ Err bitreich.org 70 i+ memcpy(blk_desc.md, md, sizeof(blk_desc.md)); Err bitreich.org 70 i+ blk_desc.offset = snaphdr.store_size; Err bitreich.org 70 i+ blk_desc.size = n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i+ Err bitreich.org 70 i+ append_blk(comp_buf, &blk_desc); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ent = alloc_cache_entry(); Err bitreich.org 70 i+ ent->blk_desc = blk_desc; Err bitreich.org 70 i+ add_cache_entry(ent); Err bitreich.org 70 i+ cache_dirty = 1; Err bitreich.org 70 i+ cache_misses++; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snaphdr.st.dedup_size += blk_desc.size; Err bitreich.org 70 i+ snaphdr.st.nr_blks++; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (blk_desc.size > snaphdr.st.max_blk_size) Err bitreich.org 70 i+ snaphdr.st.max_blk_size = blk_desc.size; Err bitreich.org 70 i+ if (blk_desc.size < snaphdr.st.min_blk_size) Err bitreich.org 70 i+ snaphdr.st.min_blk_size = blk_desc.size; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i+ cache_hits++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(comp_buf); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i dedup(int fd, char *msg) Err bitreich.org 70 i { Err bitreich.org 70 i struct snapshot *snap; Err bitreich.org 70 i struct chunker *chunker; Err bitreich.org 70 i- uint8_t *comp_buf; Err bitreich.org 70 i SHA256_CTX ctx; Err bitreich.org 70 i ssize_t n; Err bitreich.org 70 i Err bitreich.org 70 i snap = alloc_snap(); Err bitreich.org 70 i chunker = alloc_chunker(BLKSIZE, fd); Err bitreich.org 70 i- comp_buf = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i while ((n = fill_chunker(chunker)) > 0) { Err bitreich.org 70 i- uint8_t md[MDSIZE]; Err bitreich.org 70 i- struct blk_desc blk_desc; Err bitreich.org 70 i- size_t chunk_size, csize; Err bitreich.org 70 i uint8_t *chunkp; Err bitreich.org 70 i+ size_t chunk_size; Err bitreich.org 70 i Err bitreich.org 70 i chunkp = get_chunk(chunker, &chunk_size); Err bitreich.org 70 i SHA256_Update(&ctx, chunkp, chunk_size); Err bitreich.org 70 i- Err bitreich.org 70 i- csize = comp(chunkp, comp_buf, chunk_size, comp_size(BLKSIZE)); Err bitreich.org 70 i- hash_blk(comp_buf, csize, md); Err bitreich.org 70 i- Err bitreich.org 70 i- snaphdr.st.orig_size += chunk_size; Err bitreich.org 70 i- snaphdr.st.comp_size += csize; Err bitreich.org 70 i- Err bitreich.org 70 i snap = grow_snap(snap, snap->nr_blk_descs + 1); Err bitreich.org 70 i- if (lookup_blk_desc(md, &blk_desc) < 0) { Err bitreich.org 70 i- struct cache_entry *ent; Err bitreich.org 70 i- Err bitreich.org 70 i- memcpy(blk_desc.md, md, sizeof(blk_desc.md)); Err bitreich.org 70 i- blk_desc.offset = snaphdr.store_size; Err bitreich.org 70 i- blk_desc.size = csize; Err bitreich.org 70 i- Err bitreich.org 70 i- snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i- Err bitreich.org 70 i- append_blk(comp_buf, &blk_desc); Err bitreich.org 70 i- Err bitreich.org 70 i- ent = alloc_cache_entry(); Err bitreich.org 70 i- ent->blk_desc = blk_desc; Err bitreich.org 70 i- add_cache_entry(ent); Err bitreich.org 70 i- cache_dirty = 1; Err bitreich.org 70 i- cache_misses++; Err bitreich.org 70 i- Err bitreich.org 70 i- snaphdr.st.dedup_size += blk_desc.size; Err bitreich.org 70 i- snaphdr.st.nr_blks++; Err bitreich.org 70 i- Err bitreich.org 70 i- if (blk_desc.size > snaphdr.st.max_blk_size) Err bitreich.org 70 i- snaphdr.st.max_blk_size = blk_desc.size; Err bitreich.org 70 i- if (blk_desc.size < snaphdr.st.min_blk_size) Err bitreich.org 70 i- snaphdr.st.min_blk_size = blk_desc.size; Err bitreich.org 70 i- } else { Err bitreich.org 70 i- snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i- cache_hits++; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i+ dedup_chunk(snap, chunkp, chunk_size); Err bitreich.org 70 i drain_chunker(chunker, chunk_size); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -437,9 +464,8 @@ dedup(int fd, char *msg) Err bitreich.org 70 i append_snap(snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- free(comp_buf); Err bitreich.org 70 i free_chunker(chunker); Err bitreich.org 70 i- free(snap); Err bitreich.org 70 i+ free_snap(snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i@@ -461,8 +487,8 @@ extract(struct snapshot *snap, void *arg) Err bitreich.org 70 i blksize = decomp(buf[1], buf[0], snap->blk_desc[i].size, BLKSIZE); Err bitreich.org 70 i xwrite(args->fd, buf[0], blksize); Err bitreich.org 70 i } Err bitreich.org 70 i- free(buf[1]); Err bitreich.org 70 i- free(buf[0]); Err bitreich.org 70 i+ free_buf(buf[1]); Err bitreich.org 70 i+ free_buf(buf[0]); Err bitreich.org 70 i return WALK_STOP; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -502,7 +528,7 @@ check(struct snapshot *snap, void *arg) Err bitreich.org 70 i fprintf(stderr, " Size: %llu\n", Err bitreich.org 70 i (unsigned long long)snap->blk_desc[i].size); Err bitreich.org 70 i } Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i+ free_buf(buf); Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -566,7 +592,7 @@ walk(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i if ((*fn)(snap, arg) == WALK_STOP) Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i- free(snap); Err bitreich.org 70 i+ free_snap(snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 .