iStore params in chunker struct - 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 a41b0b187818a9659dda1fee972b8a9946889020 /scm/dedup/commit/a41b0b187818a9659dda1fee972b8a9946889020.gph bitreich.org 70 1parent 3d32364aa8deb41341b21c25b726239c6e9c295c /scm/dedup/commit/3d32364aa8deb41341b21c25b726239c6e9c295c.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 8 Mar 2019 11:35:36 +0000 Err bitreich.org 70 i Err bitreich.org 70 iStore params in chunker struct Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M chunker.c | 54 +++++++++++++++++++------------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 33 insertions(+), 21 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/chunker.c b/chunker.c /scm/dedup/file/chunker.c.gph bitreich.org 70 i@@ -15,6 +15,10 @@ struct chunker { Err bitreich.org 70 i size_t cap; Err bitreich.org 70 i size_t rpos; Err bitreich.org 70 i size_t wpos; Err bitreich.org 70 i+ size_t min_size; Err bitreich.org 70 i+ size_t max_size; Err bitreich.org 70 i+ size_t mask; Err bitreich.org 70 i+ size_t win_size; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -65,40 +69,41 @@ static uint32_t buz[] = { Err bitreich.org 70 i static inline uint32_t Err bitreich.org 70 i buzh_init(uint8_t *buf, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- uint32_t fp; Err bitreich.org 70 i+ uint32_t sum; Err bitreich.org 70 i size_t i; Err bitreich.org 70 i Err bitreich.org 70 i- for (i = 1, fp = 0; i < size; i++, buf++) Err bitreich.org 70 i- fp ^= ROTL(buz[*buf], (size - i) % 32); Err bitreich.org 70 i+ for (i = 1, sum = 0; i < size; i++, buf++) Err bitreich.org 70 i+ sum ^= ROTL(buz[*buf], (size - i) % 32); Err bitreich.org 70 i Err bitreich.org 70 i- return fp ^ buz[*buf]; Err bitreich.org 70 i+ return sum ^ buz[*buf]; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static inline uint32_t Err bitreich.org 70 i-buzh_update(uint32_t fp, uint8_t out, uint8_t in, size_t size) Err bitreich.org 70 i+buzh_update(uint32_t sum, uint8_t out, uint8_t in, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- return ROTL(fp, 1) ^ ROTL(buz[out], size % 32) ^ buz[in]; Err bitreich.org 70 i+ return ROTL(sum, 1) ^ ROTL(buz[out], size % 32) ^ buz[in]; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static inline int Err bitreich.org 70 i-match_pattern(size_t chunk_size, uint32_t fp) Err bitreich.org 70 i+match_pattern(struct chunker *chunker, size_t chunk_size, uint32_t sum) Err bitreich.org 70 i { Err bitreich.org 70 i- if (chunk_size >= BLKSIZE_MAX) Err bitreich.org 70 i+ if (chunk_size >= chunker->max_size) Err bitreich.org 70 i return 1; Err bitreich.org 70 i- if (chunk_size < BLKSIZE_MIN) Err bitreich.org 70 i+ if (chunk_size < chunker->min_size) Err bitreich.org 70 i return 0; Err bitreich.org 70 i- return (fp & HASHMASK_BITS) == 0; Err bitreich.org 70 i+ return (sum & chunker->mask) == 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static size_t Err bitreich.org 70 i get_chunk_size(struct chunker *chunker) Err bitreich.org 70 i { Err bitreich.org 70 i+ size_t chunk_size, win_size, i; Err bitreich.org 70 i+ uint32_t sum; Err bitreich.org 70 i uint8_t *bp; Err bitreich.org 70 i- uint32_t fp; Err bitreich.org 70 i- size_t i, chunk_size; Err bitreich.org 70 i Err bitreich.org 70 i chunk_size = chunker->wpos - chunker->rpos; Err bitreich.org 70 i- if (chunk_size < WINSIZE) Err bitreich.org 70 i+ win_size = chunker->win_size; Err bitreich.org 70 i+ if (chunk_size < win_size) Err bitreich.org 70 i return chunk_size; Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -110,14 +115,17 @@ get_chunk_size(struct chunker *chunker) Err bitreich.org 70 i * at the end of that window. Err bitreich.org 70 i */ Err bitreich.org 70 i bp = &chunker->buf[chunker->rpos]; Err bitreich.org 70 i- fp = buzh_init(bp, WINSIZE); Err bitreich.org 70 i- for (i = 0; i < chunk_size - WINSIZE; i++) { Err bitreich.org 70 i- if (i > 0) Err bitreich.org 70 i- fp = buzh_update(fp, bp[i - 1], bp[i + WINSIZE - 1], Err bitreich.org 70 i- WINSIZE); Err bitreich.org 70 i- if (match_pattern(i + WINSIZE, fp)) Err bitreich.org 70 i- return i + WINSIZE; Err bitreich.org 70 i- Err bitreich.org 70 i+ sum = buzh_init(bp, win_size); Err bitreich.org 70 i+ for (i = 0; i < chunk_size - win_size; i++) { Err bitreich.org 70 i+ if (i > 0) { Err bitreich.org 70 i+ uint8_t out = bp[i - 1]; Err bitreich.org 70 i+ uint8_t in = bp[i + win_size - 1]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ sum = buzh_update(sum, out, in, win_size); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (match_pattern(chunker, i + win_size, sum)) Err bitreich.org 70 i+ return i + win_size; Err bitreich.org 70 i } Err bitreich.org 70 i return chunk_size; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -136,6 +144,10 @@ alloc_chunker(int fd, size_t cap) Err bitreich.org 70 i err(1, "calloc"); Err bitreich.org 70 i chunker->fd = fd; Err bitreich.org 70 i chunker->cap = cap; Err bitreich.org 70 i+ chunker->min_size = BLKSIZE_MIN; Err bitreich.org 70 i+ chunker->max_size = BLKSIZE_MAX; Err bitreich.org 70 i+ chunker->mask = HASHMASK_BITS; Err bitreich.org 70 i+ chunker->win_size = WINSIZE; Err bitreich.org 70 i Err bitreich.org 70 i return chunker; Err bitreich.org 70 i } Err bitreich.org 70 .