From fcd113cf7bf5587f8cac6d331ec1e427be0a830f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 29 Jul 2021 20:16:43 +0100 Subject: [PATCH] tests: cache: Test cache-on-read option really caches By making use of the delay filter to add a penalty for hitting the plugin we can check whether or not the cache-on-read option is working. (cherry picked from commit 3ae7aa533bb9322ab6dc6deecb687ded76634ab4) --- tests/Makefile.am | 2 + tests/test-cache-on-read-caches.sh | 87 ++++++++++++++++++++++++++++++ tests/test-cache-on-read.sh | 5 -- 3 files changed, 89 insertions(+), 5 deletions(-) create mode 100755 tests/test-cache-on-read-caches.sh diff --git a/tests/Makefile.am b/tests/Makefile.am index a038eabc..51ca913a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1373,6 +1373,7 @@ TESTS += \ test-cache.sh \ test-cache-block-size.sh \ test-cache-on-read.sh \ + test-cache-on-read-caches.sh \ test-cache-max-size.sh \ test-cache-unaligned.sh \ $(NULL) @@ -1380,6 +1381,7 @@ EXTRA_DIST += \ test-cache.sh \ test-cache-block-size.sh \ test-cache-on-read.sh \ + test-cache-on-read-caches.sh \ test-cache-max-size.sh \ test-cache-unaligned.sh \ $(NULL) diff --git a/tests/test-cache-on-read-caches.sh b/tests/test-cache-on-read-caches.sh new file mode 100755 index 00000000..80b34159 --- /dev/null +++ b/tests/test-cache-on-read-caches.sh @@ -0,0 +1,87 @@ +#!/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 cache +requires_filter delay +requires_nbdsh_uri + +sock=$(mktemp -u /tmp/nbdkit-test-sock.XXXXXX) +files="$sock cache-on-read-caches.pid" +rm -f $files +cleanup_fn rm -f $files + +# Run nbdkit with the cache filter, cache-on-read and a read delay. +start_nbdkit -P cache-on-read-caches.pid -U $sock \ + --filter=cache --filter=delay \ + memory 64K cache-on-read=true rdelay=10 + +nbdsh --connect "nbd+unix://?socket=$sock" \ + -c ' +from time import time + +# First read should suffer a penalty. Because we are reading +# a single 64K block (same size as the cache block), we should +# only suffer one penalty of approx. 10 seconds. +st = time() +zb = h.pread(65536, 0) +et = time() +el = et-st +print("elapsed time: %g" % el) +assert et-st >= 10 +assert zb == bytearray(65536) + +# Second read should not suffer a penalty. +st = time() +zb = h.pread(65536, 0) +et = time() +el = et-st +print("elapsed time: %g" % el) +assert el < 10 +assert zb == bytearray(65536) + +# Write something. +buf = b"abcd" * 16384 +h.pwrite(buf, 0) + +# Reading back should be quick since it is stored in the overlay. +st = time() +buf2 = h.pread(65536, 0) +et = time() +el = et-st +print("elapsed time: %g" % el) +assert el < 10 +assert buf == buf2 +' diff --git a/tests/test-cache-on-read.sh b/tests/test-cache-on-read.sh index f8584dcd..85ca83d4 100755 --- a/tests/test-cache-on-read.sh +++ b/tests/test-cache-on-read.sh @@ -56,9 +56,4 @@ zero = h.pread(32768, 0) assert zero == bytearray(32768) buf2 = h.pread(65536, 32768) assert buf == buf2 - -# XXX Suggestion to improve this test: Use the delay filter below the -# cache filter, and time reads to prove that the second read is faster -# because it is not going through the delay filter and plugin. -# XXX second h.pread here ... ' -- 2.31.1