iImplement block gc operation - 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 d27c04494de59d32935865ca40915476d35b2c30 /scm/dedup/commit/d27c04494de59d32935865ca40915476d35b2c30.gph bitreich.org 70 1parent 8f5a4daf24872ef4bab13dc180ed4e693b4c5c8a /scm/dedup/commit/8f5a4daf24872ef4bab13dc180ed4e693b4c5c8a.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 26 Apr 2019 11:07:20 +0100 Err bitreich.org 70 i Err bitreich.org 70 iImplement block gc operation Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M TODO | 2 +- Err bitreich.org 70 i M bcompress.c | 10 ++++++++++ Err bitreich.org 70 i M block.c | 12 ++++++++++++ Err bitreich.org 70 i M block.h | 2 ++ Err bitreich.org 70 i M bstorage.c | 25 +++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 50 insertions(+), 1 deletion(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/dedup/file/TODO.gph bitreich.org 70 i@@ -2,4 +2,4 @@ Use a ring buffer in the chunker (avoid memmove() call) Err bitreich.org 70 i Create a library archive out of the blake2b files and link with it Err bitreich.org 70 i pledge/unveil support Err bitreich.org 70 i Use flock() to avoid corruption Err bitreich.org 70 i-Impelment dup-gc(1) Err bitreich.org 70 i+Implement dup-gc(1) Err bitreich.org 70 1diff --git a/bcompress.c b/bcompress.c /scm/dedup/file/bcompress.c.gph bitreich.org 70 i@@ -26,6 +26,7 @@ static int bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bpa Err bitreich.org 70 i static int bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i static int bcrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+static int bcgc(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bccheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bcsync(struct bctx *bctx); Err bitreich.org 70 i static int bcclose(struct bctx *bctx); Err bitreich.org 70 i@@ -36,6 +37,7 @@ static struct bops bops = { Err bitreich.org 70 i .put = bcput, Err bitreich.org 70 i .get = bcget, Err bitreich.org 70 i .rm = bcrm, Err bitreich.org 70 i+ .gc = bcgc, Err bitreich.org 70 i .check = bccheck, Err bitreich.org 70 i .sync = bcsync, Err bitreich.org 70 i .close = bcclose, Err bitreich.org 70 i@@ -248,6 +250,14 @@ bcrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i+bcgc(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops = bstorageops(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return bops->gc(bctx, md); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i bccheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i { Err bitreich.org 70 i struct bops *bops = bstorageops(); Err bitreich.org 70 1diff --git a/block.c b/block.c /scm/dedup/file/block.c.gph bitreich.org 70 i@@ -90,6 +90,18 @@ brm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i+bgc(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (bctx == NULL || md == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bops = bcompressops(); Err bitreich.org 70 i+ return bops->gc(bctx, md); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i bcheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i { Err bitreich.org 70 i struct bops *bops; Err bitreich.org 70 1diff --git a/block.h b/block.h /scm/dedup/file/block.h.gph bitreich.org 70 i@@ -18,6 +18,7 @@ struct bops { Err bitreich.org 70 i int (*put)(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i int (*get)(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i int (*rm)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+ int (*gc)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i int (*check)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i int (*sync)(struct bctx *bctx); Err bitreich.org 70 i int (*close)(struct bctx *bctx); Err bitreich.org 70 i@@ -29,6 +30,7 @@ extern int bopen(char *path, int flags, int mode, struct bparam *bpar, struct bc Err bitreich.org 70 i extern int bput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i extern int bget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i extern int brm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+extern int bgc(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i extern int bcheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i extern int bsync(struct bctx *bctx); Err bitreich.org 70 i extern int bclose(struct bctx *bctx); Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -56,6 +56,7 @@ static int bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bpa Err bitreich.org 70 i static int bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bsget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i static int bsrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i+static int bsgc(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bscheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bssync(struct bctx *bctx); Err bitreich.org 70 i static int bsclose(struct bctx *bctx); Err bitreich.org 70 i@@ -66,6 +67,7 @@ static struct bops bops = { Err bitreich.org 70 i .put = bsput, Err bitreich.org 70 i .get = bsget, Err bitreich.org 70 i .rm = bsrm, Err bitreich.org 70 i+ .gc = bsgc, Err bitreich.org 70 i .check = bscheck, Err bitreich.org 70 i .sync = bssync, Err bitreich.org 70 i .close = bsclose, Err bitreich.org 70 i@@ -570,6 +572,29 @@ bsrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static int Err bitreich.org 70 i+bsgc(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct sctx *sctx; Err bitreich.org 70 i+ struct bd key, *bd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ sctx = bctx->sctx; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Lookup block in the cache */ Err bitreich.org 70 i+ memcpy(key.md, md, MDSIZE); Err bitreich.org 70 i+ bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i+ if (bd == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Live block descriptor, nothing to do here */ Err bitreich.org 70 i+ if (bd->refcnt > 0) Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Re-punch the hole */ Err bitreich.org 70 i+ punchhole(sctx->fd, bd->offset, bd->size); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i /* Err bitreich.org 70 i * Lookup the block and rehash it. Check that the Err bitreich.org 70 i * resulting hash matches the given hash. Err bitreich.org 70 .