diff mbox series

[28/40] filters: add a filter that accepts EIO instead of other errors

Message ID 20241127045403.3665299-29-david@fromorbit.com (mailing list archive)
State New
Headers show
Series fstests: concurrent test execution | expand

Commit Message

Dave Chinner Nov. 27, 2024, 4:51 a.m. UTC
From: Dave Chinner <dchinner@redhat.com>

Running a dm-flakey or dm-error test that loads a table that returns
EIO to all IO and then running a command that is expected to fail
with a specific error is racy.

If there is memory pressure at the same time that the table is
loaded, cached inodes can be turfed from memory and the command then
needs to read the inode it is about to act on from disk again. This
results in the inode read getting EIO and failing (e.g. xfs_io will
return a stat() error) rather than having the desired operation
fail.

This results in spurious test failures that look like this:

generic/331       - output mismatch (see /mnt/xfs/runner-41/results-2024-11-20-10:57:31/xfs/generic/331.out.bad)
    --- tests/generic/331.out   2022-12-21 15:53:25.487044098 +1100
    +++ /mnt/xfs/runner-41/results-2024-11-20-10:57:31/xfs/generic/331.out.bad  2024-11-20 11:02:12.123572607 +1100
    @@ -5,7 +5,8 @@
     1886e67cf8783e89ce6ddc5bb09a3944  SCRATCH_MNT/test-331/file1
     1886e67cf8783e89ce6ddc5bb09a3944  SCRATCH_MNT/test-331/file2
     CoW and unmount
    -fdatasync: Input/output error
    +/mnt/xfs/runner-41/scratch/test-331/file2: Input/output error
    +stat: Input/output error
     Compare files
    ...

Add a new "flakey EIO filter" that will catch -any- EIO error from
the command and change it to the error we expected to see.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
 common/filter     | 9 +++++++++
 tests/btrfs/160   | 3 ++-
 tests/generic/252 | 3 ++-
 tests/generic/329 | 3 ++-
 tests/generic/331 | 5 +++--
 tests/generic/484 | 3 ++-
 tests/generic/743 | 4 +++-
 tests/xfs/237     | 3 ++-
 tests/xfs/240     | 5 +++--
 9 files changed, 28 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/common/filter b/common/filter
index 6a509d8b5..7e02ded37 100644
--- a/common/filter
+++ b/common/filter
@@ -662,5 +662,14 @@  _filter_trailing_whitespace()
 	sed -E -e "s/\s+$//"
 }
 
+# Catch -any- EIO error regardless of it's source and replace it with the
+# supplied error message.
+_filter_flakey_EIO()
+{
+	local message="$*"
+
+	sed -e "s#.*: Input\/output error#$message#"
+}
+
 # make sure this script returns success
 /bin/true
diff --git a/tests/btrfs/160 b/tests/btrfs/160
index 04ed1f176..c4a01d330 100755
--- a/tests/btrfs/160
+++ b/tests/btrfs/160
@@ -66,7 +66,8 @@  _dmerror_load_working_table
 
 # open again and call fsync
 echo "The following fsync should fail with EIO:"
-$XFS_IO_PROG -c fsync $testfile
+$XFS_IO_PROG -c fsync $testfile |& \
+		_filter_flakey_EIO "fsync: Input/output error"
 echo "done"
 
 # close file
diff --git a/tests/generic/252 b/tests/generic/252
index ddf950e34..2ad0524c2 100755
--- a/tests/generic/252
+++ b/tests/generic/252
@@ -66,7 +66,8 @@  $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full
 $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full
 _scratch_sync
 _dmerror_load_error_table
-$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full
+$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 |& \
+		_filter_flakey_EIO "write missed bytes expect 8388608 got 0"
 _dmerror_load_working_table
 _dmerror_unmount
 _dmerror_mount
