Add upstream patch to make tests/test-truncate4.sh more stable on s390x.

This commit is contained in:
Richard W.M. Jones 2020-05-20 16:06:27 +01:00
parent a77ed1702a
commit 1da65fc037
2 changed files with 174 additions and 1 deletions

View File

@ -0,0 +1,167 @@
From 0632acc76bfeb7d70d3eefa42fc842ce6b7be4f8 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 20 May 2020 13:27:27 +0100
Subject: [PATCH] tests/test-truncate4.sh: Rewrite to use nbdsh.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The old test relied on issuing an asynchronous command to a qemu-io
subprocess, requiring a sleep to ensure that the command had been
carried out. sleep 1 was not long enough on s390x as you can see
from this partial trace:
+ exec
+ qemu-io -f raw nbd:unix:/tmp/tmp.jqOZGj6dnX
+ exec
+ echo 'Reading from connection A, try 1'
Reading from connection A, try 1
+ echo 'r -P 1 0 1024'
+ sleep 1
Above we issue the command and sleep while it executes. However:
nbdkit: debug: accepted connection
nbdkit: file[1]: debug: truncate: preconnect
nbdkit: file[1]: debug: file: preconnect
nbdkit: file[1]: debug: newstyle negotiation: flags: global 0x3
+ echo 'Resizing down'
Resizing down
+ truncate -s 512 truncate4.data
nbdkit: file[1]: debug: newstyle negotiation: client flags: 0x3
nbdkit: file[1]: debug: newstyle negotiation: NBD_OPT_STRUCTURED_REPLY: client requested structured replies
Here are still connecting to nbdkit from "connection A", long after
the sleep has finished and the truncate has been done.
Instead of increasing the sleep and hoping for the best, I chose to
rewrite the test to use nbdsh. This allows us to control both
connections from a single process, making the test predicatable and
easier to understand.
---
tests/test-truncate4.sh | 85 +++++++++++++++++++++++++----------------
1 file changed, 53 insertions(+), 32 deletions(-)
diff --git a/tests/test-truncate4.sh b/tests/test-truncate4.sh
index e4be626b..36b2743c 100755
--- a/tests/test-truncate4.sh
+++ b/tests/test-truncate4.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# nbdkit
-# Copyright (C) 2019 Red Hat Inc.
+# Copyright (C) 2019-2020 Red Hat Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
@@ -31,55 +31,76 @@
# 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).
+# 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
+requires nbdsh --version
sock=`mktemp -u`
-files="truncate4.out truncate4.pid $sock truncate4.data"
+data=truncate4.data
+files="truncate4.pid $sock $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
+# Create and truncate the file.
+: > $data
# Run nbdkit with file plugin and truncate filter in front.
start_nbdkit -P truncate4.pid -U $sock \
--filter=truncate \
- file truncate4.data \
+ file $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
+export data sock
+nbdsh -c '
+import os
+
+data = os.environ["data"]
+sock = os.environ["sock"]
+
+def restore_file():
+ # Original test data, 1024 bytes of "TEST" repeated.
+ with open (data, "w") as file:
+ file.write ("TEST"*256)
+
+restore_file ()
+
+print ("Connection A.", flush=True)
+connA = nbd.NBD ()
+connA.set_handle_name ("A")
+connA.connect_unix (sock)
+print ("Check the size.", flush=True)
+assert connA.get_size () == 1024
+
+print ("Truncate %s to 512 bytes." % data, flush=True)
+os.truncate (data, 512)
+
+print ("Connection B.", flush=True)
+connB = nbd.NBD ()
+connB.set_handle_name ("B")
+connB.connect_unix (sock)
+print ("Check the size.", flush=True)
+assert connB.get_size () == 1024 # because of the round-up parameter
+print ("Read data from connection B.", flush=True)
+buf = connB.pread (1024, 0)
+assert buf == b"TEST"*128 + b"\0"*512
+
+print ("Restore the file size and original data.", flush=True)
+restore_file ()
+
+print ("Read data from connection A.", flush=True)
+buf = connA.pread (1024, 0)
+assert 1024 == len (buf)
+assert buf == b"TEST"*256
+'
--
2.25.0

View File

@ -45,7 +45,7 @@ ExclusiveArch: x86_64
Name: nbdkit
Version: 1.21.4
Release: 1%{?dist}
Release: 2%{?dist}
Summary: NBD server
License: BSD
@ -58,6 +58,9 @@ Source1: http://libguestfs.org/download/nbdkit/%{source_directory}/%{name
Source2: libguestfs.keyring
%endif
# Upstream patch to make tests/test-truncate4.sh more stable on s390x.
Patch1: 0001-tests-test-truncate4.sh-Rewrite-to-use-nbdsh.patch
%if 0%{patches_touch_autotools}
BuildRequires: autoconf, automake, libtool
%endif
@ -981,6 +984,9 @@ make %{?_smp_mflags} check || {
%changelog
* Wed May 20 2020 Richard W.M. Jones <rjones@redhat.com> - 1.21.4-2
- Add upstream patch to make tests/test-truncate4.sh more stable on s390x.
* Tue May 19 2020 Richard W.M. Jones <rjones@redhat.com> - 1.21.4-1
- New upstream development version 1.21.4.