| #!/bin/sh | |
| # | |
| # 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%%\%*} | |
| sz=$(expr \( $blks '*' $size \) / 100) | |
| 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 |