All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liu Bo <bo.li.liu@oracle.com>
To: Filipe Manana <fdmanana@gmail.com>
Cc: fstests@vger.kernel.org,
	"linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH] fstests: regression test for btrfs dio read repair
Date: Wed, 12 Apr 2017 13:28:57 -0700	[thread overview]
Message-ID: <20170412202857.GA10431@lim.localdomain> (raw)
In-Reply-To: <CAL3q7H741v+JatRj_YuVNcvK-1DupuuP5pZUc8gkSAZ8NVGO0A@mail.gmail.com>

On Wed, Apr 12, 2017 at 10:42:47AM +0100, Filipe Manana wrote:
> On Wed, Apr 12, 2017 at 2:27 AM, Liu Bo <bo.li.liu@oracle.com> wrote:
> > This case tests whether dio read can repair the bad copy if we have
> > a good copy.
> 
> Regardless of being a test we should have always had (thanks for
> this!), it would be useful to mention we had a regression (as the test
> description in the btrfs/140 file says) and which patch fixed it (and
> possibly which kernel version or patch/commit introduced the
> regression).
>

Sure, thanks for the review.

> Just a comment/question below.
> 
> >
> > Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
> > ---
> >  tests/btrfs/140     | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/btrfs/140.out |  39 ++++++++++++++
> >  tests/btrfs/group   |   1 +
> >  3 files changed, 192 insertions(+)
> >  create mode 100755 tests/btrfs/140
> >  create mode 100644 tests/btrfs/140.out
> >
> > diff --git a/tests/btrfs/140 b/tests/btrfs/140
> > new file mode 100755
> > index 0000000..db56123
> > --- /dev/null
> > +++ b/tests/btrfs/140
> > @@ -0,0 +1,152 @@
> > +#! /bin/bash
> > +# FS QA Test 140
> > +#
> > +# Regression test for btrfs DIO read's repair during read.
> > +#
> > +#-----------------------------------------------------------------------
> > +# Copyright (c) 2017 Liu Bo.  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
> > +
> > +# Modify as appropriate.
> > +_supported_fs btrfs
> > +_supported_os Linux
> > +_require_scratch_dev_pool 2
> > +_require_command "$BTRFS_MAP_LOGICAL_PROG" btrfs-map-logical
> > +_require_command "$FILEFRAG_PROG" filefrag
> > +_require_odirect
> > +
> > +# helpe to convert 'file offset' to btrfs logical offset
> > +FILEFRAG_FILTER='
> > +       if (/blocks? of (\d+) bytes/) {
> > +               $blocksize = $1;
> > +               next
> > +       }
> > +       ($ext, $logical, $physical, $length) =
> > +               (/^\s*(\d+):\s+(\d+)..\s+\d+:\s+(\d+)..\s+\d+:\s+(\d+):/)
> > +       or next;
> > +       ($flags) = /.*:\s*(\S*)$/;
> > +       print $physical * $blocksize, "#",
> > +             $length * $blocksize, "#",
> > +             $logical * $blocksize, "#",
> > +             $flags, " "'
> > +
> > +# this makes filefrag output script readable by using a perl helper.
> > +# output is one extent per line, with three numbers separated by '#'
> > +# the numbers are: physical, length, logical (all in bytes)
> > +# sample output: "1234#10#5678" -> physical 1234, length 10, logical 5678
> > +_filter_extents()
> > +{
> > +       tee -a $seqres.full | $PERL_PROG -ne "$FILEFRAG_FILTER"
> > +}
> > +
> > +_check_file_extents()
> > +{
> > +       cmd="filefrag -v $1"
> > +       echo "# $cmd" >> $seqres.full
> > +       out=`$cmd | _filter_extents`
> > +       if [ -z "$out" ]; then
> > +               return 1
> > +       fi
> > +       echo "after filter: $out" >> $seqres.full
> > +       echo $out
> > +       return 0
> > +}
> > +
> > +_check_repair()
> > +{
> > +       filter=${1:-cat}
> > +       dmesg | tac | sed -ne "0,\#run fstests $seqnum at $date_time#p" | tac | $filter | grep -q -e "csum failed"
> > +       if [ $? -eq 0 ]; then
> > +               echo 1
> > +       else
> > +               echo 0
> > +       fi
> > +}
> > +
> > +_scratch_dev_pool_get 2
> > +# step 1, create a raid1 btrfs which contains one 128k file.
> > +echo "step 1......mkfs.btrfs" >>$seqres.full
> > +
> > +mkfs_opts="-d raid1"
> > +_scratch_pool_mkfs $mkfs_opts >>$seqres.full 2>&1
> > +
> > +_scratch_mount -o nospace_cache
> 
> Why do we need to mount without space cache?
> I don't see why nor I think it's obvious. A comment in the test
> mentioning why would be useful for everyone.
>

