iMore gc work - 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 6699070ee14aa0fc3a48c52e0a146f6946e39ce5 /scm/dedup/commit/6699070ee14aa0fc3a48c52e0a146f6946e39ce5.gph bitreich.org 70 1parent d27c04494de59d32935865ca40915476d35b2c30 /scm/dedup/commit/d27c04494de59d32935865ca40915476d35b2c30.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 26 Apr 2019 11:16:21 +0100 Err bitreich.org 70 i Err bitreich.org 70 iMore gc work Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M bstorage.c | 51 +++++++++++++++++++------------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 31 insertions(+), 20 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -23,6 +23,7 @@ Err bitreich.org 70 i #include "blake2.h" Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i+#include "queue.h" Err bitreich.org 70 i #include "tree.h" Err bitreich.org 70 i Err bitreich.org 70 i #define VMIN 0 Err bitreich.org 70 i@@ -87,13 +88,15 @@ struct bd { Err bitreich.org 70 i uint64_t size; Err bitreich.org 70 i uint64_t refcnt; Err bitreich.org 70 i unsigned char md[MDSIZE]; Err bitreich.org 70 i- RB_ENTRY(bd) entry; Err bitreich.org 70 i+ RB_ENTRY(bd) rbe; Err bitreich.org 70 i+ SLIST_ENTRY(bd) sle; Err bitreich.org 70 i }; Err bitreich.org 70 i RB_HEAD(bdcache, bd); Err bitreich.org 70 i- Err bitreich.org 70 i+ Err bitreich.org 70 i /* Storage layer context */ Err bitreich.org 70 i struct sctx { Err bitreich.org 70 i struct bdcache bdcache; Err bitreich.org 70 i+ SLIST_HEAD(gchead, bd) gchead; Err bitreich.org 70 i struct bhdr bhdr; Err bitreich.org 70 i int fd; Err bitreich.org 70 i int rdonly; /* when set to 1, the bssync() operation is a no-op */ Err bitreich.org 70 i@@ -111,8 +114,8 @@ bd_cmp(struct bd *b1, struct bd *b2) Err bitreich.org 70 i return -1; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i-static RB_PROTOTYPE(bdcache, bd, entry, bd_cmp) Err bitreich.org 70 i-static RB_GENERATE(bdcache, bd, entry, bd_cmp) Err bitreich.org 70 i+static RB_PROTOTYPE(bdcache, bd, rbe, bd_cmp) Err bitreich.org 70 i+static RB_GENERATE(bdcache, bd, rbe, bd_cmp) Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i bhash(void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i@@ -277,7 +280,7 @@ loadbd(struct sctx *sctx) Err bitreich.org 70 i if (bd->refcnt > 0) Err bitreich.org 70 i RB_INSERT(bdcache, &sctx->bdcache, bd); Err bitreich.org 70 i else Err bitreich.org 70 i- free(bd); Err bitreich.org 70 i+ SLIST_INSERT_HEAD(&sctx->gchead, bd, sle); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -295,11 +298,18 @@ initbdcache(struct sctx *sctx) Err bitreich.org 70 i if (loadbd(sctx) == 0) Err bitreich.org 70 i continue; Err bitreich.org 70 i Err bitreich.org 70 i- /* Cleanup */ Err bitreich.org 70 i+ /* Free block descriptor cache */ Err bitreich.org 70 i RB_FOREACH_SAFE(bd, bdcache, &sctx->bdcache, tmp) { Err bitreich.org 70 i RB_REMOVE(bdcache, &sctx->bdcache, bd); Err bitreich.org 70 i free(bd); Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Free garbage collector list */ Err bitreich.org 70 i+ while (!SLIST_EMPTY(&sctx->gchead)) { Err bitreich.org 70 i+ bd = SLIST_FIRST(&sctx->gchead); Err bitreich.org 70 i+ SLIST_REMOVE(&sctx->gchead, bd, bd, sle); Err bitreich.org 70 i+ free(bd); Err bitreich.org 70 i+ } Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -325,6 +335,7 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i Err bitreich.org 70 i sctx = bctx->sctx; Err bitreich.org 70 i RB_INIT(&sctx->bdcache); Err bitreich.org 70 i+ SLIST_INIT(&sctx->gchead); Err bitreich.org 70 i bhdr = &sctx->bhdr; Err bitreich.org 70 i memcpy(bhdr->magic, BHDRMAGIC, NBHDRMAGIC); Err bitreich.org 70 i bhdr->flags = (VMAJ << VMAJSHIFT) | VMIN; Err bitreich.org 70 i@@ -380,6 +391,7 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i Err bitreich.org 70 i sctx = bctx->sctx; Err bitreich.org 70 i RB_INIT(&sctx->bdcache); Err bitreich.org 70 i+ SLIST_INIT(&sctx->gchead); Err bitreich.org 70 i bhdr = &sctx->bhdr; Err bitreich.org 70 i if (unpackbhdr(fd, bhdr) < 0) { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i@@ -567,7 +579,7 @@ bsrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i RB_REMOVE(bdcache, &sctx->bdcache, bd); Err bitreich.org 70 i- free(bd); Err bitreich.org 70 i+ SLIST_INSERT_HEAD(&sctx->gchead, bd, sle); Err bitreich.org 70 i } Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -579,19 +591,10 @@ bsgc(struct bctx *bctx, unsigned char *md) 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+ SLIST_FOREACH(bd, &sctx->gchead, sle) { Err bitreich.org 70 i+ assert(bd->refcnt == 0); Err bitreich.org 70 i+ punchhole(sctx->fd, bd->offset, bd->size); Err bitreich.org 70 i+ } Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -674,11 +677,19 @@ bsclose(struct bctx *bctx) Err bitreich.org 70 i return -1; Err bitreich.org 70 i Err bitreich.org 70 i sctx = bctx->sctx; Err bitreich.org 70 i+ /* Free block descriptor cache */ Err bitreich.org 70 i RB_FOREACH_SAFE(bd, bdcache, &sctx->bdcache, tmp) { Err bitreich.org 70 i RB_REMOVE(bdcache, &sctx->bdcache, bd); Err bitreich.org 70 i free(bd); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ /* Free garbage collector list */ Err bitreich.org 70 i+ while (!SLIST_EMPTY(&sctx->gchead)) { Err bitreich.org 70 i+ bd = SLIST_FIRST(&sctx->gchead); Err bitreich.org 70 i+ SLIST_REMOVE(&sctx->gchead, bd, bd, sle); Err bitreich.org 70 i+ free(bd); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i r = close(sctx->fd); Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i return r; Err bitreich.org 70 .