iRework chunker interface - 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 8ed79b4311c4715717198c0e04dd06efb29be265 /scm/dedup/commit/8ed79b4311c4715717198c0e04dd06efb29be265.gph bitreich.org 70 1parent 499f62b1b9e3e6db6f9f77defdb0c2bb15c25778 /scm/dedup/commit/499f62b1b9e3e6db6f9f77defdb0c2bb15c25778.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 21 Feb 2019 13:48:22 +0000 Err bitreich.org 70 i Err bitreich.org 70 iRework chunker interface Err bitreich.org 70 i Err bitreich.org 70 iEventually, this will be implemented using a ring buffer. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M chunker.c | 56 +++++++++++++++++-------------- Err bitreich.org 70 i M dedup.c | 2 +- Err bitreich.org 70 i M dedup.h | 6 +++--- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 35 insertions(+), 29 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@@ -1,3 +1,4 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -9,8 +10,9 @@ Err bitreich.org 70 i Err bitreich.org 70 i struct chunker { Err bitreich.org 70 i uint8_t *buf; Err bitreich.org 70 i- size_t size; Err bitreich.org 70 i- size_t pos; 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 int fd; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i@@ -22,8 +24,8 @@ get_chunk_size(struct chunker *chunker) Err bitreich.org 70 i uint32_t fp; Err bitreich.org 70 i Err bitreich.org 70 i /* buzhash should be at least WINSIZE */ Err bitreich.org 70 i- if (chunker->pos < WINSIZE) Err bitreich.org 70 i- return chunker->pos; Err bitreich.org 70 i+ if (chunker->wpos - chunker->rpos < WINSIZE) Err bitreich.org 70 i+ return chunker->wpos - chunker->rpos; Err bitreich.org 70 i Err bitreich.org 70 i bp = chunker->buf; Err bitreich.org 70 i Err bitreich.org 70 i@@ -37,18 +39,18 @@ get_chunk_size(struct chunker *chunker) Err bitreich.org 70 i * WINSIZE the smallest possible block size. Err bitreich.org 70 i */ Err bitreich.org 70 i fp = buzh_init(bp, WINSIZE); Err bitreich.org 70 i- for (i = 0; i < chunker->pos - WINSIZE; i++) { Err bitreich.org 70 i+ for (i = chunker->rpos; i < chunker->wpos - WINSIZE; i++) { Err bitreich.org 70 i if (i > 0) Err bitreich.org 70 i fp = buzh_update(fp, bp[i - 1], bp[WINSIZE + i - 1], Err bitreich.org 70 i WINSIZE); Err bitreich.org 70 i if ((fp & HASHMSK) == 0) Err bitreich.org 70 i return i + WINSIZE; Err bitreich.org 70 i } Err bitreich.org 70 i- return chunker->pos; Err bitreich.org 70 i+ return chunker->wpos - chunker->rpos; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i struct chunker * Err bitreich.org 70 i-alloc_chunker(size_t size, int fd) Err bitreich.org 70 i+alloc_chunker(size_t cap, int fd) Err bitreich.org 70 i { Err bitreich.org 70 i struct chunker *chunker; Err bitreich.org 70 i Err bitreich.org 70 i@@ -56,11 +58,12 @@ alloc_chunker(size_t size, int fd) Err bitreich.org 70 i if (chunker == NULL) Err bitreich.org 70 i err(1, "malloc"); Err bitreich.org 70 i Err bitreich.org 70 i- chunker->buf = malloc(size); Err bitreich.org 70 i+ chunker->buf = malloc(cap); Err bitreich.org 70 i if (chunker->buf == NULL) Err bitreich.org 70 i err(1, "malloc"); Err bitreich.org 70 i- chunker->size = size; Err bitreich.org 70 i- chunker->pos = 0; Err bitreich.org 70 i+ chunker->cap = cap; Err bitreich.org 70 i+ chunker->rpos = 0; Err bitreich.org 70 i+ chunker->wpos = 0; Err bitreich.org 70 i chunker->fd = fd; Err bitreich.org 70 i Err bitreich.org 70 i return chunker; Err bitreich.org 70 i@@ -79,28 +82,31 @@ fill_chunker(struct chunker *chunker) Err bitreich.org 70 i uint8_t *bp; Err bitreich.org 70 i ssize_t n; Err bitreich.org 70 i Err bitreich.org 70 i- bp = &chunker->buf[chunker->pos]; Err bitreich.org 70 i- n = read(chunker->fd, bp, chunker->size - chunker->pos); Err bitreich.org 70 i+ bp = &chunker->buf[chunker->wpos]; Err bitreich.org 70 i+ n = read(chunker->fd, bp, chunker->cap - chunker->wpos); Err bitreich.org 70 i if (n < 0) Err bitreich.org 70 i err(1, "read"); Err bitreich.org 70 i- chunker->pos += n; Err bitreich.org 70 i- return chunker->pos; Err bitreich.org 70 i+ chunker->wpos += n; Err bitreich.org 70 i+ return chunker->wpos; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+uint8_t * Err bitreich.org 70 i+get_chunk(struct chunker *chunker, size_t *chunk_size) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ assert(chunker->rpos <= chunker->wpos); Err bitreich.org 70 i+ *chunk_size = get_chunk_size(chunker); Err bitreich.org 70 i+ chunker->rpos += *chunk_size; Err bitreich.org 70 i+ return chunker->buf; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-drain_chunker(struct chunker *chunker, size_t chunk_size) Err bitreich.org 70 i+drain_chunker(struct chunker *chunker) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t *src, *dst; Err bitreich.org 70 i Err bitreich.org 70 i- src = &chunker->buf[chunk_size]; Err bitreich.org 70 i+ src = &chunker->buf[chunker->rpos]; Err bitreich.org 70 i dst = chunker->buf; Err bitreich.org 70 i- memmove(dst, src, chunker->pos - chunk_size); Err bitreich.org 70 i- chunker->pos -= chunk_size; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-uint8_t * Err bitreich.org 70 i-get_chunk(struct chunker *chunker, size_t *size) Err bitreich.org 70 i-{ Err bitreich.org 70 i- *size = get_chunk_size(chunker); Err bitreich.org 70 i- return chunker->buf; Err bitreich.org 70 i+ memmove(dst, src, chunker->wpos - chunker->rpos); Err bitreich.org 70 i+ chunker->wpos -= chunker->rpos; Err bitreich.org 70 i+ chunker->rpos = 0; 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@@ -445,7 +445,7 @@ dedup(int fd, char *msg) Err bitreich.org 70 i SHA256_Update(&ctx, chunkp, chunk_size); Err bitreich.org 70 i snap = grow_snap(snap, snap->nr_blk_descs + 1); 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+ drain_chunker(chunker); Err bitreich.org 70 i } Err bitreich.org 70 i SHA256_Final(snap->md, &ctx); Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -3,11 +3,11 @@ Err bitreich.org 70 i struct chunker; Err bitreich.org 70 i Err bitreich.org 70 i /* chunker.c */ Err bitreich.org 70 i-struct chunker *alloc_chunker(size_t size, int fd); Err bitreich.org 70 i+struct chunker *alloc_chunker(size_t cap, int fd); Err bitreich.org 70 i void free_chunker(struct chunker *chunker); Err bitreich.org 70 i ssize_t fill_chunker(struct chunker *chunker); Err bitreich.org 70 i-void drain_chunker(struct chunker *chunker, size_t n); Err bitreich.org 70 i-uint8_t *get_chunk(struct chunker *chunker, size_t *size); Err bitreich.org 70 i+uint8_t *get_chunk(struct chunker *chunker, size_t *chunk_size); Err bitreich.org 70 i+void drain_chunker(struct chunker *chunker); Err bitreich.org 70 i Err bitreich.org 70 i /* hash.c */ Err bitreich.org 70 i uint32_t buzh_init(uint8_t *buf, size_t size); Err bitreich.org 70 .