]> www.infradead.org Git - users/hch/xfstests-dev.git/commitdiff
xfs: online grow vs. log recovery stress test
authorBrian Foster <bfoster@redhat.com>
Tue, 29 Oct 2024 17:21:34 +0000 (13:21 -0400)
committerZorro Lang <zlang@kernel.org>
Thu, 31 Oct 2024 20:00:41 +0000 (04:00 +0800)
fstests includes decent functional tests for online growfs and
shrink, and decent stress tests for crash and log recovery, but no
combination of the two. This test combines bits from a typical
growfs stress test like xfs/104 with crash recovery cycles from a
test like generic/388. As a result, this reproduces at least a
couple recently fixed issues related to log recovery of online
growfs operations.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Zorro Lang <zlang@redhat.com>
Signed-off-by: Zorro Lang <zlang@kernel.org>
tests/xfs/609 [new file with mode: 0755]
tests/xfs/609.out [new file with mode: 0644]

diff --git a/tests/xfs/609 b/tests/xfs/609
new file mode 100755 (executable)
index 0000000..c23b689
--- /dev/null
@@ -0,0 +1,79 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024 Red Hat, Inc.  All Rights Reserved.
+#
+# FS QA Test No. 609
+#
+# Test XFS online growfs log recovery.
+#
+. ./common/preamble
+_begin_fstest auto growfs stress shutdown log recoveryloop
+
+# Import common functions.
+. ./common/filter
+
+_stress_scratch()
+{
+       procs=4
+       nops=999999
+       # -w ensures that the only ops are ones which cause write I/O
+       FSSTRESS_ARGS=`_scale_fsstress_args -d $SCRATCH_MNT -w -p $procs \
+           -n $nops $FSSTRESS_AVOID`
+       $FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 &
+}
+
+_require_scratch
+_require_command "$XFS_GROWFS_PROG" xfs_growfs
+_require_command "$KILLALL_PROG" killall
+
+_cleanup()
+{
+       $KILLALL_ALL fsstress > /dev/null 2>&1
+       wait
+       cd /
+       rm -f $tmp.*
+}
+
+_scratch_mkfs_xfs | _filter_mkfs >$seqres.full 2>$tmp.mkfs
+. $tmp.mkfs    # extract blocksize and data size for scratch device
+
+endsize=`expr 550 \* 1048576`  # stop after growing this big
+[ `expr $endsize / $dbsize` -lt $dblocks ] || _notrun "Scratch device too small"
+
+nags=4
+size=`expr 125 \* 1048576`     # 120 megabytes initially
+sizeb=`expr $size / $dbsize`   # in data blocks
+logblks=$(_scratch_find_xfs_min_logblocks -dsize=${size} -dagcount=${nags})
+
+_scratch_mkfs_xfs -lsize=${logblks}b -dsize=${size} -dagcount=${nags} \
+       >> $seqres.full 2>&1 || _fail "mkfs failed"
+_scratch_mount
+
+# Grow the filesystem in random sized chunks while stressing and performing
+# shutdown and recovery. The randomization is intended to create a mix of sub-ag
+# and multi-ag grows.
+while [ $size -le $endsize ]; do
+       echo "*** stressing a ${sizeb} block filesystem" >> $seqres.full
+       _stress_scratch
+       incsize=$((RANDOM % 40 * 1048576))
+       size=`expr $size + $incsize`
+       sizeb=`expr $size / $dbsize`    # in data blocks
+       echo "*** growing to a ${sizeb} block filesystem" >> $seqres.full
+       $XFS_GROWFS_PROG -D ${sizeb} $SCRATCH_MNT >> $seqres.full
+
+       sleep $((RANDOM % 3))
+       _scratch_shutdown
+       ps -e | grep fsstress > /dev/null 2>&1
+       while [ $? -eq 0 ]; do
+               $KILLALL_PROG -9 fsstress > /dev/null 2>&1
+               wait > /dev/null 2>&1
+               ps -e | grep fsstress > /dev/null 2>&1
+       done
+       _scratch_cycle_mount
+done > /dev/null 2>&1
+wait   # stop for any remaining stress processes
+
+echo Silence is golden.
+
+status=0
+exit
diff --git a/tests/xfs/609.out b/tests/xfs/609.out
new file mode 100644 (file)
index 0000000..8be27d3
--- /dev/null
@@ -0,0 +1,2 @@
+QA output created by 609
+Silence is golden.