iWrap cache global state into a cache context structure - 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 8f41ac4be4b5c594892b1be8847706db16405c25 /scm/dedup/commit/8f41ac4be4b5c594892b1be8847706db16405c25.gph bitreich.org 70 1parent d3ec97d4abc70c1e5c87f5ff5f7b4800fdf89bcb /scm/dedup/commit/d3ec97d4abc70c1e5c87f5ff5f7b4800fdf89bcb.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Mon, 25 Feb 2019 14:00:40 +0000 Err bitreich.org 70 i Err bitreich.org 70 iWrap cache global state into a cache context structure Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M cache.c | 40 ++++++++++++++++++++++---------- Err bitreich.org 70 i M dedup.c | 14 ++++++++------ Err bitreich.org 70 i M dedup.h | 10 ++++++---- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 42 insertions(+), 22 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/cache.c b/cache.c /scm/dedup/file/cache.c.gph bitreich.org 70 i@@ -14,8 +14,11 @@ struct cache_node { Err bitreich.org 70 i struct cache_entry ent; Err bitreich.org 70 i RB_ENTRY(cache_node) e; Err bitreich.org 70 i }; Err bitreich.org 70 i+RB_HEAD(cache_head, cache_node); Err bitreich.org 70 i Err bitreich.org 70 i-static RB_HEAD(cache, cache_node) cache_head; Err bitreich.org 70 i+struct cache { Err bitreich.org 70 i+ struct cache_head entries; Err bitreich.org 70 i+}; Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i cache_node_cmp(struct cache_node *e1, struct cache_node *e2) Err bitreich.org 70 i@@ -29,8 +32,8 @@ cache_node_cmp(struct cache_node *e1, struct cache_node *e2) 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(cache, cache_node, e, cache_node_cmp); Err bitreich.org 70 i-static RB_GENERATE(cache, cache_node, e, cache_node_cmp); Err bitreich.org 70 i+static RB_PROTOTYPE(cache_head, cache_node, e, cache_node_cmp); Err bitreich.org 70 i+static RB_GENERATE(cache_head, cache_node, e, cache_node_cmp); Err bitreich.org 70 i Err bitreich.org 70 i static struct cache_node * Err bitreich.org 70 i alloc_cache_node(struct cache_entry *ent) Err bitreich.org 70 i@@ -51,21 +54,21 @@ free_cache_node(struct cache_node *node) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-add_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i+add_cache_entry(struct cache *cache, struct cache_entry *ent) Err bitreich.org 70 i { Err bitreich.org 70 i struct cache_node *node; Err bitreich.org 70 i Err bitreich.org 70 i node = alloc_cache_node(ent); Err bitreich.org 70 i- RB_INSERT(cache, &cache_head, node); Err bitreich.org 70 i+ RB_INSERT(cache_head, &cache->entries, node); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-lookup_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i+lookup_cache_entry(struct cache *cache, struct cache_entry *ent) Err bitreich.org 70 i { Err bitreich.org 70 i struct cache_node *node, key; Err bitreich.org 70 i Err bitreich.org 70 i key.ent = *ent; Err bitreich.org 70 i- node = RB_FIND(cache, &cache_head, &key); Err bitreich.org 70 i+ node = RB_FIND(cache_head, &cache->entries, &key); Err bitreich.org 70 i if (node != NULL) { Err bitreich.org 70 i *ent = node->ent; Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -74,21 +77,34 @@ lookup_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-walk_cache(int (*fn)(struct cache_entry *)) Err bitreich.org 70 i+walk_cache(struct cache *cache, int (*fn)(struct cache_entry *)) Err bitreich.org 70 i { Err bitreich.org 70 i struct cache_node *node; Err bitreich.org 70 i Err bitreich.org 70 i- RB_FOREACH(node, cache, &cache_head) Err bitreich.org 70 i+ RB_FOREACH(node, cache_head, &cache->entries) Err bitreich.org 70 i (*fn)(&node->ent); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+struct cache * Err bitreich.org 70 i+alloc_cache(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cache *cache; Err bitreich.org 70 i+ Err bitreich.org 70 i+ cache = calloc(1, sizeof(*cache)); Err bitreich.org 70 i+ if (cache == NULL) Err bitreich.org 70 i+ err(1, "malloc"); Err bitreich.org 70 i+ RB_INIT(&cache->entries); Err bitreich.org 70 i+ return cache; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i void Err bitreich.org 70 i-free_cache(void) Err bitreich.org 70 i+free_cache(struct cache *cache) Err bitreich.org 70 i { Err bitreich.org 70 i struct cache_node *node, *tmp; Err bitreich.org 70 i Err bitreich.org 70 i- RB_FOREACH_SAFE(node, cache, &cache_head, tmp) { Err bitreich.org 70 i- RB_REMOVE(cache, &cache_head, node); Err bitreich.org 70 i+ RB_FOREACH_SAFE(node, cache_head, &cache->entries, tmp) { Err bitreich.org 70 i+ RB_REMOVE(cache_head, &cache->entries, node); Err bitreich.org 70 i free_cache_node(node); Err bitreich.org 70 i } Err bitreich.org 70 i+ free(cache); 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@@ -32,6 +32,7 @@ struct extract_args { Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i static struct snapshot_hdr snaphdr; Err bitreich.org 70 i+static struct cache *cache; Err bitreich.org 70 i static int ifd; Err bitreich.org 70 i static int sfd; Err bitreich.org 70 i static int cfd; Err bitreich.org 70 i@@ -205,7 +206,7 @@ dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size) Err bitreich.org 70 i snaphdr.st.comp_size += n; Err bitreich.org 70 i Err bitreich.org 70 i memcpy(cache_entry.md, md, sizeof(cache_entry.md)); Err bitreich.org 70 i- if (lookup_cache_entry(&cache_entry) < 0) { Err bitreich.org 70 i+ if (lookup_cache_entry(cache, &cache_entry) < 0) { Err bitreich.org 70 i struct blk_desc blk_desc; Err bitreich.org 70 i Err bitreich.org 70 i memcpy(&blk_desc.md, md, sizeof(blk_desc.md)); Err bitreich.org 70 i@@ -218,7 +219,7 @@ dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size) Err bitreich.org 70 i cache_entry.offset = blk_desc.offset; Err bitreich.org 70 i cache_entry.size = blk_desc.size; Err bitreich.org 70 i cache_dirty = 1; Err bitreich.org 70 i- add_cache_entry(&cache_entry); Err bitreich.org 70 i+ add_cache_entry(cache, &cache_entry); Err bitreich.org 70 i cache_misses++; Err bitreich.org 70 i Err bitreich.org 70 i snaphdr.st.dedup_size += blk_desc.size; Err bitreich.org 70 i@@ -387,7 +388,7 @@ rebuild_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i cache_entry.offset = blk_desc->offset; Err bitreich.org 70 i cache_entry.size = blk_desc->size; Err bitreich.org 70 i cache_dirty = 1; Err bitreich.org 70 i- add_cache_entry(&cache_entry); Err bitreich.org 70 i+ add_cache_entry(cache, &cache_entry); Err bitreich.org 70 i } Err bitreich.org 70 i free(buf); Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i@@ -450,7 +451,7 @@ load_cache(void) Err bitreich.org 70 i Err bitreich.org 70 i if (xread(cfd, &cache_entry, sizeof(cache_entry)) == 0) Err bitreich.org 70 i errx(1, "read: unexpected EOF"); Err bitreich.org 70 i- add_cache_entry(&cache_entry); Err bitreich.org 70 i+ add_cache_entry(cache, &cache_entry); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -494,6 +495,7 @@ init(void) Err bitreich.org 70 i xwrite(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ cache = alloc_cache(); Err bitreich.org 70 i if (cache_nr_entries() != 0) Err bitreich.org 70 i load_cache(); Err bitreich.org 70 i else Err bitreich.org 70 i@@ -508,9 +510,9 @@ term(void) Err bitreich.org 70 i Err bitreich.org 70 i if (cache_dirty) { Err bitreich.org 70 i xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- walk_cache(flush_cache); Err bitreich.org 70 i+ walk_cache(cache, flush_cache); Err bitreich.org 70 i } Err bitreich.org 70 i- free_cache(); Err bitreich.org 70 i+ free_cache(cache); Err bitreich.org 70 i Err bitreich.org 70 i fsync(ifd); Err bitreich.org 70 i fsync(sfd); Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -1,13 +1,15 @@ Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i #include "types.h" Err bitreich.org 70 i Err bitreich.org 70 i+struct cache; Err bitreich.org 70 i struct chunker; Err bitreich.org 70 i Err bitreich.org 70 i /* cache.c */ Err bitreich.org 70 i-void add_cache_entry(struct cache_entry *ent); Err bitreich.org 70 i-int lookup_cache_entry(struct cache_entry *ent); Err bitreich.org 70 i-void walk_cache(int (*fn)(struct cache_entry *)); Err bitreich.org 70 i-void free_cache(void); Err bitreich.org 70 i+void add_cache_entry(struct cache *cache, struct cache_entry *ent); Err bitreich.org 70 i+int lookup_cache_entry(struct cache *cache, struct cache_entry *ent); Err bitreich.org 70 i+void walk_cache(struct cache *cache, int (*fn)(struct cache_entry *)); Err bitreich.org 70 i+struct cache *alloc_cache(void); Err bitreich.org 70 i+void free_cache(struct cache *cache); Err bitreich.org 70 i Err bitreich.org 70 i /* chunker.c */ Err bitreich.org 70 i struct chunker *alloc_chunker(size_t cap, int fd); Err bitreich.org 70 .