Thanks for spotting it, we can safely get rid of it, it's a leftover when I
convert it to a fstests case.

Thanks,

-liubo
> 
> > +
> > +$XFS_IO_PROG -f -d -c "pwrite -S 0xaa -b 128K 0 128K" "$SCRATCH_MNT/foobar" | _filter_xfs_io
> > +
> > +sync
> > +
> > +# step 2, corrupt the first 64k of one copy (on SCRATCH_DEV which is the first
> > +# one in $SCRATCH_DEV_POOL
> > +echo "step 2......corrupt file extent" >>$seqres.full
> > +
> > +extents=`_check_file_extents $SCRATCH_MNT/foobar`
> > +logical_in_btrfs=`echo ${extents} | cut -d '#' -f 1`
> > +physical_on_scratch=`$BTRFS_MAP_LOGICAL_PROG -l ${logical_in_btrfs} $SCRATCH_DEV | grep "$SCRATCH_DEV" | awk '{print $6}'`
> > +
> > +_scratch_unmount
> > +$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV | _filter_xfs_io
> > +
> > +_scratch_mount -o nospace_cache
> > +
> > +# step 3, 128k dio read (this read can repair bad copy)
> > +echo "step 3......repair the bad copy" >>$seqres.full
> > +
> > +# since raid1 consists of two copies, and the following read may read the good
> > +# copy directly, so lets loop 10 times here and discard output that dio reads
> > +# give
> > +for i in `seq 1 10`; do
> > +       $XFS_IO_PROG -d -c "pread -b 128K 0 128K" "$SCRATCH_MNT/foobar" > /dev/null
> > +       repair=`_check_repair`
> > +       if [ $repair -eq 1 ]; then
> > +               break
> > +       fi
> > +done
> > +
> > +_scratch_unmount
> > +
> > +# check if the repair works
> > +$XFS_IO_PROG -d -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV | _filter_xfs_io
> > +
> > +_scratch_dev_pool_put
> > +# success, all done
> > +status=0
> > +exit
> > diff --git a/tests/btrfs/140.out b/tests/btrfs/140.out
> > new file mode 100644
> > index 0000000..d8e3856
> > --- /dev/null
> > +++ b/tests/btrfs/140.out
> > @@ -0,0 +1,39 @@
> > +QA output created by 140
> > +wrote 131072/131072 bytes at offset 0
> > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > +wrote 65536/65536 bytes at offset 244056064
> > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > +0e8c0000:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0010:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0020:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0030:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0040:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0050:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0060:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0070:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0080:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0090:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c00a0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c00b0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c00c0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c00d0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c00e0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c00f0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0100:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0110:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0120:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0130:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0140:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0150:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0160:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0170:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0180:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c0190:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c01a0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c01b0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c01c0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c01d0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c01e0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +0e8c01f0:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> > +read 512/512 bytes at offset 244056064
> > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> > diff --git a/tests/btrfs/group b/tests/btrfs/group
> > index 9d4b80b..1cb9c98 100644
> > --- a/tests/btrfs/group
> > +++ b/tests/btrfs/group
> > @@ -141,3 +141,4 @@
> >  137 auto quick send
> >  138 auto compress
> >  139 auto qgroup
> > +140 auto quick
> > --
> > 2.5.0
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
> 
> -- 
> Filipe David Manana,
> 
> “Whether you think you can, or you think you can't — you're right.”

      reply	other threads:[~2017-04-12 20:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-12  1:27 [PATCH] fstests: regression test for btrfs dio read repair Liu Bo
2017-04-12  9:42 ` Filipe Manana
2017-04-12 20:28   ` Liu Bo [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170412202857.GA10431@lim.localdomain \
    --to=bo.li.liu@oracle.com \
    --cc=fdmanana@gmail.com \
    --cc=fstests@vger.kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.