Re: [PATCH v3] fstests: btrfs: add test for qgroup handle extent de-reference

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Mon, Jun 13, 2016 at 9:06 AM, Lu Fengqi <lufq.fnst@xxxxxxxxxxxxxx> wrote:
> At 06/13/2016 03:29 PM, Lu Fengqi wrote:
>>
>> At 06/13/2016 11:04 AM, Eryu Guan wrote:
>>>
>>> On Mon, Jun 13, 2016 at 10:10:50AM +0800, Lu Fengqi wrote:
>>>>
>>>> Test if qgroup can handle extent de-reference during reallocation.
>>>> "extent de-reference" means that reducing an extent's reference count
>>>> or freeing an extent.
>>>> Although current qgroup can handle it, we still need to prevent any
>>>> regression which may break current qgroup.
>>>>
>>>> Signed-off-by: Lu Fengqi <lufq.fnst@xxxxxxxxxxxxxx>
>>>> ---
>>>>  common/rc           |  4 +--
>>>>  tests/btrfs/028     | 98
>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>  tests/btrfs/028.out |  2 ++
>>>>  tests/btrfs/group   |  1 +
>>>>  4 files changed, 103 insertions(+), 2 deletions(-)
>>>>  create mode 100755 tests/btrfs/028
>>>>  create mode 100644 tests/btrfs/028.out
>>>>
>>>> diff --git a/common/rc b/common/rc
>>>> index 51092a0..650d198 100644
>>>> --- a/common/rc
>>>> +++ b/common/rc
>>>> @@ -3284,9 +3284,9 @@ _btrfs_get_profile_configs()
>>>>  # stress btrfs by running balance operation in a loop
>>>>  _btrfs_stress_balance()
>>>>  {
>>>> -    local btrfs_mnt=$1
>>>> +    local options=$@
>>>>      while true; do
>>>> -        $BTRFS_UTIL_PROG balance start $btrfs_mnt
>>>> +        $BTRFS_UTIL_PROG balance start $options
>>>>      done
>>>>  }
>>>>
>>>> diff --git a/tests/btrfs/028 b/tests/btrfs/028
>>>> new file mode 100755
>>>> index 0000000..8cea49a
>>>> --- /dev/null
>>>> +++ b/tests/btrfs/028
>>>> @@ -0,0 +1,98 @@
>>>> +#! /bin/bash
>>>> +# FS QA Test 028
>>>> +#
>>>> +# Test if qgroup can handle extent de-reference during reallocation.
>>>> +# "extent de-reference" means that reducing an extent's reference count
>>>> +# or freeing an extent.
>>>> +# Although current qgroup can handle it, we still need to prevent any
>>>> +# regression which may break current qgroup.
>>>> +#
>>>>
>>>> +#-----------------------------------------------------------------------
>>>>
>>>> +# Copyright (c) 2016 Fujitsu. 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-1301  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 15
>>>> +
>>>> +_cleanup()
>>>> +{
>>>> +    cd /
>>>> +    rm -f $tmp.*
>>>> +}
>>>> +
>>>> +# get standard environment, filters and checks
>>>> +. ./common/rc
>>>> +. ./common/filter
>>>> +
>>>> +# remove previous $seqres.full before test
>>>> +rm -f $seqres.full
>>>> +
>>>> +# real QA test starts here
>>>> +_supported_fs btrfs
>>>> +_supported_os Linux
>>>> +_require_scratch
>>>> +
>>>> +_scratch_mkfs
>>>> +_scratch_mount
>>>> +
>>>> +_run_btrfs_util_prog quota enable $SCRATCH_MNT
>>>> +_run_btrfs_util_prog quota rescan -w $SCRATCH_MNT
>>>> +
>>>> +# Increase the probability of generating de-refer extent, and decrease
>>>> +# other.
>>>> +args=`_scale_fsstress_args -z \
>>>> +    -f write=10 -f unlink=10 \
>>>> +    -f creat=10 -f fsync=10 \
>>>> +    -f fsync=10 -n 100000 -p 2 \
>>>> +    -d $SCRATCH_MNT/stress_dir`
>>>> +echo "Run fsstress $args" >>$seqres.full
>>>> +$FSSTRESS_PROG $args >/dev/null 2>&1 &
>>>> +fsstress_pid=$!
>>>> +
>>>> +echo "Start balance" >>$seqres.full
>>>> +_btrfs_stress_balance -d $SCRATCH_MNT >/dev/null 2>&1 &
>>>> +balance_pid=$!
>>>> +
>>>> +# 30s is enough to trigger bug
>>>> +sleep $((30*$TIME_FACTOR))
>>>> +kill $fsstress_pid $balance_pid
>>>> +wait
>>>> +
>>>> +# kill _btrfs_stress_balance can't end balance, so call btrfs
>>>> balance cancel
>>>> +# to cancel running or paused balance.
>>>> +$BTRFS_UTIL_PROG balance cancel $SCRATCH_MNT &> /dev/null
>>>> +
>>>> +_run_btrfs_util_prog filesystem sync $SCRATCH_MNT
>>>> +
>>>> +_scratch_unmount
>>>> +
>>>> +# generate a qgroup report and look for inconsistent groups
>>>> +$BTRFS_UTIL_PROG check --qgroup-report $SCRATCH_DEV 2>&1 | \
>>>> +            grep -q -E "Counts for qgroup.*are different"
>>>> +if [ $? -ne 0 ]; then
>>>> +    echo "Silence is golden"
>>>> +    # success, all done
>>>> +    status=0
>>>> +fi
>>>
>>>
>>> I'm testing with 4.7-rc1 kernel and btrfs-progs v4.4, this test fails,
>>> which means btrfs check finds inconsistent groups. But according to your
>>> commit log, current kernel should pass the test. So is the failure
>>> expected?
>>>
>>> Also, just grep for different qgroup counts and print the message out if
>>> grep finds the message, so it breaks golden image on error and we know
>>> something really goes wrong. Right now test fails just because of
>>> missing "Silence is golden", which is unclear why it fails:
>>>
>>>  @@ -1,2 +1 @@
>>>   QA output created by 028
>>>  -Silence is golden
>>>
>>> Do the following instead:
>>>
>>>     $BTRFS_UTIL_PROG check ... | grep -E "..."
>>>     echo "Silence is golden"
>>>     status=0
>>>     exit
>>>
>>> And we see this on failure:
>>>
>>>  @@ -1,2 +1,3 @@
>>>   QA output created by 028
>>>  +Counts for qgroup id: 5 are different
>>>   Silence is golden
>>>
>>> Thanks,
>>> Eryu
>>>
>>>> +
>>>> +exit
>>>> diff --git a/tests/btrfs/028.out b/tests/btrfs/028.out
>>>> new file mode 100644
>>>> index 0000000..2615f73
>>>> --- /dev/null
>>>> +++ b/tests/btrfs/028.out
>>>> @@ -0,0 +1,2 @@
>>>> +QA output created by 028
>>>> +Silence is golden
>>>> diff --git a/tests/btrfs/group b/tests/btrfs/group
>>>> index da0e27f..35ecf59 100644
>>>> --- a/tests/btrfs/group
>>>> +++ b/tests/btrfs/group
>>>> @@ -30,6 +30,7 @@
>>>>  025 auto quick send clone
>>>>  026 auto quick compress prealloc
>>>>  027 auto replace
>>>> +028 auto qgroup balance
>>>>  029 auto quick clone
>>>>  030 auto quick send
>>>>  031 auto quick subvol clone
>>>> --
>>>> 2.5.5
>>>>
>>>>
>>>>
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe fstests" in
>>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>>
>>>
>>>
>>
>> Excuse me, I tried several versions of the kernel (4.6-rc7+ / 4.7-rc1 /
>> 4.7-rc3), the test didn't fail. Can you provide me with more information
>> about your test environment?
>>
>>
> Sorry, this test fails after I perform it more times. It seems to be a bug
> of btrfs qgroup. We will continue to track this bug.

