1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
#!/usr/bin/env bash
. ./wvtest-bup.sh || exit $?
. dev/lib.sh || exit $?
set -o pipefail
mb=1048576
top="$(WVPASS pwd)" || exit $?
tmpdir="$(WVPASS wvmktempdir)" || exit $?
readonly mb top tmpdir
export BUP_DIR="$tmpdir/bup"
export GIT_DIR="$tmpdir/bup"
bup() { "$top/bup" "$@"; }
WVPASS cd "$tmpdir"
# The 3MB guess is semi-arbitrary, but we've been informed that
# Lustre, for example, uses 1MB, so guess higher than that, at least.
block_size=$(bup-cfg-py -c \
"import os; print(getattr(os.stat('.'), 'st_blksize', 0)) or $mb * 3") \
|| exit $?
data_size=$((block_size * 20))
readonly block_size data_size
WVPASS dd if=/dev/zero of=test-sparse-probe seek="$data_size" bs=1 count=1
sparse_size=$(WVPASS "$top/dev/sparse-size" test-sparse-probe) || exit $?
if [ "$sparse_size" -lt "$block_size" ]; then
WVSKIP "no sparse support detected -- skipping tests"
exit 0
fi
WVSTART "sparse restore on $("$top/dev/path-fs" .), assuming ${block_size}B blocks"
WVPASS bup init
WVPASS mkdir src
WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
WVPASS bup index src
WVPASS bup save -n src src
WVSTART "sparse file restore (all sparse)"
WVPASS bup restore -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" = 0 ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --no-sparse (all sparse)"
WVPASS rm -r restore
WVPASS bup restore --no-sparse -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" = 0 ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (all sparse)"
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" -gt "$((15 * block_size))" ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (sparse end)"
WVPASS echo "start" > src/foo
WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1 conv=notrunc
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" -gt "$((15 * block_size))" ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (sparse middle)"
WVPASS echo "end" >> src/foo
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" -gt "$((15 * block_size))" ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (bracketed zero run in buf)"
WVPASS echo 'x' > src/foo
WVPASS dd if=/dev/zero bs=1 count=512 >> src/foo
WVPASS echo 'y' >> src/foo
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (sparse start)"
WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
WVPASS echo "end" >> src/foo
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" -gt "$((15 * block_size))" ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (sparse start and end)"
WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
WVPASS echo "middle" >> src/foo
WVPASS dd if=/dev/zero of=src/foo seek=$((2 * data_size)) bs=1 count=1 conv=notrunc
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
sparse_size=$(WVPASS "$top/dev/sparse-size" restore/src/foo) || exit $?
WVPASS [ "$sparse_size" -gt "$((15 * block_size))" ]
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
if test "$block_size" -gt $mb; then
random_size="$block_size"
else
random_size=1M
fi
WVSTART "sparse file restore --sparse (random $random_size)"
WVPASS bup random --seed "$RANDOM" 1M > src/foo
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (random sparse regions)"
WVPASS rm -rf "$BUP_DIR" src
WVPASS bup init
WVPASS mkdir src
for sparse_dataset in 0 1 2 3 4 5 6 7 8 9
do
WVPASS "$top/dev/sparse-test-data" "src/foo-$sparse_dataset"
done
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVSTART "sparse file restore --sparse (short zero runs around boundary)"
WVPASS bup-cfg-py > src/foo <<EOF
from sys import stdout
stdout.write("x" * 65535 + "\0")
stdout.write("\0" + "x" * 65535)
stdout.write("\0" + "x" * 65534 + "\0")
stdout.write("x" * 65536)
stdout.write("\0")
EOF
WVPASS bup index src
WVPASS bup save -n src src
WVPASS rm -r restore
WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
WVPASS "$top/dev/compare-trees" -c src/ restore/src/
WVPASS rm -rf "$tmpdir"
|