btrfs: make all btrfs tests that exercise balance use _run_btrfs_balance_start()
authorFilipe Manana <fdmanana@suse.com>
Tue, 14 Apr 2020 16:22:42 +0000 (17:22 +0100)
committerEryu Guan <guaneryu@gmail.com>
Sun, 19 Apr 2020 16:40:59 +0000 (00:40 +0800)
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>
15 files changed:
common/btrfs
tests/btrfs/003
tests/btrfs/013
tests/btrfs/014
tests/btrfs/021
tests/btrfs/102
tests/btrfs/123
tests/btrfs/125
tests/btrfs/154
tests/btrfs/156
tests/btrfs/181
tests/btrfs/182
tests/btrfs/187
tests/btrfs/190
tests/btrfs/195

index b43932df22aee6ab7d4d7abbe6b3448a9a1ac36e..6d452d4df75189d6ac2e7efc4b8662e542f121e6 100644 (file)
@@ -245,7 +245,7 @@ _btrfs_stress_balance()
 {
        local options=$@
        while true; do
-               $BTRFS_UTIL_PROG balance start $options
+               _run_btrfs_balance_start $options >> $seqres.full
        done
 }
 
index c72c34290ff0e62209581ee84e7522bbffa0ffd0..9ce9d9462ee7b7f3b5b35017da7260aa94221274 100755 (executable)
@@ -113,7 +113,7 @@ _test_add()
                        _fail "wipefs failed"
                $BTRFS_UTIL_PROG device add ${devs[$i]} $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "device add failed"
        done
-       $BTRFS_UTIL_PROG filesystem balance $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "balance failed"
+       _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
        _scratch_unmount
 }
 
@@ -159,7 +159,7 @@ _test_replace()
        # in some system balance fails if there is no delay (a bug)
        # putting sleep 10 to work around as of now
        # sleep 10
-       $BTRFS_UTIL_PROG filesystem balance $SCRATCH_MNT >> $seqres.full 2>&1 || _fail "dev balance failed"
+       _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
 
        # cleaup. add the removed disk
        _scratch_unmount
index eadaf199c98c88480e19c8e6ac00fe4b66ded397..a795119d9d028ce1d199411c269e7a1a38ecb4e3 100755 (executable)
@@ -56,8 +56,7 @@ _check_csum_error()
 }
 $XFS_IO_PROG -f -c "falloc 0 1M" -c "pwrite 16k 8k" -c "fsync" \
        $SCRATCH_MNT/foo > $seqres.full 2>&1
-$BTRFS_UTIL_PROG filesystem balance $SCRATCH_MNT >> $seqres.full 2>&1 || \
-       _fail "balance failed"
+_run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
 _scratch_unmount
 _scratch_mount
 $XFS_IO_PROG -c "pread 0 1M" $SCRATCH_MNT/foo >> $seqres.full 2>&1 || \
index a8da6c4d041dd93bf71611f3efdbb98349eed09a..9f637fe83262dd6e1f1bac5bd74aea99f7bb6086 100755 (executable)
@@ -27,7 +27,7 @@ _balance()
 {
        for i in $(seq 20)
        do
-               $BTRFS_UTIL_PROG balance start $SCRATCH_MNT >/dev/null
+               _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
        done
 }
 
index d5ba4b66075aaf07f88e943804ebee8f7d5228de..341b6a2bbd925e1285012772493ad35dca4face0 100755 (executable)
@@ -31,7 +31,7 @@ _cleanup()
 # real QA test starts here
 run_test()
 {
-       $BTRFS_UTIL_PROG balance start $SCRATCH_MNT >> $seqres.full &
+       _run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full &
 
        sleep 0.5
 
index ed50453d558b51d44e467843eb12011affb63488..de4d1051b5c5ea4a18ba81325c28ac105f4a7533 100755 (executable)
@@ -47,7 +47,7 @@ _require_fs_space $SCRATCH_MNT $((2 * 1024 * 1024))
 # mkfs created. We could also wait for the background kthread to automatically
 # delete the unused block group, but we do not have a way to make it run and
 # wait for it to complete, so just do a balance instead of some unreliable sleep
-_run_btrfs_util_prog balance start -dusage=0 $SCRATCH_MNT
+_run_btrfs_balance_start -dusage=0 $SCRATCH_MNT >> $seqres.full
 
 # Now unmount the filesystem, mount it again (either with or with space caches
 # enabled, it does not matter to trigger the problem) and attempt to create a
index 03b004377d80e38f86bf110c66f85400d2f55680..65177159337acb56356a01693e74dd0f1bf42253 100755 (executable)
@@ -59,7 +59,7 @@ _run_btrfs_util_prog quota enable $SCRATCH_MNT
 _run_btrfs_util_prog quota rescan -w $SCRATCH_MNT
 
 # now balance data block groups to corrupt qgroup
-_run_btrfs_util_prog balance start -d $SCRATCH_MNT
+_run_btrfs_balance_start -d $SCRATCH_MNT >> $seqres.full
 
 _scratch_unmount
 # qgroup will be check at _check_scratch_fs() by fstest
index e1edccddd7d4b189d3fec529ee9dea544388aeab..63327d05e42abe7e44a6515828324b2f758ad450 100755 (executable)
@@ -123,7 +123,7 @@ _run_btrfs_util_prog device scan
 _scratch_mount >> $seqres.full 2>&1
 
 echo >> $seqres.full
-_run_btrfs_util_prog balance start ${SCRATCH_MNT}
+_run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
 
 _run_btrfs_util_prog filesystem show
 _run_btrfs_util_prog filesystem df ${SCRATCH_MNT}
index cbf65a42919dd6c2f789720668bd12d291fdece3..321bbee9909915237f772f10ea0f61012c63b601 100755 (executable)
@@ -129,8 +129,8 @@ balance_convert()
        echo
        echo "run balance"
 
-       _run_btrfs_util_prog balance start --full-balance -dconvert=raid1 \
-                               -mconvert=raid1 ${SCRATCH_MNT}
+       _run_btrfs_balance_start -dconvert=raid1 \
+                                -mconvert=raid1 $SCRATCH_MNT >> $seqres.full
 }
 
 verify()
