iAdd lz4 support - 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 9f54a917ef6c2f8f850684bed77fa708a062ca33 /scm/dedup/commit/9f54a917ef6c2f8f850684bed77fa708a062ca33.gph bitreich.org 70 1parent 1ed8f937d82f094ae3e4db7511256dee7d5d471a /scm/dedup/commit/1ed8f937d82f094ae3e4db7511256dee7d5d471a.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Sun, 5 May 2019 11:58:12 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAdd lz4 support Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 2 +- Err bitreich.org 70 i M README | 1 + Err bitreich.org 70 i M TODO | 1 - Err bitreich.org 70 i M bcompress.c | 33 ++++++++++++++++++++++++++++++- Err bitreich.org 70 i M bstorage.c | 6 ++++++ Err bitreich.org 70 i M dup-init.1 | 4 ++-- Err bitreich.org 70 i A test007 | 18 ++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i7 files changed, 60 insertions(+), 5 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/dedup/file/Makefile.gph bitreich.org 70 i@@ -34,7 +34,7 @@ DPACKOBJ = $(COMMOBJ) dup-pack.o Err bitreich.org 70 i DRMOBJ = $(COMMOBJ) dup-rm.o Err bitreich.org 70 i DUNPACKOBJ = $(COMMOBJ) dup-unpack.o Err bitreich.org 70 i Err bitreich.org 70 i-LDLIBS = -lsnappy -lsodium Err bitreich.org 70 i+LDLIBS = -lsnappy -llz4 -lsodium Err bitreich.org 70 i Err bitreich.org 70 i all: $(BIN) Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/README b/README /scm/dedup/file/README.gph bitreich.org 70 i@@ -58,6 +58,7 @@ Dependencies Err bitreich.org 70 i ============ Err bitreich.org 70 i Err bitreich.org 70 i - snappy Err bitreich.org 70 i+ - liblz4 Err bitreich.org 70 i - libsodium Err bitreich.org 70 i Err bitreich.org 70 i Contact Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/dedup/file/TODO.gph bitreich.org 70 i@@ -1,6 +1,5 @@ Err bitreich.org 70 i Use a ring buffer in the chunker (avoid memmove() call) Err bitreich.org 70 i pledge/unveil support Err bitreich.org 70 i Use flock() to avoid corruption Err bitreich.org 70 i-Revert lz4 support Err bitreich.org 70 i Ability to fetch key from dedicated fd so it never touches disk Err bitreich.org 70 i Use pread/pwrite to avoid lseek() calls Err bitreich.org 70 1diff --git a/bcompress.c b/bcompress.c /scm/dedup/file/bcompress.c.gph bitreich.org 70 i@@ -12,12 +12,14 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i #include "block.h" Err bitreich.org 70 i Err bitreich.org 70 i #define CDNONETYPE 0x200 Err bitreich.org 70 i #define CDSNAPPYTYPE 0x201 Err bitreich.org 70 i+#define CDLZ4TYPE 0x202 Err bitreich.org 70 i #define CDSIZE (8 + 8) Err bitreich.org 70 i Err bitreich.org 70 i extern int pack(unsigned char *, char *, ...); Err bitreich.org 70 i@@ -98,6 +100,8 @@ bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i type = CDNONETYPE; Err bitreich.org 70 i } else if (strcasecmp(bpar->calgo, "snappy") == 0) { Err bitreich.org 70 i type = CDSNAPPYTYPE; Err bitreich.org 70 i+ } else if (strcasecmp(bpar->calgo, "lz4") == 0) { Err bitreich.org 70 i+ type = CDLZ4TYPE; Err bitreich.org 70 i } else { Err bitreich.org 70 i bseterr("invalid compression type: %s", bpar->calgo); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -142,6 +146,8 @@ bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i cctx->type = CDNONETYPE; Err bitreich.org 70 i } else if (strcasecmp(bpar->calgo, "snappy") == 0) { Err bitreich.org 70 i cctx->type = CDSNAPPYTYPE; Err bitreich.org 70 i+ } else if (strcasecmp(bpar->calgo, "lz4") == 0) { Err bitreich.org 70 i+ cctx->type = CDLZ4TYPE; Err bitreich.org 70 i } else { Err bitreich.org 70 i bops->close(bctx); Err bitreich.org 70 i free(cctx); Err bitreich.org 70 i@@ -166,6 +172,8 @@ bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i cn = n; Err bitreich.org 70 i } else if (cctx->type == CDSNAPPYTYPE) { Err bitreich.org 70 i cn = snappy_max_compressed_length(n); Err bitreich.org 70 i+ } else if (cctx->type == CDLZ4TYPE) { Err bitreich.org 70 i+ cn = LZ4_compressBound(n); Err bitreich.org 70 i } else { Err bitreich.org 70 i bseterr("invalid compression type: %d", cctx->type); Err bitreich.org 70 i return -1; Err bitreich.org 70 i@@ -187,6 +195,16 @@ bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i bseterr("snappy_compress: failed"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i+ } else if (cctx->type == CDLZ4TYPE) { Err bitreich.org 70 i+ int ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = LZ4_compress_default(buf, &cbuf[CDSIZE], n, cn); Err bitreich.org 70 i+ if (ret < 0) { Err bitreich.org 70 i+ free(cbuf); Err bitreich.org 70 i+ bseterr("LZ4_compress_default: failed"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ cn = ret; Err bitreich.org 70 i } else { Err bitreich.org 70 i free(cbuf); Err bitreich.org 70 i bseterr("invalid compression type: %d", cctx->type); Err bitreich.org 70 i@@ -218,7 +236,10 @@ bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i Err bitreich.org 70 i /* Calculate maximum compressed block size */ Err bitreich.org 70 i size = *n; Err bitreich.org 70 i- cn = snappy_max_compressed_length(size); Err bitreich.org 70 i+ cn = snappy_max_compressed_length(*n); Err bitreich.org 70 i+ if (cn > size) Err bitreich.org 70 i+ size = cn; Err bitreich.org 70 i+ cn = LZ4_compressBound(*n); Err bitreich.org 70 i if (cn > size) Err bitreich.org 70 i size = cn; Err bitreich.org 70 i size += CDSIZE; Err bitreich.org 70 i@@ -269,6 +290,16 @@ bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i bseterr("snappy_uncompress: failed"); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i+ } else if (cd.type == CDLZ4TYPE) { Err bitreich.org 70 i+ int ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = LZ4_decompress_safe(&cbuf[CDSIZE], buf, cd.size, *n); Err bitreich.org 70 i+ if (ret < 0) { Err bitreich.org 70 i+ free(cbuf); Err bitreich.org 70 i+ bseterr("LZ4_decompress_safe: failed"); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ un = ret; Err bitreich.org 70 i } else { Err bitreich.org 70 i free(cbuf); Err bitreich.org 70 i bseterr("invalid compression type: %d", cd.type); Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -45,6 +45,7 @@ Err bitreich.org 70 i #define CALGOMASK 0x7 Err bitreich.org 70 i #define CNONETYPE 0 Err bitreich.org 70 i #define CSNAPPYTYPE 1 Err bitreich.org 70 i+#define CLZ4TYPE 2 Err bitreich.org 70 i #define BHDRSIZE (NBHDRMAGIC + 8 + 8) Err bitreich.org 70 i Err bitreich.org 70 i /* block descriptor constants */ Err bitreich.org 70 i@@ -339,6 +340,8 @@ bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i bhdr->flags |= CNONETYPE << CALGOSHIFT; Err bitreich.org 70 i } else if (strcasecmp(bpar->calgo, "snappy") == 0) { Err bitreich.org 70 i bhdr->flags |= CSNAPPYTYPE << CALGOSHIFT; Err bitreich.org 70 i+ } else if (strcasecmp(bpar->calgo, "lz4") == 0) { Err bitreich.org 70 i+ bhdr->flags |= CLZ4TYPE << CALGOSHIFT; Err bitreich.org 70 i } else { Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 i@@ -445,6 +448,9 @@ bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar) Err bitreich.org 70 i case CSNAPPYTYPE: Err bitreich.org 70 i bpar->calgo = "snappy"; Err bitreich.org 70 i break; Err bitreich.org 70 i+ case CLZ4TYPE: Err bitreich.org 70 i+ bpar->calgo = "lz4"; Err bitreich.org 70 i+ break; Err bitreich.org 70 i default: Err bitreich.org 70 i free(sctx); Err bitreich.org 70 i close(fd); Err bitreich.org 70 1diff --git a/dup-init.1 b/dup-init.1 /scm/dedup/file/dup-init.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd May 2, 2019 Err bitreich.org 70 i+.Dd May 5, 2019 Err bitreich.org 70 i .Dt DUP-INIT 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -27,7 +27,7 @@ By default none is used. Err bitreich.org 70 i .It Fl Z Ar algo Err bitreich.org 70 i The compressor algorithm used to compress the blocks Err bitreich.org 70 i in the store. Err bitreich.org 70 i-The supported compressor algorithms are none and snappy. Err bitreich.org 70 i+The supported compressor algorithms are none and snappy and lz4. Err bitreich.org 70 i By default snappy is used. Err bitreich.org 70 i .It Fl k Ar keyfile Err bitreich.org 70 i Path to encryption key. Err bitreich.org 70 1diff --git a/test007 b/test007 /scm/dedup/file/test007.gph bitreich.org 70 i@@ -0,0 +1,18 @@ Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+set -ex Err bitreich.org 70 i+ Err bitreich.org 70 i+SHA1SUM=${SHA1SUM:-sha1sum} Err bitreich.org 70 i+ Err bitreich.org 70 i+repo=`mktemp -u` Err bitreich.org 70 i+data=`mktemp` Err bitreich.org 70 i+dd if=/dev/urandom of="$data" bs=1M count=64 Err bitreich.org 70 i+./dup-init -Z lz4 "$repo" Err bitreich.org 70 i+./dup-pack -r "$repo" snap0 < "$data" Err bitreich.org 70 i+./dup-pack -r "$repo" snap1 < "$data" Err bitreich.org 70 i+du -sh "$repo" Err bitreich.org 70 i+sum0=`$SHA1SUM < "$data" | awk '{print $1}'` Err bitreich.org 70 i+sum1=`./dup-unpack -r "$repo" snap0 | $SHA1SUM | awk '{print $1}'` Err bitreich.org 70 i+sum2=`./dup-unpack -r "$repo" snap1 | $SHA1SUM | awk '{print $1}'` Err bitreich.org 70 i+[ "$sum0" = "$sum1" ] Err bitreich.org 70 i+[ "$sum0" = "$sum2" ] Err bitreich.org 70 i+rm -rf "$repo" "$data" Err bitreich.org 70 .