btrfs: punch holes and prealloc extents with send

This test verifies that after an incremental btrfs send the
replicated file has the same exact hole and data structure as in
the origin filesystem. This didn't use to be the case before the
send stream version 2 - holes were sent as write operations of 0
valued bytes instead of punching holes with the fallocate system
call, and pre-allocated extents were sent as well as write
operations of 0 valued bytes instead of intructions for the
receiver to use the fallocate system call.

It also checks that prealloc extents that lie beyond the file's
size are replicated by an incremental send.

Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Filipe David Borba Manana
2014-04-22 10:45:53 +10:00
committed by Dave Chinner
parent cd444c6591
commit f81be18fa8
4 changed files with 167 additions and 0 deletions
+9
View File
@@ -2262,6 +2262,15 @@ _run_btrfs_util_prog()
run_check $BTRFS_UTIL_PROG $*
}
_require_btrfs_send_stream_version()
{
$BTRFS_UTIL_PROG send 2>&1 | \
grep '^[ \t]*\-\-stream\-version <version>' > /dev/null 2>&1
if [ $? -ne 0 ]; then
_notrun "Missing btrfs-progs send --stream-version command line option, skipped this test"
fi
}
init_rc()
{
if [ "$iam" == new ]
+122
View File
@@ -0,0 +1,122 @@
#! /bin/bash
# FS QA Test No. btrfs/047
#
# Verify that after an incremental btrfs send the replicated file has
# the same exact hole and data structure as in the origin filesystem.
# This didn't use to be the case before the send stream version 2 -
# holes were sent as write operations of 0 valued bytes instead of punching
# holes with the fallocate system call, and pre-allocated extents were sent
# as well as write operations of 0 valued bytes instead of intructions for
# the receiver to use the fallocate system call. Also check that prealloc
# extents that lie beyond the file's size are replicated by an incremental
# send.
#
# More specifically, this structure preserving guarantee was added by the
# following linux kernel commits:
#
# Btrfs: send, use fallocate command to punch holes
# Btrfs: send, use fallocate command to allocate 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"
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
rm -fr $send_files_dir
rm -fr $tmp
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/punch
# real QA test starts here
_supported_fs btrfs
_supported_os Linux
_require_scratch
_require_fssum
_require_xfs_io_fiemap
_require_btrfs_send_stream_version
_need_to_be_root
send_files_dir=$TEST_DIR/btrfs-test-$seq
rm -f $seqres.full
rm -fr $send_files_dir
mkdir $send_files_dir
_scratch_mkfs >/dev/null 2>&1
_scratch_mount
$XFS_IO_PROG -f -c "pwrite -S 0x01 -b 300000 0 300000" $SCRATCH_MNT/foo \
| _filter_xfs_io
_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1
$XFS_IO_PROG -c "fpunch 100000 50000" $SCRATCH_MNT/foo
$XFS_IO_PROG -c "falloc 100000 50000" $SCRATCH_MNT/foo
$XFS_IO_PROG -c "pwrite -S 0xff -b 1000 120000 1000" $SCRATCH_MNT/foo \
| _filter_xfs_io
$XFS_IO_PROG -c "fpunch 250000 20000" $SCRATCH_MNT/foo
$XFS_IO_PROG -c "falloc -k 300000 1000000" $SCRATCH_MNT/foo
$XFS_IO_PROG -c "falloc -k 9000000 2000000" $SCRATCH_MNT/foo
_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2
_run_btrfs_util_prog send --stream-version 2 $SCRATCH_MNT/mysnap1 \
-f $send_files_dir/1.snap
_run_btrfs_util_prog send --stream-version 2 -p $SCRATCH_MNT/mysnap1 \
$SCRATCH_MNT/mysnap2 -f $send_files_dir/2.snap
md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch
# List all hole and data segments.
$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo
# List all extents, we're interested here in prealloc extents that lie beyond
# the file's size.
$XFS_IO_PROG -r -c "fiemap -v" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap
_scratch_unmount
_check_scratch_fs
_scratch_mkfs >/dev/null 2>&1
_scratch_mount
_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap
_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap
md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch
# List all hole and data segments.
$XFS_IO_PROG -r -c "seek -r -a 0" $SCRATCH_MNT/mysnap2/foo
# List all extents, we're interested here in prealloc extents that lie beyond
# the file's size.
$XFS_IO_PROG -r -c "fiemap -v" $SCRATCH_MNT/mysnap2/foo | _filter_fiemap
_check_scratch_fs
status=0
exit
+35
View File
@@ -0,0 +1,35 @@
QA output created by 047
wrote 300000/300000 bytes at offset 0
XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 1000/1000 bytes at offset 120000
XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo
Whence Result
DATA 0
HOLE 102400
DATA 118784
HOLE 122880
DATA 147456
HOLE 253952
DATA 266240
HOLE 300000
0: [0..495]: data
1: [496..519]: hole
2: [520..2543]: data
3: [2544..17575]: hole
4: [17576..21487]: data
5a88aa0da62c8999c16515050947a70a SCRATCH_MNT/mysnap2/foo
Whence Result
DATA 0
HOLE 102400
DATA 118784
HOLE 122880
DATA 147456
HOLE 253952
DATA 266240
HOLE 300000
0: [0..495]: data
1: [496..519]: hole
2: [520..2543]: data
3: [2544..17575]: hole
4: [17576..21487]: data
+1
View File
@@ -49,3 +49,4 @@
044 auto quick
045 auto quick
046 auto quick
047 auto quick