mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
8c16b061f7
In btrfs-progs v4.10 we had a behaviour change where starting a balance
operation without any filters results in a delay of 10 seconds and a
warning is printed to stdout that warns that a full balance is about to
be made and that it can be a slow operation. The new flag '--full-balance'
was added in that release to avoid the 10 seconds delay and the warning
message.
Our existing helper _run_btrfs_balance_start() uses that new balance flag
if we are running a btrfs-progs version that has it, to avoid that 10
seconds wait.
Make all existing btrfs tests that trigger balance operations use the
_run_btrfs_balance_start() helper, so that we avoid wasting time and
speed up some of the tests. In particular test btrfs/014 is now about 10x
faster and tests btrfs/060 to btrfs/064 3 to 5 times faster (depending
on the fsstress random load).
Besides speeding up many tests that do balance operations it also fixes
functional problems:
1) Since btrfs-progs v4.10 the test case btrfs/014 got broken, because
its purpose is to run balance and snapshot creation in parallel,
and that wasn't happening anymore because all snapshots were being
created during the 10 seconds delay of the first balance operation,
so balance and snapshot creation was being serialized instead of
running in parallel.
Fixing this test to avoid the 10 seconds delay immediately
exposes a regression that went into kernel 5.7-rc1 which is fixed
by the following commit
aec7db3b13a0 ("btrfs: fix setting last_trans for reloc roots")
2) Test cases btrfs/060 to btrfs/064 now spend much more time running
fsstress, balance and other operations in parallel, there's no
longer intervals of 10 seconds where balance is not running
concurrently with those other operations, making the tests a lot
more useful again.
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
170 lines
4.0 KiB
Bash
Executable File
170 lines
4.0 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2017 Oracle. All Rights Reserved.
|
|
#
|
|
# FS QA Test 154
|
|
#
|
|
# Test for reappearing missing device functionality.
|
|
# This test will fail without the btrfs kernel patch
|
|
# [PATCH] btrfs: handle dynamically reappearing missing device
|
|
#
|
|
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 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
. ./common/module
|
|
|
|
# remove previous $seqres.full before test
|
|
rm -f $seqres.full
|
|
|
|
# real QA test starts here
|
|
|
|
_supported_fs btrfs
|
|
_supported_os Linux
|
|
_require_scratch_dev_pool 2
|
|
_require_btrfs_forget_or_module_loadable
|
|
|
|
_scratch_dev_pool_get 2
|
|
|
|
DEV1=`echo $SCRATCH_DEV_POOL | awk '{print $1}'`
|
|
DEV2=`echo $SCRATCH_DEV_POOL | awk '{print $2}'`
|
|
|
|
echo DEV1=$DEV1 >> $seqres.full
|
|
echo DEV2=$DEV2 >> $seqres.full
|
|
|
|
# Balance won't be successful if filled too much
|
|
DEV1_SZ=`blockdev --getsize64 $DEV1`
|
|
DEV2_SZ=`blockdev --getsize64 $DEV2`
|
|
|
|
# get min
|
|
MAX_FS_SZ=`echo -e "$DEV1_SZ\n$DEV2_SZ" | sort -n | head -1`
|
|
# Need disks with more than 2G
|
|
if [ $MAX_FS_SZ -lt 2000000000 ]; then
|
|
_scratch_dev_pool_put
|
|
_notrun "Smallest dev size $MAX_FS_SZ, Need at least 2G"
|
|
fi
|
|
|
|
MAX_FS_SZ=100000000
|
|
bs="1M"
|
|
COUNT=$(($MAX_FS_SZ / 1000000))
|
|
CHECKPOINT1=0
|
|
CHECKPOINT2=0
|
|
|
|
setup()
|
|
{
|
|
echo >> $seqres.full
|
|
echo "MAX_FS_SZ=$MAX_FS_SZ COUNT=$COUNT" >> $seqres.full
|
|
echo "setup"
|
|
echo "-----setup-----" >> $seqres.full
|
|
_scratch_pool_mkfs "-mraid1 -draid1" >> $seqres.full 2>&1
|
|
_scratch_mount >> $seqres.full 2>&1
|
|
dd if=/dev/urandom of="$SCRATCH_MNT"/tf bs=$bs count=1 \
|
|
>>$seqres.full 2>&1
|
|
_run_btrfs_util_prog filesystem show -m ${SCRATCH_MNT}
|
|
_run_btrfs_util_prog filesystem df $SCRATCH_MNT
|
|
COUNT=$(( $COUNT - 1 ))
|
|
echo "unmount" >> $seqres.full
|
|
_scratch_unmount
|
|
}
|
|
|
|
degrade_mount_write()
|
|
{
|
|
echo >> $seqres.full
|
|
echo "--degraded mount: max_fs_sz $max_fs_sz bytes--" >> $seqres.full
|
|
echo
|
|
echo "degraded mount"
|
|
|
|
echo "clean btrfs ko" >> $seqres.full
|
|
# un-scan the btrfs devices
|
|
_btrfs_forget_or_module_reload
|
|
_mount -o degraded $DEV1 $SCRATCH_MNT >>$seqres.full 2>&1
|
|
cnt=$(( $COUNT/10 ))
|
|
dd if=/dev/urandom of="$SCRATCH_MNT"/tf1 bs=$bs count=$cnt \
|
|
>>$seqres.full 2>&1
|
|
COUNT=$(( $COUNT - $cnt ))
|
|
_run_btrfs_util_prog filesystem show -m $SCRATCH_MNT
|
|
_run_btrfs_util_prog filesystem df $SCRATCH_MNT
|
|
CHECKPOINT1=`md5sum $SCRATCH_MNT/tf1`
|
|
echo $SCRATCH_MNT/tf1:$CHECKPOINT1 >> $seqres.full
|
|
}
|
|
|
|
scan_missing_dev_and_write()
|
|
{
|
|
echo >> $seqres.full
|
|
echo "--scan missing $DEV2--" >> $seqres.full
|
|
echo
|
|
echo "scan missing dev and write"
|
|
|
|
_run_btrfs_util_prog device scan $DEV2
|
|
|
|
echo >> $seqres.full
|
|
|
|
_run_btrfs_util_prog filesystem show -m ${SCRATCH_MNT}
|
|
_run_btrfs_util_prog filesystem df ${SCRATCH_MNT}
|
|
|
|
dd if=/dev/urandom of="$SCRATCH_MNT"/tf2 bs=$bs count=$COUNT \
|
|
>>$seqres.full 2>&1
|
|
CHECKPOINT2=`md5sum $SCRATCH_MNT/tf2`
|
|
echo $SCRATCH_MNT/tf2:$CHECKPOINT2 >> $seqres.full
|
|
}
|
|
|
|
balance_convert()
|
|
{
|
|
echo >> $seqres.full
|
|
echo "----- run balance -----" >> $seqres.full
|
|
echo
|
|
echo "run balance"
|
|
|
|
_run_btrfs_balance_start -dconvert=raid1 \
|
|
-mconvert=raid1 $SCRATCH_MNT >> $seqres.full
|
|
}
|
|
|
|
verify()
|
|
{
|
|
echo >> $seqres.full
|
|
echo "--mount reconstructed dev only and check md5sum--" >> $seqres.full
|
|
echo
|
|
echo "mount reconstructed dev only and check md5sum"
|
|
echo "unmount" >> $seqres.full
|
|
|
|
_scratch_unmount
|
|
_btrfs_forget_or_module_reload
|
|
_mount -o degraded $DEV2 $SCRATCH_MNT >>$seqres.full 2>&1
|
|
verify_checkpoint1=`md5sum $SCRATCH_MNT/tf1`
|
|
verify_checkpoint2=`md5sum $SCRATCH_MNT/tf2`
|
|
|
|
if [ "$verify_checkpoint1" != "$CHECKPOINT1" ]; then
|
|
echo "checkpoint1 on reappeared disk does not match after balance"
|
|
fi
|
|
|
|
if [ "$verify_checkpoint2" != "$CHECKPOINT2" ]; then
|
|
echo "checkpoint2 on reappeared disk does not match after balance"
|
|
fi
|
|
}
|
|
|
|
setup
|
|
degrade_mount_write
|
|
scan_missing_dev_and_write
|
|
balance_convert
|
|
verify
|
|
|
|
$UMOUNT_PROG $DEV2
|
|
_scratch_dev_pool_put
|
|
|
|
status=0
|
|
exit
|