xfs: test the automatic cowextsize extent garbage collector

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
Darrick J. Wong
2016-01-28 15:20:25 -08:00
parent 8d66ede50f
commit c0ee4d631c
5 changed files with 296 additions and 0 deletions
Executable
+130
View File
@@ -0,0 +1,130 @@
#! /bin/bash
# FS QA Test No. 231
#
# Test recovery of unused CoW reservations:
# - Create two reflinked files. Set extsz hint on second file.
# - Dirty a single byte on a number of CoW reservations in the second file.
# - Fsync to flush out the dirty pages.
# - Wait for the reclaim to run.
# - Write more and see how bad fragmentation is.
#
#-----------------------------------------------------------------------
# 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 /
echo $old_cow_lifetime > /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime
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
old_cow_lifetime=$(cat /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime)
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=64
filesize=$((blksz * nr))
bufnr=2
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 -c "cowextsize $bufsize" $testdir
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file1 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file2.chk >> $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
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and leave leftovers"
echo 2 > /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime
seq 2 2 $((nr - 1)) | while read f; do
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f - 1)) 1" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f - 1)) 1" $testdir/file2.chk >> $seqres.full
done
sync
echo "Wait for CoW expiration"
sleep 3
echo "Allocate free space"
for i in $(seq 1 32); do
$XFS_IO_PROG -f -c "falloc 0 1" $testdir/junk.$i >> $seqres.full
done
$XFS_IO_PROG -f -c "falloc 0 $filesize" $testdir/junk >> $seqres.full
echo "CoW and leave leftovers"
echo $old_cow_lifetime > /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime
seq 2 2 $((nr - 1)) | while read f; do
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f)) 1" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f)) 1" $testdir/file2.chk >> $seqres.full
done
sync
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _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 / 7)) || echo "file2 badly fragmented"
# success, all done
status=0
exit
+16
View File
@@ -0,0 +1,16 @@
QA output created by 231
Format and mount
Create the original files
Compare files
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-231/file1
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-231/file2
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-231/file2.chk
CoW and leave leftovers
Wait for CoW expiration
Allocate free space
CoW and leave leftovers
Compare files
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-231/file1
211b0f725e67149d75104a747365eb70 SCRATCH_MNT/test-231/file2
211b0f725e67149d75104a747365eb70 SCRATCH_MNT/test-231/file2.chk
Check extent counts
Executable
+132
View File
@@ -0,0 +1,132 @@
#! /bin/bash
# FS QA Test No. 232
#
# Test non-recovery of unused CoW reservations for dirty files:
# - Create two reflinked files. Set extsz hint on second file.
# - Dirty a single byte on a number of CoW reservations in the second file.
# - Fsync to flush out the dirty pages.
# - Dirty a single byte anywhere in the second file.
# - Wait for the reclaim to run.
# - Write more and see how bad fragmentation is.
#
#-----------------------------------------------------------------------
# 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 /
echo $old_cow_lifetime > /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime
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
old_cow_lifetime=$(cat /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime)
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=64
filesize=$((blksz * nr))
bufnr=2
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 -c "cowextsize $bufsize" $testdir
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file1 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x61 -b $bufsize 0 $filesize" $testdir/file2.chk >> $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
md5sum $testdir/file2.chk | _filter_scratch
echo "CoW and leave leftovers"
echo 2 > /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime
seq 2 2 $((nr - 1)) | while read f; do
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f - 1)) 1" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f - 1)) 1" $testdir/file2.chk >> $seqres.full
done
sync
echo "Wait for CoW expiration"
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * 2)) 1" $testdir/file2 >> $seqres.full
sleep 3
echo "Allocate free space"
for i in $(seq 1 32); do
$XFS_IO_PROG -f -c "falloc 0 1" $testdir/junk.$i >> $seqres.full
done
$XFS_IO_PROG -f -c "falloc 0 $filesize" $testdir/junk >> $seqres.full
echo "CoW and leave leftovers"
echo $old_cow_lifetime > /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime
seq 2 2 $((nr - 1)) | while read f; do
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f)) 1" $testdir/file2 >> $seqres.full
$XFS_IO_PROG -f -c "pwrite -S 0x63 $((blksz * f)) 1" $testdir/file2.chk >> $seqres.full
done
sync
echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file2 | _filter_scratch
md5sum $testdir/file2.chk | _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 / 12)) || echo "file2 not sufficiently fragmented"
# success, all done
status=0
exit
+16
View File
@@ -0,0 +1,16 @@
QA output created by 232
Format and mount
Create the original files
Compare files
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-232/file1
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-232/file2
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-232/file2.chk
CoW and leave leftovers
Wait for CoW expiration
Allocate free space
CoW and leave leftovers
Compare files
bdbcf02ee0aa977795a79d25fcfdccb1 SCRATCH_MNT/test-232/file1
211b0f725e67149d75104a747365eb70 SCRATCH_MNT/test-232/file2
211b0f725e67149d75104a747365eb70 SCRATCH_MNT/test-232/file2.chk
Check extent counts
+2
View File
@@ -228,6 +228,8 @@
228 auto quick clone
229 auto rw
230 auto quick clone
231 auto quick clone
232 auto quick clone
238 auto quick metadata ioctl
242 auto quick prealloc
244 auto quota quick