index 9a97308b150312c78276389bcaeb255259f601a2..cd488e54884ffc82e874f255dceb8158a52c6f7e 100755 (executable)
@@ -70,14 +70,14 @@ sync
 # Now we have take at least 50% of the filesystem, relocate all chunks twice
 # so all chunks will start after 1G in logical space.
 # (Btrfs chunk allocation will not rewind to reuse lower space)
-_run_btrfs_util_prog balance start --full-balance "$SCRATCH_MNT"
+_run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
 
 # To avoid possible false ENOSPC alert on v4.15-rc1, seems to be a
 # reserved space related bug (maybe related to outstanding space rework?),
 # but that's another story.
 sync
 
-_run_btrfs_util_prog balance start --full-balance "$SCRATCH_MNT"
+_run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full
 
 # Now remove half of the files to make some holes for later trim.
 # While still keep the chunk space fragmented, so no chunk will be freed
index 1302eca90d95b7c5212d88ba73445fc2a520cf3f..f029cc35b4293a68486e35efe711ff7b644d7f05 100755 (executable)
@@ -68,7 +68,7 @@ sync
 
 before_gen=$(get_super_gen)
 
-$BTRFS_UTIL_PROG balance start -m "$SCRATCH_MNT" > /dev/null
+_run_btrfs_balance_start -m $SCRATCH_MNT >> $seqres.full
 
 after_gen=$(get_super_gen)
 
index 19b4ad8163e449cf57a4a5a5fb5f282f769524fa..650ba9f15377d89af8f91d76d8f0d7a3c68dcacc 100755 (executable)
@@ -53,7 +53,7 @@ for ((i = 0; i < $nr_files; i++)) do
        _pwrite_byte 0xcd 0 1K "$SCRATCH_MNT/subvol/file_$i" > /dev/null
 done
 
-$BTRFS_UTIL_PROG balance start -m "$SCRATCH_MNT" > /dev/null
+_run_btrfs_balance_start -m $SCRATCH_MNT >> $seqres.full
 
 # success, all done
 echo "Silence is golden"
index a604690a41b2bfe35bd04cbb3b149cb703488f35..428b328a2b402fbf09e482633372b84dc64767ca 100755 (executable)
@@ -84,7 +84,7 @@ balance_loop()
                # easier to hit problems (crashes and errors) in send.
                # Ignore errors from balance. We just want to test for crashes
                # and deadlocks.
-               $BTRFS_UTIL_PROG balance start -f -m $SCRATCH_MNT &> /dev/null
+               _run_btrfs_balance_start -f -m $SCRATCH_MNT &> /dev/null
                sleep $((RANDOM % 3))
        done
 }
index 7d3d300737c2d6c038ef60a7d3173acbf42ca7ef..f9cf159c19668665eba413299d4aa9d6965bb649 100755 (executable)
@@ -59,7 +59,8 @@ sync
 
 # Balance metadata so we will have at least one transaction committed with
 # valid reloc tree, and hopefully another commit with orphan reloc tree.
-$BTRFS_UTIL_PROG balance start -f -m $SCRATCH_MNT >> $seqres.full
+_run_btrfs_balance_start -f -m $SCRATCH_MNT >> $seqres.full
+
 _log_writes_unmount
 _log_writes_remove
 
index e40edb9527b51405db894700f651a9d777422440..944e048b17749490d7d9c3a2a3d27b906b633cf7 100755 (executable)
@@ -64,7 +64,7 @@ run_testcase() {
        # Create random filesystem with 20k write ops
        $FSSTRESS_PROG -d $SCRATCH_MNT -w -n 10000 $FSSTRESS_AVOID >>$seqres.full 2>&1
 
-       $BTRFS_UTIL_PROG balance start -f -dconvert=$dst_type $SCRATCH_MNT >> $seqres.full 2>&1
+       _run_btrfs_balance_start -f -dconvert=$dst_type $SCRATCH_MNT >> $seqres.full
        [ $? -eq 0 ] || echo "$1: Failed convert"
 
        $BTRFS_UTIL_PROG scrub start -B $SCRATCH_MNT >>$seqres.full 2>&1