linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Josef Bacik <jbacik@fb.com>
To: Filipe David Borba Manana <fdmanana@gmail.com>, xfs@oss.sgi.com
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v2] xfstests: add test for btrfs incremental send infinite loop issue
Date: Thu, 23 Jan 2014 14:17:58 -0500	[thread overview]
Message-ID: <52E16AE6.7010202@fb.com> (raw)
In-Reply-To: <1390385119-6998-1-git-send-email-fdmanana@gmail.com>


On 01/22/2014 05:05 AM, Filipe David Borba Manana wrote:
> Regression test for btrfs' incremental send feature:
>
> 1) Create several nested directories;
>
> 2) Create a read only snapshot;
>
> 3) Change the parentship of some of the deepest directories in a reverse
>     way, so that parents become children and children become parents;
>
> 4) Create another read only snapshot and use it for an incremental send
>     relative to the first snapshot.
>
> At step 4 btrfs' send entered an infinite loop, increasing the memory it
> used while building path strings until a krealloc was unable to allocate
> more memory, which caused a warning dump in dmesg.
>
> The following linux kernel patch fixes this issue.
>
>     Btrfs: fix infinite path build loops in incremental send
>     (https://patchwork.kernel.org/patch/3522361/)
>
> Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
> ---
>
> V2: Updated test to trigger one more code path in the corresponding
>      btrfs linux kernel patch that fixes this issue.
>
>   tests/btrfs/030     |  144 +++++++++++++++++++++++++++++++++++++++++++++++++++
>   tests/btrfs/030.out |    9 ++++
>   tests/btrfs/group   |    1 +
>   3 files changed, 154 insertions(+)
>   create mode 100755 tests/btrfs/030
>   create mode 100644 tests/btrfs/030.out
>
> diff --git a/tests/btrfs/030 b/tests/btrfs/030
> new file mode 100755
> index 0000000..5e1b4fc
> --- /dev/null
> +++ b/tests/btrfs/030
> @@ -0,0 +1,144 @@
> +#! /bin/bash
> +# FS QA Test No. btrfs/030
> +#
> +# Regression test for btrfs' incremental send feature:
> +#
> +# 1) Create several nested directories;
> +# 2) Create a read only snapshot;
> +# 3) Change the parentship of some of the deepest directories in a reverse
> +#    way, so that parents become children and children become parents;
> +# 4) Create another read only snapshot and use it for an incremental send
> +#    relative to the first snapshot.
> +#
> +# At step 4 btrfs' send entered an infinite loop, increasing the memory it
> +# used while building path strings until a krealloc was unable to allocate
> +# more memory, which caused a warning dump in dmesg.
> +#
> +#-----------------------------------------------------------------------
> +# 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
> +
> +
> +mkdir -p $SCRATCH_MNT/a/b/c
> +echo "hello" > $SCRATCH_MNT/a/b/c/file.txt
> +mkdir $SCRATCH_MNT/a/b/c/d
> +mkdir $SCRATCH_MNT/a/b/c2
> +mkdir $SCRATCH_MNT/a/b/www
> +mkdir -p $SCRATCH_MNT/a/b/c3/x/y
> +
> +# Directory tree looks like:
> +#
> +# .                         (ino 256)
> +# |-- a/                    (ino 257)
> +#     |-- b/                (ino 258)
> +#         |-- c/            (ino 259)
> +#         |   |-- file.txt  (ino 260)
> +#         |   |-- d/        (ino 261)
> +#         |
> +#         |-- c2/           (ino 262)
> +#         |-- www/          (ino 263)
> +#         |
> +#         |-- c3/           (ino 264)
> +#             |-- x/        (ino 265)
> +#                 |-- y/    (ino 266)
> +
> +$BTRFS_UTIL_PROG subvol snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 | \
> +    _filter_scratch
> +
> +echo " world" >> $SCRATCH_MNT/a/b/c/file.txt
> +mv $SCRATCH_MNT/a/b/c/d $SCRATCH_MNT/a/b/c2/d2
> +mv $SCRATCH_MNT/a/b/c $SCRATCH_MNT/a/b/c2/d2/cc
> +mv $SCRATCH_MNT/a/b/c3/x/y $SCRATCH_MNT/a/b/c2/y2
> +mv $SCRATCH_MNT/a/b/c3/x $SCRATCH_MNT/a/b/c2/y2/x2
> +mv $SCRATCH_MNT/a/b/c3 $SCRATCH_MNT/a/b/c2/y2/x2/Z
> +mv $SCRATCH_MNT/a/b/www $SCRATCH_MNT/a/b/c2/y2/x2/WWW
> +ln $SCRATCH_MNT/a/b/c2/d2/cc/file.txt $SCRATCH_MNT/a/b/c2/y2/x2/Z/file_link.txt
> +mv $SCRATCH_MNT/a/b/c2/d2/cc/file.txt $SCRATCH_MNT/a/b/c2/y2/x2
> +
> +# Directory tree now looks like:
> +#
> +# .                                         (ino 256)
> +# |-- a/                                    (ino 257)
> +#     |-- b/                                (ino 258)
> +#         |-- c2/                           (ino 262)
> +#             |-- d2/                       (ino 261)
> +#             |   |-- cc/                   (ino 259)
> +#             |        |-- file.txt         (ino 260)
> +#             |-- y2/                       (ino 266)
> +#                 |-- x2/                   (ino 265)
> +#                     |-- WWW/              (ino 263)
> +#                     |-- Z/                (ino 264)
> +#                         |-- file_link.txt
> +
> +$BTRFS_UTIL_PROG subvol snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 | \
> +    _filter_scratch
> +
> +$FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1
> +$FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \
> +    $SCRATCH_MNT/mysnap2
> +
> +$BTRFS_UTIL_PROG send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap 2>&1 | _filter_scratch
> +$BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \
> +    -f $tmp/2.snap 2>&1 | _filter_scratch
> +
> +_scratch_unmount
> +_check_btrfs_filesystem $SCRATCH_DEV
> +_scratch_mkfs >/dev/null 2>&1
> +_scratch_mount
> +
> +$BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/1.snap
> +$FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1
> +$BTRFS_UTIL_PROG receive $SCRATCH_MNT -f $tmp/2.snap
> +$FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2
> +

You should do || _fail for the fssum stuff, and maybe redirect the 
output to $seqres.full.

> +_scratch_unmount
> +_check_btrfs_filesystem $SCRATCH_DEV
> +
> +status=0
> +exit
> diff --git a/tests/btrfs/030.out b/tests/btrfs/030.out
> new file mode 100644
> index 0000000..2999f8c
> --- /dev/null
> +++ b/tests/btrfs/030.out
> @@ -0,0 +1,9 @@
> +QA output created by 030
> +Create a readonly snapshot of 'SCRATCH_MNT' in 'SCRATCH_MNT/mysnap1'
> +Create a readonly snapshot of 'SCRATCH_MNT' in 'SCRATCH_MNT/mysnap2'
> +At subvol SCRATCH_MNT/mysnap1
> +At subvol SCRATCH_MNT/mysnap2
> +At subvol mysnap1
> +OK
> +At snapshot mysnap2
> +OK

So this depends on the output of btrfs send not changing ever, which 
historically is not a good assumption to make.  It would be better if 
you do like the other send tests and just test for failure like the 
other send tests do.  Thanks,

Josef

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2014-01-23 19:18 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-21 23:56 [PATCH] xfstests: add test for btrfs incremental send infinite loop issue Filipe David Borba Manana
2014-01-22 10:05 ` [PATCH v2] " Filipe David Borba Manana
2014-01-23 19:17   ` Josef Bacik [this message]
2014-01-23 23:38 ` [PATCH v3] " Filipe David Borba Manana
2014-01-23 23:48   ` Josef Bacik

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=52E16AE6.7010202@fb.com \
    --to=jbacik@fb.com \
    --cc=fdmanana@gmail.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=xfs@oss.sgi.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).