diff --git a/tests/generic/329 b/tests/generic/329
index e4300f92c..96a5ad54c 100755
--- a/tests/generic/329
+++ b/tests/generic/329
@@ -59,7 +59,8 @@  $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full
 $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full
 _scratch_sync
 _dmerror_load_error_table
-$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full
+$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 |& \
+		_filter_flakey_EIO "write missed bytes expect 8388608 got 0"
 _dmerror_load_working_table
 _dmerror_unmount
 _dmerror_mount
diff --git a/tests/generic/331 b/tests/generic/331
index fe12ec4eb..704bb1283 100755
--- a/tests/generic/331
+++ b/tests/generic/331
@@ -59,8 +59,9 @@  $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full
 $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full
 _scratch_sync
 _dmerror_load_error_table
-$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full
-$XFS_IO_PROG -c "fdatasync" $testdir/file2
+$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full 2>&1
+$XFS_IO_PROG -c "fdatasync" $testdir/file2 |& \
+		_filter_flakey_EIO "fdatasync: Input/output error"
 _dmerror_load_working_table
 _dmerror_unmount
 _dmerror_mount
diff --git a/tests/generic/484 b/tests/generic/484
index 09c2c5598..ec50735a5 100755
--- a/tests/generic/484
+++ b/tests/generic/484
@@ -54,7 +54,8 @@  $XFS_IO_PROG -c "pwrite -W -q 0 $datalen" $testfile
 _dmerror_load_error_table
 
 # rewrite the data and call fdatasync
-$XFS_IO_PROG -c "pwrite -w -q 0 $datalen" $testfile
+$XFS_IO_PROG -c "pwrite -w -q 0 $datalen" $testfile |& \
+		_filter_flakey_EIO "fdatasync: Input/output error"
 
 # heal the device error
 _dmerror_load_working_table
diff --git a/tests/generic/743 b/tests/generic/743
index 228ba764e..efdeec82d 100755
--- a/tests/generic/743
+++ b/tests/generic/743
@@ -21,6 +21,7 @@  _cleanup()
 }
 
 # Import common functions.
+. ./common/filter
 . ./common/dmerror
 
 _fixed_by_kernel_commit 631426ba1d45 \
@@ -55,7 +56,8 @@  _dmerror_mount
 stat "$SCRATCH_MNT/a" >> $seqres.full
 echo read with IO errors
 _dmerror_load_error_table
-$TIMEOUT_PROG -s KILL 10s $XFS_IO_PROG -c "mmap -r 0 $filesz" -c "madvise -R 0 $filesz" "$SCRATCH_MNT/a"
+$TIMEOUT_PROG -s KILL 10s $XFS_IO_PROG -c "mmap -r 0 $filesz" -c "madvise -R 0 $filesz" "$SCRATCH_MNT/a" |& \
+		_filter_flakey_EIO "madvise: Bad address"
 _dmerror_load_working_table
 
 # success, all done
diff --git a/tests/xfs/237 b/tests/xfs/237
index 91f56d6c1..eb5dc5d2f 100755
--- a/tests/xfs/237
+++ b/tests/xfs/237
@@ -68,7 +68,8 @@  $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full
 $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full
 _scratch_sync
 _dmerror_load_error_table
-$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full
+$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 |& \
+		_filter_flakey_EIO "write missed bytes expect 8388608 got 0"
 _dmerror_load_working_table
 _dmerror_unmount
 _dmerror_mount
diff --git a/tests/xfs/240 b/tests/xfs/240
index e95cf3f5d..8916828a8 100755
--- a/tests/xfs/240
+++ b/tests/xfs/240
@@ -64,8 +64,9 @@  $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full
 $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full
 _scratch_sync
 _dmerror_load_error_table
-$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full
-$XFS_IO_PROG -c "fdatasync" $testdir/file2
+$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full 2>&1
+$XFS_IO_PROG -c "fdatasync" $testdir/file2 |& \
+		_filter_flakey_EIO "fdatasync: Input/output error"
 _dmerror_load_working_table
 _dmerror_unmount
 _dmerror_mount