xfs
[Top] [All Lists]

Re: [PATCH v2] xfstests: add regression test for btrfs incremental send

To: Dave Chinner <david@xxxxxxxxxxxxx>
Subject: Re: [PATCH v2] xfstests: add regression test for btrfs incremental send
From: Filipe David Manana <fdmanana@xxxxxxxxx>
Date: Mon, 17 Feb 2014 01:40:04 +0000
Cc: "xfs@xxxxxxxxxxx" <xfs@xxxxxxxxxxx>, "linux-btrfs@xxxxxxxxxxxxxxx" <linux-btrfs@xxxxxxxxxxxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=zMeCvcHjPb3w5d6a8x9J8jQzult8JHhTWn4id5iaxJs=; b=nhc7WZsImP3PoggR+G6TlgTdknatDtuUNE0ylqfOMSSgSj4ke3Y3coddQ5CKi8bBT1 VcXiwuBzfH7cAnhKRPD1Fg3wPRlsMwO+dgJf754RFO6qwE6dCERm5lWj9zur8LvO/JHU utulAWDq+ouRO0FF4Nk1jOfJd2i4p5O6zZAbRmSjEiNbG72L7kns1EsQPvigpLnweMe2 OByDigdZJ4ZsIAO1DQo0XHz73GY4WnSAyDK8naL/W0YljFsqkJ8Woo78kyk+lrVSmc/5 L/ha6ytfUppdGWnfN7b1Rn7W0S6m42Q6cZW8AESvk3Lv/ToxBykmhL9gkKaoxyz6OQcc bxQw==
In-reply-to: <20140217011714.GZ13997@dastard>
References: <1392408522-764-1-git-send-email-fdmanana@xxxxxxxxx> <1392478573-4513-1-git-send-email-fdmanana@xxxxxxxxx> <20140216230851.GX13647@dastard> <CAL3q7H46_AHDtACuZunRJgSymejgr73NVZ-TWNuBuD6z3j9KXg@xxxxxxxxxxxxxx> <20140217011714.GZ13997@dastard>
Reply-to: fdmanana@xxxxxxxxx
On Mon, Feb 17, 2014 at 1:17 AM, Dave Chinner <david@xxxxxxxxxxxxx> wrote:
> On Sun, Feb 16, 2014 at 11:43:17PM +0000, Filipe David Manana wrote:
>> On Sun, Feb 16, 2014 at 11:08 PM, Dave Chinner <david@xxxxxxxxxxxxx> wrote:
>> > On Sat, Feb 15, 2014 at 03:36:13PM +0000, Filipe David Borba Manana wrote:
>> >> Test for a btrfs incremental send issue where we end up sending a
>> >> wrong section of data from a file extent if the corresponding file
>> >> extent is compressed and the respective file extent item has a non
>> >> zero data offset.
>> >>
>> >> Fixed by the following linux kernel btrfs patch:
>> >>
>> >>    Btrfs: use right clone root offset for compressed extents
>> >>
>> >> Signed-off-by: Filipe David Borba Manana <fdmanana@xxxxxxxxx>
>> >> ---
>> >>
>> >> V2: Made the test more reliable. Now it doesn't depend anymore of btrfs'
>> >>     hole punch implementation leaving hole file extent items when we punch
>> >>     beyond the file's current size.
>> >>
>> >>  tests/btrfs/040     |  115 
>> >> +++++++++++++++++++++++++++++++++++++++++++++++++++
>> >>  tests/btrfs/040.out |    1 +
>> >>  tests/btrfs/group   |    1 +
>> >>  3 files changed, 117 insertions(+)
>> >>  create mode 100755 tests/btrfs/040
>> >>  create mode 100644 tests/btrfs/040.out
>> >>
>> >> diff --git a/tests/btrfs/040 b/tests/btrfs/040
>> >> new file mode 100755
>> >> index 0000000..d6b37bf
>> >> --- /dev/null
>> >> +++ b/tests/btrfs/040
>> >> @@ -0,0 +1,115 @@
>> >> +#! /bin/bash
>> >> +# FS QA Test No. btrfs/040
>> >> +#
>> >> +# Test for a btrfs incremental send issue where we end up sending a
>> >> +# wrong section of data from a file extent if the corresponding file
>> >> +# extent is compressed and the respective file extent item has a non
>> >> +# zero data offset.
>> >> +#
>> >> +# Fixed by the following linux kernel btrfs patch:
>> >> +#
>> >> +#   Btrfs: use right clone root offset for compressed extents
>> >> +#
>> >> +#-----------------------------------------------------------------------
>> >> +# Copyright (c) 2014 Filipe Manana.  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=`mktemp -d`
>> >> +status=1     # failure is the default!
>> >> +trap "_cleanup; exit \$status" 0 1 2 3 15
>> >> +
>> >> +_cleanup()
>> >> +{
>> >> +    rm -fr $tmp
>> >> +}
>> >> +
>> >> +# get standard environment, filters and checks
>> >> +. ./common/rc
>> >> +. ./common/filter
>> >> +
>> >> +# real QA test starts here
>> >> +_supported_fs btrfs
>> >> +_supported_os Linux
>> >> +_require_scratch
>> >> +_need_to_be_root
>> >> +
>> >> +FSSUM_PROG=$here/src/fssum
>> >> +[ -x $FSSUM_PROG ] || _notrun "fssum not built"
>> >> +
>> >> +rm -f $seqres.full
>> >> +
>> >> +_scratch_mkfs >/dev/null 2>&1
>> >> +_scratch_mount "-o compress-force=lzo"
>> >> +
>> >> +run_check $XFS_IO_PROG -f -c "truncate 118811" $SCRATCH_MNT/foo
>> >> +run_check $XFS_IO_PROG -c "pwrite -S 0x0d -b 39987 92267 39987" \
>> >> +     $SCRATCH_MNT/foo
>> >
>> > Ugh. filter the output, don't use run_check.
>> >
>> > $XFS_IO_PROG -f -c "truncate 118811" $SCRATCH_MNT/foo
>> > $XFS_IO_PROG -c "pwrite -S 0x0d -b 39987 92267 39987" \
>> >         $SCRATCH_MNT/foo | _filter_xfs_io
>> >
>> > If something fails, we still want the test to continue running, even
>> > if all it does is exercise error handling paths. run_check simply
>> > terminates the test at the first failure.
>>
>> What's the point of continuing? The test will fail anyway, all of the
>> xfs_io calls are necessary to trigger the bug.
>
> Users don't stop doing doing stuff on a filesystem when a single
> failure occurs, so why should the tests? If you stop the moment a
> single failure occurs then you aren't ever going to stress the error
> handling paths, are you?
>
>> > _run_btrfs_util_prog()
>> > {
>> >         run_check $BTRFS_UTIL_PROG $*
>> > }
>> >
>> > would be a good start because it gets that run_check pattern out of
>> > the main test scripts and hence out of the heads of test writers.
>>
>> Well, will get rid of those run_check calls, but that will imply
>> adding some | _filter_scratch in many places. So shortening lines is
>> not a great argument :)
>
> I'm not talking about shortening lines here. I'm talking about the
> correct principles and conceptsi being in the forefront of a test
> writer's mind. Having the concept of "need to filter the output" in
> the head of test writers is *exactly* the right mindset to have.
>
> Indeed, if you have a block of code that needs common filtering,
> that's easy to do:
>
> do_test()
> {
>         # put test in function
> }
>
> do_test | _filter_scratch
>
> Will apply that filter to the entire output of the test, and so
> you don't need it on every command.
>
> Remember - an xfstest is not a "pass/fail" test. It's a "run this
> set of commands, and then check the entire output matches the known
> good output" test. i.e. we are testing the entire set of commands as
> a whole - we are not testing each individual command that is run.
> It's a very different principle to the "test every command that can
> fail" method of writing tests.
>
> _fail should only be used if the test cannot possibly be continued
> (e.g. scratch filesystem corrupted and cannot be mounted).  If one
> of the early commands fails, then that's fine - the test will fail -
> but we still want to run the other commands if we can so as to get
> the best test coverage we can get even on failed tests.

Ok, thanks for the very detailed explanation, very helpful :)


>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@xxxxxxxxxxxxx



-- 
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."

<Prev in Thread] Current Thread [Next in Thread>