xfstest: add defragmentation stress tests for ext4

Perform various regression tests for ext4defrag subsystem

 301'th Test1: Defragment file while other task does direct AIO
 302'th Test2: Perform defragmentation on file under buffered AIO
 	while third task does direct AIO to donor file
 303'th Test3: Two defrag tasks use common donor file.
 304'th Test4: Stress defragmentation. Several threads perform
 	fragmentation at random position use inplace=1 will
	allocate and free blocks inside defrag event improve
	load pressure.

This tests are considered dangerous because 302'th and 303'th are known
to trigger OOPS on recent kernels see:https://gist.github.com/dmonakhov/4770294

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Reviewed-by: Rich Johnston <rjohnston@sgi.com>
Signed-off-by: Rich Johnston <rjohnston@sgi.com>
This commit is contained in:
Dmitry Monakhov
2013-02-20 10:42:14 +00:00
committed by Rich Johnston
parent 892125a53a
commit a3d92a6cbd
10 changed files with 574 additions and 2 deletions
+126
View File
@@ -0,0 +1,126 @@
#! /bin/bash
# FSQA Test No. 301
#
# Ext4 defragmentation stress test
# Defragment file while other task does direct io
#-----------------------------------------------------------------------
# (c) 2013 Dmitry Monakhov
#
# 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
#
#-----------------------------------------------------------------------
#
# creator
owner=dmonakhov@openvz.org
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.defrag
# real QA test starts here
_supported_os Linux
_supported_fs ext4
_need_to_be_root
_require_scratch
_require_defrag
NUM_JOBS=$((4*LOAD_FACTOR))
BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV`
# We need space for 2 files (test file, and donor one)
# reserve 30% in order to avoid ENOSPC
FILE_SIZE=$((BLK_DEV_SIZE * (512 / (2 + 1))))
cat >$tmp-$seq.fio <<EOF
# Common e4defrag regression tests
[global]
ioengine=ioe_e4defrag
iodepth=1
directory=${SCRATCH_MNT}
filesize=${FILE_SIZE}
size=999G
buffered=0
fadvise_hint=0
group_reporting
#################################
# Test1
# Defragment file while other task does direct io
# Continious sequential defrag activity
[defrag-4k]
ioengine=e4defrag
iodepth=1
bs=128k
donorname=test1.def
filename=test1
inplace=0
rw=write
numjobs=${NUM_JOBS}
runtime=30*${TIME_FACTOR}
time_based
# Verifier
[aio-dio-verifier]
ioengine=libaio
iodepth=128*${LOAD_FACTOR}
numjobs=1
verify=crc32c-intel
verify_fatal=1
verify_dump=1
verify_backlog=1024
verify_async=1
verifysort=1
direct=1
bs=64k
rw=randwrite
filename=test1
runtime=30*${TIME_FACTOR}
time_based
EOF
_workout()
{
echo ""
echo " Start defragment activity"
echo ""
cat $tmp-$seq.fio >> $seq.full
run_check $FIO_PROG $tmp-$seq.fio
}
_require_fio $tmp-$seq.fio
_scratch_mkfs >> $seq.full 2>&1
_scratch_mount
if ! _workout; then
umount $SCRATCH_DEV 2>/dev/null
exit
fi
if ! _scratch_unmount; then
echo "failed to umount"
status=1
exit
fi
_check_scratch_fs
status=$?
+4
View File
@@ -0,0 +1,4 @@
QA output created by 301
Start defragment activity
+143
View File
@@ -0,0 +1,143 @@
#! /bin/bash
# FSQA Test No. 302
#
# Ext4 defragmentation stress test
# Perform defragmentation on file under buffered io
# while third task does direct io to donor file
#-----------------------------------------------------------------------
# (c) 2013 Dmitry Monakhov
#
# 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
#
#-----------------------------------------------------------------------
#
# creator
owner=dmonakhov@openvz.org
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.defrag
# real QA test starts here
_supported_os Linux
_supported_fs ext4
_need_to_be_root
_require_scratch
_require_defrag
BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV`
# We need space for 2 files (test file, and donor one)
# reserve 30% in order to avoid ENOSPC
FILE_SIZE=$((BLK_DEV_SIZE * (512 / (2 + 1))))
cat >$tmp-$seq.fio <<EOF
# Common e4defrag regression tests
[global]
ioengine=ioe_e4defrag
iodepth=1
directory=${SCRATCH_MNT}
filesize=${FILE_SIZE}
size=999G
buffered=0
fadvise_hint=0
group_reporting
##########################################
# Test2
# Perform defragmentation on file under buffered io
# while third task does direct io to donor file
#
# Continuous sequential defrag activity
[defrag-4k]
stonewall
ioengine=e4defrag
iodepth=1
bs=128k
donorname=test2.def
filename=test2
inplace=0
rw=write
numjobs=${LOAD_FACTOR}
runtime=30*${TIME_FACTOR}
time_based
# Run DIO/AIO for donor file
[donor-file-fuzzer]
ioengine=libaio
iodepth=128*${LOAD_FACTOR}
numjobs=${LOAD_FACTOR}
verify=0
direct=1
bs=64k
rw=randwrite
filename=test2.def
runtime=30*${TIME_FACTOR}
time_based
# Verifier thread
[aio-dio-verifier]
ioengine=libaio
iodepth=128*${LOAD_FACTOR}
numjobs=1
verify=crc32c-intel
verify_fatal=1
verify_dump=1
verify_backlog=1024
verify_async=1
verifysort=1
buffered=1
bs=64k
rw=randrw
filename=test2
runtime=30*${TIME_FACTOR}
time_based
EOF
_workout()
{
echo ""
echo " Start defragment activity"
echo ""
cat $tmp-$seq.fio >> $seq.full
run_check $FIO_PROG $tmp-$seq.fio
}
_require_fio $tmp-$seq.fio
_scratch_mkfs >> $seq.full 2>&1
_scratch_mount
if ! _workout; then
umount $SCRATCH_DEV 2>/dev/null
exit
fi
if ! _scratch_unmount; then
echo "failed to umount"
status=1
exit
fi
_check_scratch_fs
status=$?
exit
+4
View File
@@ -0,0 +1,4 @@
QA output created by 302
Start defragment activity
+153
View File
@@ -0,0 +1,153 @@
#! /bin/bash
# FSQA Test No. 303
#
# Ext4 defragmentation stress test
# Two defrag tasks use common donor file
#
#-----------------------------------------------------------------------
# (c) 2013 Dmitry Monakhov
#
# 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
#
#-----------------------------------------------------------------------
#
# creator
owner=dmonakhov@openvz.org
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.defrag
# real QA test starts here
_supported_os Linux
_supported_fs ext4
_need_to_be_root
_require_scratch
_require_defrag
BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV`
# We need space for 3 files (one donor file and two test files)
# Reserve space for 4 files in order to avoid ENOSPC
FILE_SIZE=$((BLK_DEV_SIZE * (512 / (3+1))))
cat >$tmp-$seq.fio <<EOF
# Common e4defrag regression tests
[global]
ioengine=ioe_e4defrag
iodepth=1
directory=${SCRATCH_MNT}
filesize=${FILE_SIZE}
size=999G
buffered=0
fadvise_hint=0
group_reporting
#################################
# Test3
# Two defrag tasks use common donor file
[defrag-1]
ioengine=e4defrag
iodepth=1
bs=128k
donorname=test3.def
filename=test31
inplace=0
rw=write
numjobs=${LOAD_FACTOR}
runtime=30*${TIME_FACTOR}
time_based
[defrag-2]
ioengine=e4defrag
iodepth=1
bs=128k
donorname=test3.def
filename=test32
inplace=0
rw=write
numjobs=${LOAD_FACTOR}
runtime=30*${TIME_FACTOR}
time_based
[aio-dio-verifier-1]
ioengine=libaio
iodepth=128*${LOAD_FACTOR}
numjobs=1
verify=crc32c-intel
verify_fatal=1
verify_dump=1
verify_backlog=1024
verify_async=1
verifysort=1
direct=1
bs=64k
rw=write
filename=test31
runtime=30*${TIME_FACTOR}
time_based
[aio-buffer-verifier-2]
ioengine=libaio
numjobs=1
verify=crc32c-intel
verify_fatal=1
verify_dump=1
verify_backlog=1024
verify_async=1
verifysort=1
buffered=1
bs=64k
rw=randrw
filename=test32
runtime=30*${TIME_FACTOR}
time_based
EOF
_workout()
{
echo ""
echo " Start defragment activity"
echo ""
cat $tmp-$seq.fio >> $seq.full
run_check $FIO_PROG $tmp-$seq.fio
}
_require_fio $tmp-$seq.fio
_scratch_mkfs >> $seq.full 2>&1
_scratch_mount
if ! _workout; then
umount $SCRATCH_DEV 2>/dev/null
exit
fi
if ! _scratch_unmount; then
echo "failed to umount"
status=1
exit
fi
_check_scratch_fs
status=$?
exit
+4
View File
@@ -0,0 +1,4 @@
QA output created by 303
Start defragment activity
+130
View File
@@ -0,0 +1,130 @@
#! /bin/bash
# FSQA Test No. 304
#
# Ext4 defragmentation stress test
# Several threads perform defragmentation at random position
# using 'inplace' mode (allocate and free blocks inside defrag event)
# which significantly improve load pressure on block allocator.
#-----------------------------------------------------------------------
# (c) 2013 Dmitry Monakhov
#
# 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
#
#-----------------------------------------------------------------------
#
# creator
owner=dmonakhov@openvz.org
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.defrag
# real QA test starts here
_supported_os Linux
_supported_fs ext4
_need_to_be_root
_require_scratch
_require_defrag
BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV`
# We need space for 2 files (test file, and donor one)
# reserve 30% in order to avoid ENOSPC
FILE_SIZE=$((BLK_DEV_SIZE * (512 / (2 + 1))))
cat >$tmp-$seq.fio <<EOF
# Common e4defrag regression tests
[global]
ioengine=ioe_e4defrag
iodepth=1
directory=${SCRATCH_MNT}
filesize=${FILE_SIZE}
size=999G
buffered=0
fadvise_hint=0
group_reporting
#################################
# Test4
# Stress test defragmentation engine
# Several threads perform defragmentation at random position
# use inplace=1 will allocate and free blocks inside defrag event
# which highly increase defragmentation
[defrag-fuzzer]
ioengine=e4defrag
iodepth=1
bs=8k
donorname=test4.def
filename=test4
inplace=1
rw=randwrite
numjobs=4*${LOAD_FACTOR}
runtime=30*${TIME_FACTOR}
time_based
[aio-dio-verifier]
ioengine=libaio
iodepth=128
iomem_align=4k
numjobs=1
verify=crc32c-intel
verify_fatal=1
verify_dump=1
verify_backlog=1024
verify_async=1
verifysort=1
direct=1
bs=64k
rw=write
filename=test4
runtime=30*${TIME_FACTOR}
time_based
EOF
_workout()
{
echo ""
echo " Start defragment activity"
echo ""
cat $tmp-$seq.fio >> $seq.full
run_check $FIO_PROG $tmp-$seq.fio
}
_require_fio $tmp-$seq.fio
_scratch_mkfs >> $seq.full 2>&1
_scratch_mount
if ! _workout; then
umount $SCRATCH_DEV 2>/dev/null
exit
fi
if ! _scratch_unmount; then
echo "failed to umount"
status=1
exit
fi
_check_scratch_fs
status=$?
exit
+4
View File
@@ -0,0 +1,4 @@
QA output created by 304
Start defragment activity
+2 -2
View File
@@ -24,10 +24,10 @@ _require_defrag()
{
case "$FSTYP" in
xfs)
DEFRAG_PROG=/usr/sbin/xfs_fsr
DEFRAG_PROG="`set_prog_path xfs_fsr`"
;;
ext4|ext4dev)
DEFRAG_PROG=/usr/bin/e4defrag
DEFRAG_PROG="`set_prog_path e4defrag`"
;;
btrfs)
DEFRAG_PROG="$BTRFS_UTIL_PROG filesystem defragment"
+4
View File
@@ -424,3 +424,7 @@ stress
298 auto trim
299 auto aio enospc rw stress
300 auto aio enospc preallocrw stress
301 aio dangerous ioctl rw stress
302 aio dangerous ioctl rw stress
303 aio dangerous ioctl rw stress
304 aio dangerous ioctl rw stress