2003-09-26 04:51:27 +00:00
|
|
|
#!/bin/sh
|
2005-11-09 02:48:08 +00:00
|
|
|
#
|
2003-09-26 04:51:27 +00:00
|
|
|
# Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
|
|
|
|
|
#
|
|
|
|
|
# rwtest - a shell wrapper around iogen and doio
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
trap "exit 0" INT # Until the smarter signal handler is engaged, below.
|
|
|
|
|
|
|
|
|
|
Prog=$(basename $0)
|
|
|
|
|
|
|
|
|
|
iOpts=""
|
|
|
|
|
dOpts=""
|
|
|
|
|
LockRegion=""
|
|
|
|
|
Nprocs=1
|
|
|
|
|
Files=""
|
|
|
|
|
Remove_Test_Files=""
|
|
|
|
|
Files_To_Remove=""
|
|
|
|
|
MPPrun=""
|
|
|
|
|
|
|
|
|
|
usage()
|
|
|
|
|
{
|
|
|
|
|
echo "$Prog: [-chq] [-N name] [ iogen options ] [ doio options ] files" >&2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
help()
|
|
|
|
|
{
|
|
|
|
|
echo "\
|
|
|
|
|
-c Cleanup test files created by this invocation on exit.
|
|
|
|
|
Default is to leave them.
|
|
|
|
|
-h This help - ignore all other options/arguments
|
|
|
|
|
-F Only process filenames - does not run iogen & doio.
|
|
|
|
|
-P Places Not used
|
|
|
|
|
-S Scenario Execute an internal scenario.
|
|
|
|
|
-N Name Pan-style name to be printed with error messages.
|
|
|
|
|
|
|
|
|
|
Options passed through to iogen:
|
|
|
|
|
-[afiLmOstT] arg
|
|
|
|
|
-o
|
|
|
|
|
-q Set rwtest to be quiet and pass the flag on to iogen.
|
|
|
|
|
|
|
|
|
|
Options passed through to doio:
|
|
|
|
|
-D[rmMVUC] arg
|
|
|
|
|
-D[aekv]
|
|
|
|
|
-n nprocs # procs to do simultanious io to the test files.
|
|
|
|
|
Default is 1. If -n is non-zero, doio's -k option (use
|
|
|
|
|
file locking) is forced.
|
|
|
|
|
|
|
|
|
|
files Files to test on. File names have the following fomat:
|
|
|
|
|
[ size: ] path
|
|
|
|
|
[ free% [ max size ] : ] path
|
|
|
|
|
If no size is specified, the files must exist
|
|
|
|
|
and the contents will be overwritten if testing write or
|
|
|
|
|
writea system calls. If a size is supplied, an attempt to
|
|
|
|
|
create/grow/shrink path to the desired size will be made.
|
|
|
|
|
size is an integer which defaults to bytes, but may be
|
|
|
|
|
suffixed by 'b', 'k', or 'm' for blocks (4096 byte units),
|
|
|
|
|
kilobytes (1024 byte units), or megabytes (2^20 byte units).
|
|
|
|
|
|
|
|
|
|
If the size is a percentage, df is used to find how much
|
|
|
|
|
free space there is (in blocks), and uses that. The maximum
|
|
|
|
|
size is implied to be in blocks.
|
|
|
|
|
" >&2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
killkids()
|
|
|
|
|
{
|
|
|
|
|
trap "killkids" INT
|
|
|
|
|
if [[ -z $didkids ]]
|
|
|
|
|
then
|
|
|
|
|
didkids=done
|
|
|
|
|
kill -INT -$$
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cleanup_and_exit()
|
|
|
|
|
{
|
|
|
|
|
if [ -n "$Remove_Test_Files" ]
|
|
|
|
|
then
|
|
|
|
|
if [ -n "$Files_To_Remove" ]
|
|
|
|
|
then
|
|
|
|
|
rm -f $Files_To_Remove
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
exit $1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (( $# > 0 ))
|
|
|
|
|
do case $1 in
|
|
|
|
|
-c) Remove_Test_Files=yes
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
-d) debug=$2
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
-h) help
|
|
|
|
|
exit 0
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
-F)
|
|
|
|
|
opt_F="-F" # only process filenames
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
-P)
|
|
|
|
|
PLACES=$2
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
-S) Scenario=$2
|
|
|
|
|
shift
|
|
|
|
|
opt_S="-S"
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
-N) Name="($2)"
|
|
|
|
|
iOpts="$iOpts -N $2"
|
|
|
|
|
dOpts="$dOpts -N $2"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
# iogen Options to pass thru ... options with an argument
|
|
|
|
|
-[afiLmOstT] )
|
|
|
|
|
iOpts="$iOpts $1 $2"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
# iogen Options to pass thru ... just the option
|
|
|
|
|
-[o] )
|
|
|
|
|
iOpts="$iOpts $1"
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
# iogen options to look at
|
|
|
|
|
-q)
|
|
|
|
|
iOpts="$iOpts $1"
|
|
|
|
|
Quiet=$1
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
# doio Options to pass thru ... options with an argument
|
|
|
|
|
-D[rmMVUC] )
|
|
|
|
|
o=${1#-D}
|
|
|
|
|
dOpts="$dOpts -$o $2"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
# doio options to pass thru ... just the options
|
|
|
|
|
-D[aekv] )
|
|
|
|
|
o=${1#-D}
|
|
|
|
|
dOpts="$dOpts -$o"
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
# doio options to look at
|
|
|
|
|
-n | -Dn )
|
|
|
|
|
dOpts="$dOpts $1 $2"
|
|
|
|
|
# force file locking with > 1 process
|
|
|
|
|
if [[ $2 > 1 ]]
|
|
|
|
|
then
|
|
|
|
|
dOpts="$dOpts -k"
|
|
|
|
|
fi
|
|
|
|
|
opt_n="-n"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
\? | -*)
|
|
|
|
|
echo "$Prog: Illegal option $1" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
*)
|
|
|
|
|
break
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
shift
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [[ $TOUTPUT = "NOPASS" ]]; then
|
|
|
|
|
iOpts="$iOpts -q"
|
|
|
|
|
Quiet="-q"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Hard-Coded Scenario Specifications
|
|
|
|
|
#
|
|
|
|
|
# FSA RAW I/O via FSA
|
|
|
|
|
# MPPnnn Run as a <nnn> sized MPP application
|
|
|
|
|
# userstripe create files using user striping
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
if [[ -n "$opt_S" ]]
|
|
|
|
|
then
|
|
|
|
|
case $Scenario in
|
|
|
|
|
|
|
|
|
|
FSA )
|
|
|
|
|
# I/O via FSA
|
|
|
|
|
Flags="parallel"
|
|
|
|
|
Nprocs=1
|
|
|
|
|
LockRegion=""
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
MPP* )
|
|
|
|
|
# use mpprun... to cooperate with a batch system, this
|
|
|
|
|
# requires scanning mppview, etc.
|
|
|
|
|
|
|
|
|
|
NPE=${Scenario#MPP}
|
|
|
|
|
MPPrun=" mpprun -n $NPE "
|
|
|
|
|
;;
|
|
|
|
|
userstripe)
|
|
|
|
|
#create files using user striping
|
|
|
|
|
Oflags=O_PLACE,0xffffffffffffffff,1000
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
places*)
|
|
|
|
|
FSIZE=${Scenario#places-}
|
|
|
|
|
oi="$IFS"
|
|
|
|
|
IFS=":"
|
|
|
|
|
set -- $PLACES
|
|
|
|
|
if [ $# -eq 0 ]
|
|
|
|
|
then
|
|
|
|
|
# "this isn't supposed to happen"
|
|
|
|
|
Files="25%:rwtest.$$"
|
|
|
|
|
else
|
|
|
|
|
IFS="$oi"
|
|
|
|
|
PL=${*}
|
|
|
|
|
for p in $PL
|
|
|
|
|
do
|
|
|
|
|
f="$f "${FSIZE}":"${p}"/rwtest$$"
|
|
|
|
|
done
|
|
|
|
|
set -- $f
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# If no files are specified ...
|
|
|
|
|
# check if PLACES is set; if so, put one file in each place
|
|
|
|
|
# otherwise generate one filename in the current directory.
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
if [ $# -eq 0 ]
|
|
|
|
|
then
|
|
|
|
|
# put one file in each of $PLACES
|
|
|
|
|
Files="25%:rwtest.file"
|
|
|
|
|
else
|
|
|
|
|
Files=$*
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# use 'df -PB' to see how many blocks are available, apply a hard limit of
|
|
|
|
|
# 1,000,000 blocks if no limit is specified
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
case $(uname -s) in
|
|
|
|
|
IRIX | IRIX64 ) dfOpts="-Pb" ;;
|
|
|
|
|
Linux) dfOpts="-P" ;;
|
|
|
|
|
*) dfOpts="-PB" ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
for f in $Files
|
|
|
|
|
do
|
|
|
|
|
file=${f##*:}
|
|
|
|
|
if [ ! -f "$file" ]
|
|
|
|
|
then
|
|
|
|
|
Files_To_Remove="$Files_To_Remove $file"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
dir=$(dirname $file)
|
|
|
|
|
size=${f%%:*}
|
|
|
|
|
if [[ $size = *%* ]]
|
|
|
|
|
then
|
|
|
|
|
|
|
|
|
|
typeset -i n=0
|
|
|
|
|
while (( n < ${#szcache[*]} ))
|
|
|
|
|
do
|
|
|
|
|
if [[ szcache[$n] = $dir ]]; then
|
|
|
|
|
break;
|
|
|
|
|
fi
|
|
|
|
|
n=n+1
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if (( n < ${#szcache[*]} ))
|
|
|
|
|
then
|
|
|
|
|
blks=${szblks[$n]}
|
|
|
|
|
else
|
|
|
|
|
blks=$(df $dfOpts $dir |
|
|
|
|
|
(while read fs blks used avail cap mountpoint
|
|
|
|
|
do
|
|
|
|
|
#echo $fs $blks $used $avail >&2
|
|
|
|
|
b=$avail
|
|
|
|
|
done
|
|
|
|
|
echo $b) )
|
|
|
|
|
|
|
|
|
|
case $(uname) in
|
|
|
|
|
Linux) blks=$( expr $blks / 2 ) ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
szcache[${#szcache[*]}+1]=$dir
|
|
|
|
|
szblks[${#szblks[*]}+1]=$blks
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
max=${size##*\%}
|
|
|
|
|
if [[ "$max" = "" ]]
|
|
|
|
|
then
|
|
|
|
|
max=1000000
|
|
|
|
|
fi
|
|
|
|
|
size=${size%%\%*}
|
|
|
|
|
|
2004-08-05 06:39:05 +00:00
|
|
|
sz=$(expr \( $blks '*' $size \) / 100)
|
2003-09-26 04:51:27 +00:00
|
|
|
|
|
|
|
|
if [[ $sz -gt $max ]]
|
|
|
|
|
then
|
|
|
|
|
sz=$max
|
|
|
|
|
fi
|
|
|
|
|
f=$sz"b:"$file
|
|
|
|
|
fi
|
|
|
|
|
F[${#F[*]}+1]=$f
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
Files=${F[*]}
|
|
|
|
|
|
|
|
|
|
if [[ -z ${dOpts} ]]; then
|
|
|
|
|
dOpts=-av
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ -n "$opt_F" ]]; then
|
|
|
|
|
|
|
|
|
|
echo $Files
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
[[ -n "$here" ]] || here=`pwd`
|
|
|
|
|
if [[ -x ${LTPROOT}/testcases/bin/iogen ]]; then
|
|
|
|
|
IOgen=${LTPROOT}/testcases/bin/iogen
|
|
|
|
|
elif [[ -x ${here}/ltp/iogen ]]; then
|
|
|
|
|
IOgen=$here/ltp/iogen
|
|
|
|
|
elif [[ -x ./iogen ]]; then
|
|
|
|
|
IOgen=./iogen
|
|
|
|
|
else
|
|
|
|
|
echo Cannot find iogen command
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
if [[ -x ${LTPROOT}/testcases/bin/doio ]]; then
|
|
|
|
|
doIO=${LTPROOT}/testcases/bin/doio
|
|
|
|
|
elif [[ -x ${here}/ltp/doio ]]; then
|
|
|
|
|
doIO=$here/ltp/doio
|
|
|
|
|
elif [[ -x ./doio ]]; then
|
|
|
|
|
doIO=./doio
|
|
|
|
|
else
|
|
|
|
|
echo Cannot find doio command
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
cmd="$IOgen ${iOpts} ${Files} | $MPPrun $doIO ${dOpts}"
|
|
|
|
|
|
|
|
|
|
if [[ -z "$Quiet" ]]; then
|
|
|
|
|
echo $cmd
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
trap "killkids" INT
|
|
|
|
|
trap "cleanup_and_exit 2" HUP
|
|
|
|
|
|
|
|
|
|
( $IOgen ${iOpts} ${Files}
|
|
|
|
|
r=$?
|
|
|
|
|
if [ $r -ne 0 ]
|
|
|
|
|
then
|
|
|
|
|
echo "$Prog$Name : iogen reported errors (r=$r)" >&2
|
|
|
|
|
kill -HUP $$
|
|
|
|
|
fi
|
|
|
|
|
) | $MPPrun $doIO ${dOpts}
|
|
|
|
|
r=$?
|
|
|
|
|
if [ $r -ne 0 ]
|
|
|
|
|
then
|
|
|
|
|
echo "$Prog$Name : doio reported errors (r=$r)" >&2
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
cleanup_and_exit $r
|
|
|
|
|
fi
|