iHook in rolling hash - 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 9bee83eb425e6424e1cb6c9e5fbe6dced9d005ce /scm/dedup/commit/9bee83eb425e6424e1cb6c9e5fbe6dced9d005ce.gph bitreich.org 70 1parent c0597760335a6dfcfeb37a023f6362567079ba7f /scm/dedup/commit/c0597760335a6dfcfeb37a023f6362567079ba7f.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Sat, 16 Feb 2019 23:49:36 +0000 Err bitreich.org 70 i Err bitreich.org 70 iHook in rolling hash Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 69 ++++++++++++++++++------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 41 insertions(+), 28 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@@ -16,8 +16,8 @@ Err bitreich.org 70 i #define STOREF ".store" Err bitreich.org 70 i #define CACHEF ".cache" Err bitreich.org 70 i Err bitreich.org 70 i-#define BLKSIZ 65536 Err bitreich.org 70 i-#define WINSIZ 4095 Err bitreich.org 70 i+#define BLKSIZ (65536*4) Err bitreich.org 70 i+#define WINSIZ 127 Err bitreich.org 70 i #define MDSIZ SHA256_DIGEST_LENGTH Err bitreich.org 70 i Err bitreich.org 70 i #define ROTL(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) Err bitreich.org 70 i@@ -140,7 +140,7 @@ chunk_blk(uint8_t *buf, size_t size) Err bitreich.org 70 i */ Err bitreich.org 70 i fp = buzh_init(buf, WINSIZ); Err bitreich.org 70 i for (i = 1; i < size - WINSIZ; i++) { Err bitreich.org 70 i- fp = buzh_update(fp, buf[i - 1], buf[i + WINSIZ], WINSIZ); Err bitreich.org 70 i+ fp = buzh_update(fp, buf[i - 1], buf[i + WINSIZ - 1], WINSIZ); Err bitreich.org 70 i if ((fp & 0x00001fff) == 0) Err bitreich.org 70 i return i + WINSIZ; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -366,10 +366,9 @@ lookup_blk(uint8_t *md, struct bdescr *bdescr) Err bitreich.org 70 i void Err bitreich.org 70 i dedup(int fd) Err bitreich.org 70 i { Err bitreich.org 70 i- uint8_t md[MDSIZ]; Err bitreich.org 70 i uint8_t *buf; Err bitreich.org 70 i- SHA256_CTX ctx; Err bitreich.org 70 i struct ent *ent; 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 buf = alloc_buf(BLKSIZ); Err bitreich.org 70 i@@ -377,36 +376,50 @@ dedup(int fd) Err bitreich.org 70 i Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i while ((n = xread(fd, buf, BLKSIZ)) > 0) { Err bitreich.org 70 i- struct bdescr bdescr; Err bitreich.org 70 i+ uint8_t *bp = buf; Err bitreich.org 70 i Err bitreich.org 70 i- hash_blk(buf, n, md); Err bitreich.org 70 i+ while (n > 0) { Err bitreich.org 70 i+ uint8_t md[MDSIZ]; Err bitreich.org 70 i+ struct bdescr bdescr; Err bitreich.org 70 i+ size_t blksiz; Err bitreich.org 70 i Err bitreich.org 70 i- /* Calculate file hash one block at a time */ Err bitreich.org 70 i- SHA256_Update(&ctx, buf, n); Err bitreich.org 70 i+ if (n > WINSIZ) Err bitreich.org 70 i+ blksiz = chunk_blk(bp, n); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ blksiz = n; Err bitreich.org 70 i Err bitreich.org 70 i- ent = grow_ent(ent, ent->nblks + 1); Err bitreich.org 70 i- if (lookup_blk(md, &bdescr) < 0) { Err bitreich.org 70 i- struct bdescr bdescr; Err bitreich.org 70 i- struct cent *cent; Err bitreich.org 70 i+ hash_blk(bp, blksiz, md); Err bitreich.org 70 i Err bitreich.org 70 i- /* Block not found, create new block descriptor */ Err bitreich.org 70 i- memcpy(bdescr.md, md, sizeof(bdescr)); Err bitreich.org 70 i- bdescr.offset = store_size(); Err bitreich.org 70 i- bdescr.size = n; Err bitreich.org 70 i+ /* Calculate file hash one block at a time */ Err bitreich.org 70 i+ SHA256_Update(&ctx, bp, blksiz); Err bitreich.org 70 i Err bitreich.org 70 i- /* Update index entry */ Err bitreich.org 70 i- ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i+ ent = grow_ent(ent, ent->nblks + 1); Err bitreich.org 70 i+ if (lookup_blk(md, &bdescr) < 0) { Err bitreich.org 70 i+ struct bdescr bdescr; Err bitreich.org 70 i+ struct cent *cent; Err bitreich.org 70 i Err bitreich.org 70 i- /* Store block */ Err bitreich.org 70 i- append_blk(buf, n); Err bitreich.org 70 i+ /* Block not found, create new block descriptor */ Err bitreich.org 70 i+ memcpy(bdescr.md, md, sizeof(bdescr)); Err bitreich.org 70 i+ bdescr.offset = store_size(); Err bitreich.org 70 i+ bdescr.size = blksiz; Err bitreich.org 70 i Err bitreich.org 70 i- /* Create a cache entry for this block */ Err bitreich.org 70 i- cent = alloc_cent(); Err bitreich.org 70 i- cent->bdescr = bdescr; Err bitreich.org 70 i- add_cent(cent); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- /* Found block with the same hash, update index entry */ Err bitreich.org 70 i- ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i+ /* Update index entry */ Err bitreich.org 70 i+ ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Store block */ Err bitreich.org 70 i+ append_blk(bp, blksiz); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Create a cache entry for this block */ Err bitreich.org 70 i+ cent = alloc_cent(); Err bitreich.org 70 i+ cent->bdescr = bdescr; Err bitreich.org 70 i+ add_cent(cent); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ /* Found block with the same hash, update index entry */ Err bitreich.org 70 i+ ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ bp += blksiz; Err bitreich.org 70 i+ n -= blksiz; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 .