nbdkit/0002-tests-Improve-test-readahead-test.patch
2019-12-14 12:40:02 +00:00

378 lines
13 KiB
Diff

From ce8357a883167b75ced16ea9f1488f7933b3e813 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 14 Dec 2019 12:20:55 +0000
Subject: [PATCH 2/2] 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 1932eea..a5e9897 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 0000000..3c068cb
--- /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 0000000..fd615bd
--- /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 1772228..0000000
--- 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 <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <guestfs.h>
-
-#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 0000000..182aa00
--- /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.23.0