xfs: test fragmentation characteristics of copy-on-write

Perform copy-on-writes at random offsets to stress the CoW allocation
system.  Assess the effectiveness of the extent size hint at
combatting fragmentation via unshare, a rewrite, and no-op after the
random writes.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
Darrick J. Wong
2016-01-13 20:33:22 -08:00
parent 4f1a5d60e5
commit 9184ca155d
32 changed files with 1781 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
#! /bin/bash
# FS QA Test No. 301
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files.
# - 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
_require_scratch_reflink
_require_cp_reflink
_require_fiemap
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=$(stat -f -c '%S' $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
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
echo "CoW and unmount"
for i in `seq 1 8`; do
$XFS_IO_PROG -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" -c "fdatasync" $testdir/file2 >> $seqres.full
done
_scratch_remount
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
test $new_extents -lt $((internal_blks * 2 / 3)) || echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 301
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-301/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-301/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-301/file1
Check extent counts
+101
View File
@@ -0,0 +1,101 @@
#! /bin/bash
# FS QA Test No. 302
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files.
# - Directio 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
_require_scratch_reflink
_require_cp_reflink
_require_fiemap
_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=$(stat -f -c '%S' $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
_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
echo "CoW and unmount"
for i in `seq 1 8`; do
$XFS_IO_PROG -d -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" $testdir/file2 >> $seqres.full
done
_scratch_remount
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
test $new_extents -le $internal_blks || echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 302
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-302/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-302/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-302/file1
Check extent counts
+2
View File
@@ -303,6 +303,8 @@
298 auto quick clone
299 auto aio enospc rw stress
300 auto aio enospc preallocrw stress
301 auto quick clone
302 auto quick clone
306 auto quick rw
307 auto quick
308 auto quick
Executable
+106
View File
@@ -0,0 +1,106 @@
#! /bin/bash
# FS QA Test No. 180
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set extsz hint on second file.
# - Buffered write to random offsets to scatter CoW reservations.
# - Rewrite the whole file to use up 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=$(stat -f -c '%S' $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_remount
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 "pwrite -S 0x63 -b $real_blksz 0 $((filesize + 1))" -c "fdatasync" $testdir/file2 >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
|| echo "file2 badly fragmented"
# success, all done
status=0
exit
+11
View File
@@ -0,0 +1,11 @@
QA output created by 180
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-180/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-180/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-180/file1
d41f6527bc8320364e12ea7076140b8b SCRATCH_MNT/test-180/file2
Check extent counts
Executable
+107
View File
@@ -0,0 +1,107 @@
#! /bin/bash
# FS QA Test No. 182
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set extsz hint on second file.
# - Directio write to random offsets to scatter CoW reservations.
# - Rewrite the whole file to use up 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"
_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=$(stat -f -c '%S' $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_remount
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 + 1))" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -d -f -c "pwrite -S 0x63 -b $real_blksz 0 $((filesize + 1))" $testdir/file2 >> $seqres.full
_scratch_remount
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
|| echo "file2 badly fragmented"
# success, all done
status=0
exit
+12
View File
@@ -0,0 +1,12 @@
QA output created by 182
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-182/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-182/file2
CoW and unmount
pwrite64: Invalid argument
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-182/file1
c6ba35da9f73ced20d7781a448cc11d4 SCRATCH_MNT/test-182/file2
Check extent counts
Executable
+105
View File
@@ -0,0 +1,105 @@
#! /bin/bash
# FS QA Test No. 184
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set extsz hint on second file.
# - Buffered 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"
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=$(stat -f -c '%S' $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_remount
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 + 1))" -c "fdatasync" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "falloc 0 $((filesize + 1))" $testdir/file2 >> $seqres.full
_scratch_remount
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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
|| echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 184
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-184/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-184/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-184/file1
Check extent counts
Executable
+106
View File
@@ -0,0 +1,106 @@
#! /bin/bash
# FS QA Test No. 192
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set 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=$(stat -f -c '%S' $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_remount
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 0 $filesize" $testdir/file2 >> $seqres.full
_scratch_remount
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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
|| echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 192
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-192/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-192/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-192/file1
Check extent counts
Executable
+102
View File
@@ -0,0 +1,102 @@
#! /bin/bash
# FS QA Test No. 193
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set 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=$(stat -f -c '%S' $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_remount
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
_scratch_remount
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
test $new_extents -lt $((internal_blks * 2 / 3)) || echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 193
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-193/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-193/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-193/file1
Check extent counts
Executable
+103
View File
@@ -0,0 +1,103 @@
#! /bin/bash
# FS QA Test No. 198
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set extsz hint on second file.
# - Directio 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"
_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=$(stat -f -c '%S' $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_remount
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
_scratch_remount
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
test $new_extents -lt $((internal_blks * 2 / 3)) || echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 198
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-198/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-198/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-198/file1
Check extent counts
Executable
+109
View File
@@ -0,0 +1,109 @@
#! /bin/bash
# FS QA Test No. 200
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set extsz hint on second file.
# - Read the whole file into memory.
# - Buffered write to random offsets to scatter CoW reservations.
# - fadvise(dontneed) the whole file to evict the pages.
# - falloc the whole fle to see if the extsz hints still apply.
# - 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=$(stat -f -c '%S' $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_remount
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
cat $testdir/file2 > /dev/null
$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 "fadvise -d 0 $filesize" -c "fsync" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "falloc 0 $filesize" $testdir/file2 >> $seqres.full
_scratch_remount
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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
|| echo "file2 badly fragmented"
# success, all done
status=0
exit
+10
View File
@@ -0,0 +1,10 @@
QA output created by 200
Format and mount
Create the original files
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-200/file1
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-200/file2
CoW and unmount
Compare files
2909feb63a37b0e95fe5cfb7f274f7b1 SCRATCH_MNT/test-200/file1
Check extent counts
Executable
+110
View File
@@ -0,0 +1,110 @@
#! /bin/bash
# FS QA Test No. 204
#
# Test fragmentation after a lot of random CoW:
# - Create two reflinked files. Set extsz hint on second file.
# - Read the whole file into memory.
# - DIO write to random offsets to scatter CoW reservations.
# - fadvise(dontneed) the whole file to evict the pages.
# - falloc the whole fle to see if the extsz hints still apply.
# - 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=$(stat -f -c '%S' $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_remount
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
cat $testdir/file2 > /dev/null
$XFS_IO_PROG -d -f -c "pwrite -R -S 0x63 -b $real_blksz 0 $filesize" -c "fdatasync" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "fadvise -d 0 $filesize" -c "fsync" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "falloc 0 $filesize" $testdir/file2 >> $seqres.full
_scratch_remount
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
test $new_extents -lt $((internal_blks / 20)) || test $new_extents -lt 15 \
|| echo "file2 badly fragmented"
# success, all done
status=0
exit

Some files were not shown because too many files have changed in this diff Show More