Which is already known and reported some time ago:

http://thread.gmane.org/gmane.comp.file-systems.btrfs/56687/focus=56824

It's another regression introduced in kernel 4.2 with the large
qgroups rewrite (data extents are not accounted anymore after
balance).
It's trivial to reproduce with:


#!/bin/bash -x

MNT="/mnt/sdi"
DEV="/dev/sdi"

mkfs.btrfs --nodesize=4096 -f $DEV
mount -t btrfs $DEV $MNT

# fill metadata space, create a tree with 1 node and 2 leaves
for ((i = 1; i <= 10; i++)); do
        mkdir $MNT/d$i
done
for ((i = 1; i <= 1; i++)); do
        xfs_io -f -c "pwrite -S 0xaa 0 8K" $MNT/f$i
done

btrfs fi sync $MNT
btrfs quota enable $MNT
btrfs quota rescan -w $MNT
btrfs qg show $MNT

umount $MNT
btrfsck $DEV

mount -t btrfs $DEV $MNT

time btrfs balance start -d $MNT

umount $MNT
btrfsck $DEV


Also, please, when you send a new version of a patch, add a changelog
describing what changed between versions. See [1] for an example.
I noticed you do this for all patches you send.

[1] https://btrfs.wiki.kernel.org/index.php/Developer%27s_FAQ#Repeated_submissions

>
>
> --
> Thanks,
> Lu
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe fstests" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Filipe David Manana,

"Reasonable men adapt themselves to the world.
 Unreasonable men adapt the world to themselves.
 That's why all progress depends on unreasonable men."
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux