mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
e2fd1a080e
Add fsstress to the pile of things that we race with rmap repair to ensure that the rmap repair isolates the filesystem correctly while it is doing its repairs. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eryu Guan <guaneryu@gmail.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
126 lines
3.2 KiB
Bash
Executable File
126 lines
3.2 KiB
Bash
Executable File
#! /bin/bash
|
|
# FS QA Test No. 422
|
|
#
|
|
# Race freeze and rmapbt repair for a while to see if we crash or livelock.
|
|
# rmapbt repair requires us to freeze the filesystem to stop all filesystem
|
|
# activity, so we can't have userspace wandering in and thawing it.
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
# Copyright (c) 2017 Oracle, Inc. All Rights Reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it would be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
trap "_cleanup; exit \$status" 0 1 2 3 7 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
rm -rf $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
. ./common/fuzzy
|
|
. ./common/inject
|
|
. ./common/xfs
|
|
|
|
# real QA test starts here
|
|
_supported_os Linux
|
|
_supported_fs xfs
|
|
_require_xfs_scratch_rmapbt
|
|
_require_xfs_io_command "scrub"
|
|
_require_xfs_io_error_injection "force_repair"
|
|
_require_command "$KILLALL_PROG" killall
|
|
|
|
echo "Format and populate"
|
|
_scratch_mkfs > "$seqres.full" 2>&1
|
|
_scratch_mount
|
|
|
|
STRESS_DIR="$SCRATCH_MNT/testdir"
|
|
mkdir -p $STRESS_DIR
|
|
|
|
for i in $(seq 0 9); do
|
|
mkdir -p $STRESS_DIR/$i
|
|
for j in $(seq 0 9); do
|
|
mkdir -p $STRESS_DIR/$i/$j
|
|
for k in $(seq 0 9); do
|
|
echo x > $STRESS_DIR/$i/$j/$k
|
|
done
|
|
done
|
|
done
|
|
|
|
cpus=$(( $(src/feature -o) * 4 * LOAD_FACTOR))
|
|
|
|
echo "Concurrent repair"
|
|
filter_output() {
|
|
egrep -v '(Device or resource busy|Invalid argument)'
|
|
}
|
|
freeze_loop() {
|
|
end="$1"
|
|
|
|
while [ "$(date +%s)" -lt $end ]; do
|
|
$XFS_IO_PROG -x -c 'freeze' -c 'thaw' $SCRATCH_MNT 2>&1 | filter_output
|
|
done
|
|
}
|
|
repair_loop() {
|
|
end="$1"
|
|
|
|
while [ "$(date +%s)" -lt $end ]; do
|
|
$XFS_IO_PROG -x -c 'repair rmapbt 0' -c 'repair rmapbt 1' $SCRATCH_MNT 2>&1 | filter_output
|
|
done
|
|
}
|
|
stress_loop() {
|
|
end="$1"
|
|
|
|
FSSTRESS_ARGS=$(_scale_fsstress_args -p 4 -d $SCRATCH_MNT -n 2000 $FSSTRESS_AVOID)
|
|
while [ "$(date +%s)" -lt $end ]; do
|
|
$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full
|
|
done
|
|
}
|
|
$XFS_IO_PROG -x -c 'inject force_repair' $SCRATCH_MNT
|
|
|
|
start=$(date +%s)
|
|
end=$((start + (30 * TIME_FACTOR) ))
|
|
|
|
echo "Loop started at $(date --date="@${start}"), ending at $(date --date="@${end}")" >> $seqres.full
|
|
stress_loop $end &
|
|
freeze_loop $end &
|
|
repair_loop $end &
|
|
|
|
# Wait until 2 seconds after the loops should have finished...
|
|
while [ "$(date +%s)" -lt $((end + 2)) ]; do
|
|
sleep 1
|
|
done
|
|
|
|
# ...and clean up after the loops in case they didn't do it themselves.
|
|
$KILLALL_PROG -TERM xfs_io fsstress >> $seqres.full 2>&1
|
|
$XFS_IO_PROG -x -c 'thaw' $SCRATCH_MNT >> $seqres.full 2>&1
|
|
|
|
echo "Loop finished at $(date)" >> $seqres.full
|
|
echo "Test done"
|
|
|
|
# success, all done
|
|
status=0
|
|
exit
|