--- tests/Makefile.am | 8 ++- tests/test-cow-extents1.sh | 102 +++++++++++++++++++++++++++++++++++++ tests/test-cow-extents2.sh | 78 ++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 32021716..42e842b2 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1376,11 +1376,17 @@ EXTRA_DIST += \ # cow filter test. if HAVE_MKE2FS_WITH_D -TESTS += test-cow.sh +TESTS += \ + test-cow.sh \ + test-cow-extents1.sh \ + test-cow-extents2.sh \ + $(NULL) endif TESTS += test-cow-null.sh EXTRA_DIST += \ test-cow.sh \ + test-cow-extents1.sh \ + test-cow-extents2.sh \ test-cow-null.sh \ $(NULL) diff --git a/tests/test-cow-extents1.sh b/tests/test-cow-extents1.sh new file mode 100755 index 00000000..87d7c231 --- /dev/null +++ b/tests/test-cow-extents1.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +# nbdkit +# Copyright (C) 2018-2021 Red Hat Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of Red Hat nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +source ./functions.sh +set -e +set -x + +requires_filter cow +requires_plugin file + +requires test -r /dev/urandom + +requires dd --version +requires nbdinfo --version +requires nbdsh --version +requires tr --version +requires truncate --version + +base=cow-extents1-base.img +pid=cow-extents1.pid +out=cow-extents1.out +sock=$(mktemp -u /tmp/nbdkit-test-sock.XXXXXX) +files="$base $pid $out $sock" +rm -f $files +cleanup_fn rm -f $files + +# Create a base file which is half allocated, half sparse. +dd if=/dev/urandom of=$base count=128 bs=1K +truncate -s 256K $base +lastmod="$(stat -c "%y" $base)" + +# Run nbdkit with a COW overlay. +start_nbdkit -P $pid -U $sock --filter=cow file $base +uri="nbd+unix:///?socket=$sock" + +# The map should reflect the base image. +nbdinfo --map "$uri" > $out +cat $out +if [ "$(tr -s ' ' < $out)" != " 0 131072 0 allocated + 131072 131072 3 hole,zero" ]; then + echo "$0: unexpected initial file map" + exit 1 +fi + +# Punch some holes. +nbdsh -u "$uri" \ + -c 'h.trim(4096, 4096)' \ + -c 'h.trim(4098, 16383)' \ + -c 'h.pwrite(b"1"*4096, 65536)' \ + -c 'h.trim(8192, 131072)' \ + -c 'h.pwrite(b"2"*8192, 196608)' + +# The extents map should be fully allocated. +nbdinfo --map "$uri" > $out +cat $out +if [ "$(tr -s ' ' < $out)" != " 0 4096 0 allocated + 4096 4096 3 hole,zero + 8192 8192 0 allocated + 16384 4096 3 hole,zero + 20480 110592 0 allocated + 131072 65536 3 hole,zero + 196608 8192 0 allocated + 204800 57344 3 hole,zero" ]; then + echo "$0: unexpected trimmed file map" + exit 1 +fi + +# The original file must not be modified. +currmod="$(stat -c "%y" $base)" +if [ "$lastmod" != "$currmod" ]; then + echo "$0: FAILED last modified time of base file changed" + exit 1 +fi diff --git a/tests/test-cow-extents2.sh b/tests/test-cow-extents2.sh new file mode 100755 index 00000000..c2ffd0ec --- /dev/null +++ b/tests/test-cow-extents2.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# nbdkit +# Copyright (C) 2018-2021 Red Hat Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of Red Hat nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +source ./functions.sh +set -e +set -x + +requires_filter cow +requires_plugin file +requires test -f disk +requires cmp --version +requires dd --version +requires guestfish --version +requires nbdcopy --version + +copy=cow-extents2.img +sparse=cow-extents2-sparse.img +pid=cow-extents2.pid +sock=$(mktemp -u /tmp/nbdkit-test-sock.XXXXXX) +files="$copy $sparse $pid $sock" +rm -f $files +cleanup_fn rm -f $files + +# Copy the original disk using 'dd' so it becomes fully allocated. +dd if=disk of=$copy + +# Run nbdkit with the cow filter on top. +start_nbdkit -P $pid -U $sock --filter=cow file $copy + +guestfish -a "nbd:///?socket=$sock" <<EOF + run +# Sparsify it into the overlay. + mount /dev/sda1 / + fstrim / + umount /dev/sda1 +# After remounting check we can list the files and read the hello.txt file. + mount /dev/sda1 / + find / + cat /hello.txt +EOF + +# Copy out the disk to a local file. +# This should exercise extents information. +nbdcopy "nbd+unix:///?socket=$sock" $sparse + +# We can only visually check that the file has been sparsified. We do +# not expect the files to be bit for bit identical after running +# fstrim. +ls -lsh disk $copy $sparse -- 2.29.0.rc2