Files
apfstests/031
T
Dave Chinner e714acc0ef reduce the number of processes forked
One of the big cpu time consumers when running xfsqa on UML
is forking of new processes. when looping lots of times,
using 'expr' to calculate the loop counter increment means
we fork at least once every loop. using shell builtins means
that we don't fork and many tests run substantially faster.

Some tests are even runnable with this modification. e.g. 110
went from taking 4500s to run down to 9s with the loop iterators
changed to avoid forking.

Signed-off-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
2009-03-25 20:53:36 +01:00

113 lines
2.5 KiB
Bash
Executable File

#! /bin/sh
# FS QA Test No. 031
#
# exercise xfs_repair - ensure repeated use doesn't corrupt
#
#-----------------------------------------------------------------------
# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved.
#-----------------------------------------------------------------------
#
# creator
owner=nathans@sgi.com
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
rm -f $seq.full
# get standard environment, filters and checks
. ./common.rc
. ./common.repair
. ./common.filter
# link correct .out file
_link_out_file $seq.out
_check_repair()
{
echo "Repairing, round 0" >> $seq.full
_scratch_xfs_repair 2>&1 | _filter_repair | tee -a $seq.full >$tmp.0
for i in 1 2 3 4
do
echo "Repairing, iteration $i" | tee -a $seq.full
_scratch_xfs_repair 2>&1 | _filter_repair >$tmp.$i
diff $tmp.0 $tmp.$i >> $seq.full
if [ $? -ne 0 ]; then
echo "ERROR: repair round $i differs to round 0 (see $seq.full)" | tee -a $seq.full
break
fi
# echo all interesting stuff...
perl -ne '
s/(rebuilding directory inode) (\d+)/\1 INO/g;
s/internal log/<TYPEOF> log/g;
s/external log on \S+/<TYPEOF> log/g;
/^\S+/ && print;
' $tmp.$i
done
echo
}
# prototype file to create various directory forms
_create_proto()
{
total=$1
count=0
# take inode size into account for non-shortform directories...
[ $total -gt 0 ] && total=`expr $total \* $isize / 512`
cat >$tmp.proto <<EOF
DUMMY1
0 0
: root directory
d--777 3 1
lost+found d--755 3 1
$
EOF
while [ $count -lt $total ]
do
let count=$count+1
cat >>$tmp.proto <<EOF
${count}_of_${total}_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ---755 3 1 /bin/true
EOF
done
echo '$' >>$tmp.proto
}
# real QA test starts here
_supported_fs xfs
_supported_os IRIX Linux
_require_nobigloopfs
_require_scratch
# sanity test - default + one root directory entry
# Note: must do this proto/mkfs now for later inode size calcs
_create_proto 0
echo "=== one entry (shortform)"
_scratch_mkfs_xfs -p $tmp.proto >$tmp.mkfs0 2>&1
_filter_mkfs <$tmp.mkfs0 >/dev/null 2>$tmp.mkfs
. $tmp.mkfs
_check_repair
# block-form root directory & repeat
_create_proto 20
echo "=== twenty entries (block form)"
_scratch_mkfs_xfs -p $tmp.proto | _filter_mkfs >/dev/null 2>&1
_check_repair
# leaf-form root directory & repeat
_create_proto 1000
echo "=== thousand entries (leaf form)"
_scratch_mkfs_xfs -p $tmp.proto | _filter_mkfs >/dev/null 2>&1
_check_repair
# success, all done
status=0
exit