From ce8357a883167b75ced16ea9f1488f7933b3e813 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 14 Dec 2019 12:20:55 +0000 Subject: [PATCH] tests: Improve test-readahead test. See https://www.redhat.com/archives/libguestfs/2019-December/msg00088.html --- tests/Makefile.am | 13 ++-- tests/test-readahead-test-plugin.sh | 48 ++++++++++++ tests/test-readahead-test-request.py | 44 +++++++++++ tests/test-readahead.c | 140 ----------------------------------- tests/test-readahead.sh | 67 +++++++++++++++++ 5 files changed, 166 insertions(+), 146 deletions(-) create mode 100755 tests/test-readahead-test-plugin.sh create mode 100755 tests/test-readahead-test-request.py delete mode 100644 tests/test-readahead.c create mode 100755 tests/test-readahead.sh diff --git a/tests/Makefile.am b/tests/Makefile.am index 1932eea0..a5e9897a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -168,7 +168,10 @@ EXTRA_DIST = \ test-rate.sh \ test-rate-dynamic.sh \ test.rb \ + test-readahead.sh \ test-readahead-copy.sh \ + test-readahead-test-plugin.sh \ + test-readahead-test-request.py \ test-retry.sh \ test-retry-extents.sh \ test-retry-size.sh \ @@ -1050,12 +1053,10 @@ TESTS += \ $(NULL) # readahead filter test. -LIBGUESTFS_TESTS += test-readahead -TESTS += test-readahead-copy.sh - -test_readahead_SOURCES = test-readahead.c test.h -test_readahead_CFLAGS = $(WARNINGS_CFLAGS) $(LIBGUESTFS_CFLAGS) -test_readahead_LDADD = libtest.la $(LIBGUESTFS_LIBS) +TESTS += \ + test-readahead.sh \ + test-readahead-copy.sh \ + $(NULL) # retry filter test. TESTS += \ diff --git a/tests/test-readahead-test-plugin.sh b/tests/test-readahead-test-plugin.sh new file mode 100755 index 00000000..3c068cb1 --- /dev/null +++ b/tests/test-readahead-test-plugin.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# nbdkit +# Copyright (C) 2018-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. + +# Test plugin used by test-readahead.sh. + +case "$1" in + get_size) + # test-readahead-test-request.py will make 10 requests of 512 + # bytes each, so this just has to be >= 512*10. + echo 1M + ;; + pread) + sleep 5 + dd if=/dev/zero count=$3 iflag=count_bytes + ;; + *) + exit 2 + ;; +esac diff --git a/tests/test-readahead-test-request.py b/tests/test-readahead-test-request.py new file mode 100755 index 00000000..fd615bdc --- /dev/null +++ b/tests/test-readahead-test-request.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +# -*- python -*- +# nbdkit +# Copyright (C) 2018-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. + +# Used by test-readahead.sh to make a linear series of requests +# with a constant, known size. + +import nbd +import sys + +h = nbd.NBD () +h.connect_unix (sys.argv[1]) + +for i in range (0, 512*10, 512): + h.pread (512, i) diff --git a/tests/test-readahead.c b/tests/test-readahead.c deleted file mode 100644 index 1772228d..00000000 --- a/tests/test-readahead.c +++ /dev/null @@ -1,140 +0,0 @@ -/* nbdkit - * Copyright (C) 2017-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. - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "test.h" - -int -main (int argc, char *argv[]) -{ - guestfs_h *g; - int r; - char *data; - char **files; - size_t i; - - /* The idea behind the test is that the readahead filter should not - * interfere with normal, complex, non-sequential read and write - * operations (although it will slow things down a lot). - */ - if (test_start_nbdkit ("--filter", "readahead", - "memory", "1G", NULL) == -1) - exit (EXIT_FAILURE); - - g = guestfs_create (); - if (g == NULL) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } - - r = guestfs_add_drive_opts (g, "", - GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", - GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "nbd", - GUESTFS_ADD_DRIVE_OPTS_SERVER, server, - -1); - if (r == -1) - exit (EXIT_FAILURE); - - if (guestfs_launch (g) == -1) - exit (EXIT_FAILURE); - - if (guestfs_part_disk (g, "/dev/sda", "mbr") == -1) - exit (EXIT_FAILURE); - if (guestfs_mkfs (g, "ext2", "/dev/sda1") == -1) - exit (EXIT_FAILURE); - - if (guestfs_mount_options (g, "discard", "/dev/sda1", "/") == -1) - exit (EXIT_FAILURE); - -#define filename "/hello.txt" -#define content "hello, people of the world" - - if (guestfs_write (g, filename, content, strlen (content)) == -1) - exit (EXIT_FAILURE); - - if (guestfs_mkdir (g, "/fill") == -1) - exit (EXIT_FAILURE); - - if (guestfs_fill_dir (g, "/fill", 10000) == -1) - exit (EXIT_FAILURE); - - /* Force write through to and read back from disk. */ - if (guestfs_sync (g) == -1 || guestfs_drop_caches (g, 3) == -1) - exit (EXIT_FAILURE); - - data = guestfs_cat (g, filename); - if (!data) - exit (EXIT_FAILURE); - - if (strcmp (data, content) != 0) { - fprintf (stderr, - "%s FAILED: unexpected content of %s file " - "(actual: %s, expected: %s)\n", - program_name, filename, data, content); - exit (EXIT_FAILURE); - } - - files = guestfs_find (g, "/"); - if (!files) - exit (EXIT_FAILURE); - for (i = 0; files[i] != NULL; ++i) - free (files[i]); - free (files); - -#ifdef GUESTFS_HAVE_FSTRIM - /* Delete the files and fstrim to test zeroing/trimming. */ - if (guestfs_rm (g, filename) == -1) - exit (EXIT_FAILURE); - - if (guestfs_rm_rf (g, "/fill") == -1) - exit (EXIT_FAILURE); - - if (guestfs_fstrim (g, "/", -1) == -1) - exit (EXIT_FAILURE); -#endif - - if (guestfs_shutdown (g) == -1) - exit (EXIT_FAILURE); - - guestfs_close (g); - exit (EXIT_SUCCESS); -} diff --git a/tests/test-readahead.sh b/tests/test-readahead.sh new file mode 100755 index 00000000..182aa000 --- /dev/null +++ b/tests/test-readahead.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# nbdkit +# Copyright (C) 2018-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. + +# Is the readahead filter faster? Copy a blank disk with a custom +# plugin that sleeps on every request. Because the readahead filter +# should result in fewer requests it should run faster. + +source ./functions.sh +set -e +set -x + +requires python3 --version +requires python3 -c 'import nbd' + +files="readahead.img" +rm -f $files +cleanup_fn rm -f $files + +test () +{ + start_t=$SECONDS + nbdkit -fv -U - "$@" sh ./test-readahead-test-plugin.sh \ + --run './test-readahead-test-request.py $unixsocket' + end_t=$SECONDS + echo $((end_t - start_t)) +} + +t1=$(test --filter=readahead) +t2=$(test) + +# In the t1 case we should make only 1 request into the plugin, +# resulting in around 1 sleep period (5 seconds). In the t2 case we +# make 10 requests so sleep for around 50 seconds. t1 should be < t2 +# is every reasonable scenario. +if [ $t1 -ge $t2 ]; then + echo "$0: readahead filter took longer, should be shorter" + exit 1 +fi -- 2.11.4.GIT