diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2016-09-29 19:24:02 -0700 |
---|---|---|
committer | Eryu Guan <eguan@redhat.com> | 2016-10-08 13:50:06 +0800 |
commit | c6aa8a7666ec6c6063f5c9e86428166887af2d18 (patch) | |
tree | e045c6547979b939efa4a22f2c84065fb80c8c3e | |
parent | 8144ddc4591f99000faf77f74b7b81c39557f2eb (diff) | |
download | xfstests-dev-c6aa8a7666ec6c6063f5c9e86428166887af2d18.tar.gz |
xfs: check copy-on-write fragmentation
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
-rwxr-xr-x | tests/xfs/897 | 104 | ||||
-rw-r--r-- | tests/xfs/897.out | 10 | ||||
-rwxr-xr-x | tests/xfs/898 | 102 | ||||
-rw-r--r-- | tests/xfs/898.out | 10 | ||||
-rwxr-xr-x | tests/xfs/899 | 107 | ||||
-rw-r--r-- | tests/xfs/899.out | 10 | ||||
-rwxr-xr-x | tests/xfs/900 | 106 | ||||
-rw-r--r-- | tests/xfs/900.out | 10 | ||||
-rw-r--r-- | tests/xfs/group | 4 |
9 files changed, 463 insertions, 0 deletions
diff --git a/tests/xfs/897 b/tests/xfs/897 new file mode 100755 index 0000000000..e7da5c0cd2 --- /dev/null +++ b/tests/xfs/897 @@ -0,0 +1,104 @@ +#! /bin/bash +# FS QA Test No. 897 +# +# Test fragmentation after a lot of random CoW: +# - Create two reflinked files. Set zero extsz hint on second file. +# - Directio write to random offsets to scatter CoW reservations. +# - falloc the whole file to unshare blocks. +# - Check the number of extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_xfs_io_command "cowextsize" +_require_odirect + +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blksz=65536 +nr=128 +filesize=$((blksz * nr)) +bufnr=16 +bufsize=$((blksz * bufnr)) + +_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4)) +real_blksz=$(get_block_size $testdir) +internal_blks=$((filesize / real_blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $((filesize + 1))" $testdir/file1 >> $seqres.full +$XFS_IO_PROG -f -c "cowextsize $real_blksz" $testdir/file2 +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "CoW and unmount" +$XFS_IO_PROG -f -c "cowextsize" $testdir/file2 >> $seqres.full +$XFS_IO_PROG -d -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" $testdir/file2 >> $seqres.full +$XFS_IO_PROG -d -f -c "falloc -u 0 $filesize" $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch + +echo "Check extent counts" +old_extents=$(_count_extents $testdir/file1) +new_extents=$(_count_extents $testdir/file2) + +echo "old extents: $old_extents" >> $seqres.full +echo "new extents: $new_extents" >> $seqres.full +echo "maximum extents: $internal_blks" >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/897.out b/tests/xfs/897.out new file mode 100644 index 0000000000..b418552486 --- /dev/null +++ b/tests/xfs/897.out @@ -0,0 +1,10 @@ +QA output created by 897 +Format and mount +Create the original files +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-897/file1 +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-897/file2 +CoW and unmount +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-897/file1 +Check extent counts diff --git a/tests/xfs/898 b/tests/xfs/898 new file mode 100755 index 0000000000..aa62ee26e4 --- /dev/null +++ b/tests/xfs/898 @@ -0,0 +1,102 @@ +#! /bin/bash +# FS QA Test No. 898 +# +# Test fragmentation after a lot of random CoW: +# - Create two reflinked files. Set zero extsz hint on second file. +# - Buffered write to random offsets to scatter CoW reservations. +# - Check the number of extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_xfs_io_command "cowextsize" + +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blksz=65536 +nr=128 +filesize=$((blksz * nr)) +bufnr=16 +bufsize=$((blksz * bufnr)) + +_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4)) +real_blksz=$(get_block_size $testdir) +internal_blks=$((filesize / real_blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $((filesize + 1))" $testdir/file1 >> $seqres.full +$XFS_IO_PROG -f -c "cowextsize $real_blksz" $testdir/file2 +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "CoW and unmount" +$XFS_IO_PROG -f -c "cowextsize" $testdir/file2 >> $seqres.full +$XFS_IO_PROG -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" -c "fdatasync" $testdir/file2 >> $seqres.full +$XFS_IO_PROG -f -c "falloc -u 0 $filesize" $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch + +echo "Check extent counts" +old_extents=$(_count_extents $testdir/file1) +new_extents=$(_count_extents $testdir/file2) + +echo "old extents: $old_extents" >> $seqres.full +echo "new extents: $new_extents" >> $seqres.full +echo "maximum extents: $internal_blks" >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/898.out b/tests/xfs/898.out new file mode 100644 index 0000000000..e50bb3b2f1 --- /dev/null +++ b/tests/xfs/898.out @@ -0,0 +1,10 @@ +QA output created by 898 +Format and mount +Create the original files +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-898/file1 +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-898/file2 +CoW and unmount +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-898/file1 +Check extent counts diff --git a/tests/xfs/899 b/tests/xfs/899 new file mode 100755 index 0000000000..0eea9151e9 --- /dev/null +++ b/tests/xfs/899 @@ -0,0 +1,107 @@ +#! /bin/bash +# FS QA Test No. 899 +# +# Test fragmentation after writing and dropping CoW extent hint reservation: +# - Create two reflinked files. Set extsz hint on second file. +# - Directio write to random offsets to scatter CoW reservations. +# - Unmount, remount, repeat (twice more). +# - Check the number of extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_xfs_io_command "cowextsize" +_require_odirect + +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blksz=65536 +nr=128 +filesize=$((blksz * nr)) +bufnr=8 +bufsize=$((blksz * bufnr)) + +_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4)) +real_blksz=$(get_block_size $testdir) +internal_blks=$((filesize / real_blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $((filesize + 1))" $testdir/file1 >> $seqres.full +$XFS_IO_PROG -f -c "cowextsize $bufsize" $testdir/file2 +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "CoW and unmount" +$XFS_IO_PROG -f -c "cowextsize" $testdir/file2 >> $seqres.full +seq 1 10 | while read i; do + $XFS_IO_PROG -d -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" $testdir/file2 >> $seqres.full + _scratch_cycle_mount +done +$XFS_IO_PROG -f -c "falloc -u 0 $filesize" $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch + +echo "Check extent counts" +old_extents=$(_count_extents $testdir/file1) +new_extents=$(_count_extents $testdir/file2) + +echo "old extents: $old_extents" >> $seqres.full +echo "new extents: $new_extents" >> $seqres.full +echo "maximum extents: $internal_blks" >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/899.out b/tests/xfs/899.out new file mode 100644 index 0000000000..fd3d7fe903 --- /dev/null +++ b/tests/xfs/899.out @@ -0,0 +1,10 @@ +QA output created by 899 +Format and mount +Create the original files +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-899/file1 +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-899/file2 +CoW and unmount +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-899/file1 +Check extent counts diff --git a/tests/xfs/900 b/tests/xfs/900 new file mode 100755 index 0000000000..659ca23e4b --- /dev/null +++ b/tests/xfs/900 @@ -0,0 +1,106 @@ +#! /bin/bash +# FS QA Test No. 900 +# +# Test fragmentation after writing and dropping CoW extent hint reservation: +# - Create two reflinked files. Set extsz hint on second file. +# - Buffered write to random offsets to scatter CoW reservations. +# - Unmount, remount, repeat (twice more). +# - Check the number of extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. 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 -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_fiemap +_require_xfs_io_command "cowextsize" + +rm -f $seqres.full + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blksz=65536 +nr=128 +filesize=$((blksz * nr)) +bufnr=8 +bufsize=$((blksz * bufnr)) + +_require_fs_space $SCRATCH_MNT $((filesize / 1024 * 3 * 5 / 4)) +real_blksz=$(get_block_size $testdir) +internal_blks=$((filesize / real_blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $((filesize + 1))" $testdir/file1 >> $seqres.full +$XFS_IO_PROG -f -c "cowextsize $bufsize" $testdir/file2 +_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "CoW and unmount" +$XFS_IO_PROG -f -c "cowextsize" $testdir/file2 >> $seqres.full +seq 1 10 | while read i; do + $XFS_IO_PROG -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" $testdir/file2 >> $seqres.full + _scratch_cycle_mount +done +$XFS_IO_PROG -f -c "falloc -u 0 $filesize" $testdir/file2 >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch + +echo "Check extent counts" +old_extents=$(_count_extents $testdir/file1) +new_extents=$(_count_extents $testdir/file2) + +echo "old extents: $old_extents" >> $seqres.full +echo "new extents: $new_extents" >> $seqres.full +echo "maximum extents: $internal_blks" >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/900.out b/tests/xfs/900.out new file mode 100644 index 0000000000..5ebf3e92d5 --- /dev/null +++ b/tests/xfs/900.out @@ -0,0 +1,10 @@ +QA output created by 900 +Format and mount +Create the original files +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-900/file1 +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-900/file2 +CoW and unmount +Compare files +2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-900/file1 +Check extent counts diff --git a/tests/xfs/group b/tests/xfs/group index 405076a21f..02e34dc198 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -329,3 +329,7 @@ 886 auto quick rmap 887 auto quick rmap 888 auto quick rmap +897 auto quick clone +898 auto quick clone +899 auto quick clone +900 auto quick clone |