[Libguestfs] [nbdkit PATCH 3/4] truncate: Test for safe multi-connect size handling

Richard W.M. Jones rjones at redhat.com
Mon Apr 29 12:29:12 UTC 2019


On Sat, Apr 27, 2019 at 04:26:45PM -0500, Eric Blake wrote:
> Test the just-fixed bug in the truncate filter. Although it is in
> general unsafe to shrink an image being served by the file plugin, the
> test is careful to only issue operations on connection A after the
> file has been resized back to its original length, in order to prove
> whether the smaller size observed during the short-lived connection B
> bleeds over into the pread results seen by connection A.  If this test
> is applied without the previous patch, the second read from A sees all
> zeroes instead of the desired pattern 2.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  tests/Makefile.am       |  2 +
>  tests/test-truncate4.sh | 85 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 87 insertions(+)
>  create mode 100755 tests/test-truncate4.sh
> 
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 4b7aa22..4148793 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -122,6 +122,7 @@ EXTRA_DIST = \
>  	test-truncate1.sh \
>  	test-truncate2.sh \
>  	test-truncate3.sh \
> +	test-truncate4.sh \
>  	test-truncate-extents.sh \
>  	test-vddk.sh \
>  	test-vddk-real.sh \
> @@ -937,6 +938,7 @@ TESTS += \
>  	test-truncate1.sh \
>  	test-truncate2.sh \
>  	test-truncate3.sh \
> +	test-truncate4.sh \
>  	test-truncate-extents.sh
> 
>  # xz filter test.
> diff --git a/tests/test-truncate4.sh b/tests/test-truncate4.sh
> new file mode 100755
> index 0000000..e4be626
> --- /dev/null
> +++ b/tests/test-truncate4.sh
> @@ -0,0 +1,85 @@
> +#!/usr/bin/env bash
> +# nbdkit
> +# Copyright (C) 2019 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.
> +
> +# Regression test when next_ops->get_size changes between connections.
> +# For now, NBD does not support dynamic resize; but the file plugin
> +# reads size from the file system for each new connection, at which
> +# point the client remembers that size for the life of the connection.
> +# We are testing that connection A can still see the tail of a file,
> +# even when connection B is opened while the file was temporarily
> +# shorter (if the actions of connection B affect the size visible
> +# through connection A, we didn't isolate per-connection state).
> +
> +source ./functions.sh
> +set -e
> +set -x
> +
> +requires qemu-io --version
> +
> +sock=`mktemp -u`
> +files="truncate4.out truncate4.pid $sock truncate4.data"
> +rm -f $files
> +cleanup_fn rm -f $files
> +
> +# Initial file contents: 1k of pattern 1
> +truncate -s 1024 truncate4.data
> +qemu-io -c 'w -P 1 0 1024' -f raw truncate4.data
> +
> +# Run nbdkit with file plugin and truncate filter in front.
> +start_nbdkit -P truncate4.pid -U $sock \
> +       --filter=truncate \
> +       file truncate4.data \
> +       round-up=1024
> +
> +fail=0
> +exec 4>&1 # Save original stdout
> +{
> +    exec 5>&1 >&4 # Save connection A, set stdout back to original
> +    echo 'Reading from connection A, try 1'
> +    echo 'r -P 1 0 1024' >&5
> +    sleep 1
> +    echo 'Resizing down'
> +    truncate -s 512 truncate4.data
> +    echo 'Reading from connection B'
> +    echo 'r -P 1 0 512' | qemu-io -f raw nbd:unix:$sock >> truncate4.out
> +    echo 'Restoring size'
> +    truncate -s 1024 truncate4.data
> +    qemu-io -c 'w -P 2 0 1024' -f raw truncate4.data
> +    echo 'Reading from connection A, try 2'
> +    echo 'r -P 2 512 512' >&5
> +    echo 'quit' >&5
> +} | qemu-io -f raw nbd:unix:$sock >> truncate4.out || fail=1
> +exec 4>&-
> +
> +cat truncate4.out
> +grep 'Pattern verification failed' truncate4.out && fail=1
> +exit $fail

I guess this test will break in future if we implement and return
‘can_resize = true’ in the file plugin?  Or will the (also updated)
truncate filter be able to cope?

Anyway since we can adjust or remove the test if necessary later,

ACK

RIch.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v




More information about the Libguestfs mailing list