mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
65a2089099
It appears that the goal of this case was to test balance and replace concurrency. But these two operations aren't meant to run concurrently and the replace failing errors are captured in the seqres.full output. Which are expected errors. To avoid further confusion, this patch adds comments. The reason to keep this test case is at the Link. Link: https://patchwork.kernel.org/patch/11806307/ Reported-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Anand Jain <anand.jain@oracle.com> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
110 lines
3.0 KiB
Bash
Executable File
110 lines
3.0 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (C) 2014 Red Hat Inc. All rights reserved.
|
|
#
|
|
# FSQA Test No. btrfs/064
|
|
#
|
|
# Run btrfs balance and replace operations simultaneously with fsstress running
|
|
# in the background, check with the scrub if all the blocks are ok.
|
|
# Balance and replace operations are mutually exclusive operations they can't
|
|
# run simultaneously. One of them is expected to fail when the other is running.
|
|
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
|
|
# real QA test starts here
|
|
_supported_fs btrfs
|
|
# we check scratch dev after each loop
|
|
_require_scratch_nocheck
|
|
_require_scratch_dev_pool 5
|
|
_require_scratch_dev_pool_equal_size
|
|
_btrfs_get_profile_configs replace
|
|
|
|
rm -f $seqres.full
|
|
|
|
run_test()
|
|
{
|
|
local mkfs_opts=$1
|
|
local saved_scratch_dev_pool=$SCRATCH_DEV_POOL
|
|
|
|
echo "Test $mkfs_opts" >>$seqres.full
|
|
|
|
# remove the last device from the SCRATCH_DEV_POOL list so
|
|
# _scratch_pool_mkfs won't use all devices in pool
|
|
local last_dev="`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $NF}'`"
|
|
SCRATCH_DEV_POOL=`echo $SCRATCH_DEV_POOL | sed -e "s# *$last_dev *##"`
|
|
_scratch_pool_mkfs $mkfs_opts >>$seqres.full 2>&1
|
|
# make sure we created btrfs with desired options
|
|
if [ $? -ne 0 ]; then
|
|
echo "mkfs $mkfs_opts failed"
|
|
SCRATCH_DEV_POOL=$saved_scratch_dev_pool
|
|
return
|
|
fi
|
|
_scratch_mount >>$seqres.full 2>&1
|
|
SCRATCH_DEV_POOL=$saved_scratch_dev_pool
|
|
|
|
args=`_scale_fsstress_args -p 20 -n 100 $FSSTRESS_AVOID -d $SCRATCH_MNT/stressdir`
|
|
echo "Run fsstress $args" >>$seqres.full
|
|
$FSSTRESS_PROG $args >/dev/null 2>&1 &
|
|
fsstress_pid=$!
|
|
|
|
# Start both balance and replace in the background.
|
|
# Either balance or replace shall run, the other fails.
|
|
echo -n "Start balance worker: " >>$seqres.full
|
|
_btrfs_stress_balance $SCRATCH_MNT >/dev/null 2>&1 &
|
|
balance_pid=$!
|
|
echo "$balance_pid" >>$seqres.full
|
|
|
|
echo -n "Start replace worker: " >>$seqres.full
|
|
_btrfs_stress_replace $SCRATCH_MNT >>$seqres.full 2>&1 &
|
|
replace_pid=$!
|
|
echo "$replace_pid" >>$seqres.full
|
|
|
|
echo "Wait for fsstress to exit and kill all background workers" >>$seqres.full
|
|
wait $fsstress_pid
|
|
kill $balance_pid $replace_pid
|
|
wait
|
|
# wait for the balance and replace operations to finish
|
|
while ps aux | grep "balance start" | grep -qv grep; do
|
|
sleep 1
|
|
done
|
|
while ps aux | grep "replace start" | grep -qv grep; do
|
|
sleep 1
|
|
done
|
|
|
|
echo "Scrub the filesystem" >>$seqres.full
|
|
$BTRFS_UTIL_PROG scrub start -B $SCRATCH_MNT >>$seqres.full 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
echo "Scrub find errors in \"$mkfs_opts\" test" | tee -a $seqres.full
|
|
fi
|
|
|
|
_scratch_unmount
|
|
# we called _require_scratch_nocheck instead of _require_scratch
|
|
# do check after test for each profile config
|
|
_check_scratch_fs
|
|
}
|
|
|
|
echo "Silence is golden"
|
|
for t in "${_btrfs_profile_configs[@]}"; do
|
|
run_test "$t"
|
|
done
|
|
|
|
status=0
|
|
exit
|