From e9c972bc03d42d6fe7f11cd076a5500d39976a61 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 29 Mar 2025 10:01:05 +0000 Subject: [PATCH] tests: Add tests of file plugin cache=none These are based on the tests which were done in the commit message when the feature was first added in commit aa5a2183a6, but cleaned up and modernised a little. It is likely that these tests would fail under memory pressure (since they test that the page cache is used vs not used). Making them more robust left as an exercise for the future. (cherry picked from commit 6017ba21aeeb3d7ad85925e78dba85a005194dee) --- README.md | 1 + tests/Makefile.am | 4 ++ tests/test-file-cache-none-read.sh | 90 ++++++++++++++++++++++++++++ tests/test-file-cache-none-write.sh | 92 +++++++++++++++++++++++++++++ 4 files changed, 187 insertions(+) create mode 100755 tests/test-file-cache-none-read.sh create mode 100755 tests/test-file-cache-none-write.sh diff --git a/README.md b/README.md index fbe403da..86ac6c57 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,7 @@ To test for memory leaks (`make check-valgrind`): For non-essential enhancements to the test suite: +* cachedel, cachestats (from https://github.com/Feh/nocache) * expect * fdisk, sfdisk (from util-linux) * flake8 diff --git a/tests/Makefile.am b/tests/Makefile.am index 0aa36846..4340cc38 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -846,6 +846,8 @@ TESTS += \ test-file-extents.sh \ test-file-dir.sh \ test-file-dirfd.sh \ + test-file-cache-none-read.sh \ + test-file-cache-none-write.sh \ $(NULL) EXTRA_DIST += \ test-file.sh \ @@ -855,6 +857,8 @@ EXTRA_DIST += \ test-file-extents.sh \ test-file-dir.sh \ test-file-dirfd.sh \ + test-file-cache-none-read.sh \ + test-file-cache-none-write.sh \ $(NULL) LIBGUESTFS_TESTS += test-file-block diff --git a/tests/test-file-cache-none-read.sh b/tests/test-file-cache-none-read.sh new file mode 100755 index 00000000..c9831b43 --- /dev/null +++ b/tests/test-file-cache-none-read.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# nbdkit +# Copyright Red Hat +# +# 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. + +# Test the file plugin, reading with cache=none. + +source ./functions.sh +set -e +set -x + +# Makes no sense to run this test under valgrind. +skip_if_valgrind + +requires_plugin file +requires_run +requires_nbdcopy +requires $TRUNCATE --version +requires test -r /dev/urandom +requires dd --version +requires $SED --version + +# Requires the cachestats tool from https://github.com/Feh/nocache +# It doesn't support --version or --help, so use 'type' instead. +requires type cachestats +requires type cachedel + +inp=file-cache-none-read.in +stats1=file-cache-none-read.s1 +stats2=file-cache-none-read.s2 +rm -f $inp $stats1 $stats2 +cleanup_fn rm -f $inp $stats1 $stats2 + +# Create a large random file as input. +dd if=/dev/urandom of=$inp bs=1024k count=1024 + +# Drop the input file from the page cache and read it out with nbdkit. +# We expect to see the input file mostly or completely in cache after. +cachedel $inp +nbdkit file $inp --run 'nbdcopy "$uri" null:' +cachestats $inp > $stats1 +cat $stats1 + +# The same, with cache=none. +# We expect to see the input file not cached after. +cachedel $inp +nbdkit file $inp --run 'nbdcopy "$uri" null:' cache=none +cachestats $inp > $stats2 +cat $stats2 + +# The output of cachestats looks like this: +# pages in cache: 262144/262144 (100.0%) [filesize=1048576.0K, pagesize=4K] +# We want to check that % pages in cache using cache=none is much +# lower than the default case. +pic1="$($SED 's,pages in cache: [0-9/]* (\([0-9]*\)\.[0-9]*%).*,\1,' \ + < $stats1)" +pic2="$($SED 's,pages in cache: [0-9/]* (\([0-9]*\)\.[0-9]*%).*,\1,' \ + < $stats2)" + +# Test before is > 10% +test "$pic1" -gt 10 +# Test after is < 10% +test "$pic2" -lt 10 diff --git a/tests/test-file-cache-none-write.sh b/tests/test-file-cache-none-write.sh new file mode 100755 index 00000000..2041a5cd --- /dev/null +++ b/tests/test-file-cache-none-write.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +# nbdkit +# Copyright Red Hat +# +# 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. + +# Test the file plugin, writing with cache=none. + +source ./functions.sh +set -e +set -x + +# Makes no sense to run this test under valgrind. +skip_if_valgrind + +requires_plugin file +requires_run +requires_nbdcopy +requires $TRUNCATE --version +requires test -r /dev/urandom +requires dd --version +requires $SED --version + +# Requires the cachestats tool from https://github.com/Feh/nocache +# It doesn't support --version or --help, so use 'type' instead. +requires type cachestats + +inp=file-cache-none-write.in +out=file-cache-none-write.out +stats1=file-cache-none-write.s1 +stats2=file-cache-none-write.s2 +rm -f $inp $out $stats1 $stats2 +cleanup_fn rm -f $inp $out $stats1 $stats2 + +# Create a large random file as input. +dd if=/dev/urandom of=$inp bs=1024k count=1024 + +# Copy to output using cache=default and collect the stats. +# We expect to see the output file mostly or completely in cache after. +rm -f $out; truncate -r $inp $out +export inp +nbdkit file $out --run 'nbdcopy $inp "$uri"' cache=default +cachestats $out > $stats1 +cat $stats1 + +# The same, with cache=none. +# We expect to see the output file not cached after. +rm -f $out; truncate -r $inp $out +export inp +nbdkit file $out --run 'nbdcopy $inp "$uri"' cache=none +cachestats $out > $stats2 +cat $stats2 + +# The output of cachestats looks like this: +# pages in cache: 262144/262144 (100.0%) [filesize=1048576.0K, pagesize=4K] +# We want to check that % pages in cache using cache=none is much +# lower than the default case. +pic1="$($SED 's,pages in cache: [0-9/]* (\([0-9]*\)\.[0-9]*%).*,\1,' \ + < $stats1)" +pic2="$($SED 's,pages in cache: [0-9/]* (\([0-9]*\)\.[0-9]*%).*,\1,' \ + < $stats2)" + +# Test before is > 10% +test "$pic1" -gt 10 +# Test after is < 10% +test "$pic2" -lt 10 -- 2.47.1