--- /dev/null
+#!/bin/sh
+#
+# Wrapper for automating benchmarking runs.
+# Usage: bench [passes] [uid] [gid] [script]
+#
+# ..where passes is the number of times to run each script; uid/gid
+# gives credentials to use when running the script; and script is a
+# simple wrapper around each actual benchmark tool (eg. see run.*),
+# if this is ommited, all run.* scripts are used in turn.
+#
+# Each run.foo script should report a comma-separated-value list of
+# benchmark results on stdout or fail with a non-zero exit code;
+# unless the -i option is supplied in which case it should instead
+# report a comma-separated-value list of column headers (for report
+# generation purposes).
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2002 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 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.
+#
+# Further, this software is distributed without any warranty that it is
+# free of the rightful claim of any third person regarding infringement
+# or the like. Any license provided herein, whether implied or
+# otherwise, applies only to this software file. Patent licenses, if
+# any, provided herein do not apply to combinations of this program with
+# other software, or any other product whatsoever.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston MA 02111-1307, USA.
+#
+# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+# Mountain View, CA 94043, or:
+#
+# http://www.sgi.com
+#
+# For further information regarding this notice, see:
+#
+# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+#-----------------------------------------------------------------------
+#
+# creator
+owner=nathans@sgi.com
+
+tmp=/tmp/$$
+seq=bench
+here=`pwd`
+status=1 # failure is the default!
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+_cleanup()
+{
+ echo " *** umount"
+ umount $SCRATCH_DEV >/dev/null 2>&1
+}
+
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+ROOT="."
+LOG="$ROOT/soak.log"
+FULL="$ROOT/soak.full"
+
+_log()
+{
+ echo "$*" 1>&2
+ echo "$*" >>$LOG
+ echo "$*" >>$FULL
+ sync
+}
+
+_logp()
+{
+ tee -a $FULL
+}
+
+_fail()
+{
+ _log "$*"
+ status=1
+ exit 1
+}
+
+_run_benchmark()
+{
+ pass=1
+
+ while [ $pass -le $passes -o $passes -lt 0 ]
+ do
+ _log " *** clean scratch device [starting pass $pass]"
+ mkfs_xfs -f $SCRATCH_DEV 2>&1 | _fix_malloc >>$FULL \
+ || _fail " !!! failed to mkfs SCRATCH_DEV"
+
+ _log " *** mounting scratch device"
+ mount -t xfs $SCRATCH_DEV $SCRATCH_MNT \
+ || _fail " !!! failed to mount"
+
+ _log " *** mkdir"
+ mkdir $SCRATCH_MNT/bench \
+ || _fail " !!! couldn't mkdir bench dir"
+ chown -R $user.$group $SCRATCH_MNT/bench \
+ || _fail " !!! couldn't chown bench dir"
+ cd $SCRATCH_MNT/bench
+
+ _log " *** bench"
+ $here/src/runas -u $user -g $group $here/run.$bench > $FULL
+ [ $? -eq 0 ] || _fail " !!! non-zero $bench exit code"
+ cd $here
+
+ _log " *** unmounting scratch device"
+ umount $SCRATCH_DEV 2>&1 | _logp \
+ || _fail " !!! failed to umount"
+
+ _log " *** post-umount filesystem check"
+ _check_fs $SCRATCH_DEV
+
+ let "pass = pass + 1"
+ done
+}
+
+# real QA test starts here
+
+_require_scratch
+
+passes=-1
+user=root
+group=root
+benches=`echo run.*`
+
+[ $# -gt 0 ] && passes=$1
+[ $# -gt 1 ] && user=$3
+[ $# -gt 2 ] && group=$4
+[ $# -gt 3 ] && benches=$2
+
+for bench in "$benches"
+do
+ echo "" >$FULL
+ echo "" >$LOG
+ _log "*** benchmark started (passes=$passes, benchmark=$bench)"
+ _log "*** (`date`)"
+ _log " *** unmounting scratch device"
+ umount $SCRATCH_DEV 2>&1 | _fix_malloc >>$FULL
+
+ _run_benchmark # $passes $bench $user $group
+
+ _log "*** done $bench"
+done
#
# - This script is shared by the stress test system and the auto-qa
-# system
+# system (includes both regression test and benchmark components).
# - TEST_DEV & TEST_DIR must be assigned.
# - this script shouldn't make any assertions about filesystem
# validity or mountedness.
#
-_readlink()
-{
- if [ $# -ne 1 ]
- then
- echo "Usage: _readlink filename" 1>&2
- exit 1
- fi
+HOST=`hostname -s`
+MODULAR=0 # using XFS as a module or not
+BOOT="/boot" # install target for kernels
+export EXTRA=${EXTRA:=-xfs-qa}
- perl -e "\$in=\"$1\";" -e '
- $lnk = readlink($in);
- if ($lnk =~ m!^/.*!) {
- print "$lnk\n";
- }
- else {
- chomp($dir = `dirname $in`);
- print "$dir/$lnk\n";
- }'
-}
+# general parameters (mainly for auto-qa)
+SOAK_PROC=3 # -p option to fsstress
+SOAK_STRESS=10000 # -n option to fsstress
+SOAK_PASSES=-1 # count of repetitions of fsstress (while soaking)
+BENCH_PASSES=5 # count of repetitions of benchmarks (want averages)
+EMAIL=root@localhost # where auto-qa will send its status messages
+export MKFS_OPTIONS=${MKFS_OPTIONS:=-bsize=4096}
+export MOUNT_OPTIONS=${MOUNT_OPTIONS:=-ologbufs=2}
+export MALLOCLIB=${MALLOCLIB:=/usr/lib/libefence.a}
-
-case `hostname -s`
+case "$HOST"
in
bruce)
+ MODULAR=0
+ EMAIL="nathans@larry"
TEST_DEV=/dev/sda10
TEST_DIR=/mnt/xfs1
SCRATCH_DEV=/dev/sda9
SCRATCH_MNT=/mnt/xfs0
;;
sagan)
+ MODULAR=1
+ EMAIL="tes@larry"
TEST_DEV=/dev/sda6
TEST_DIR=/mnt/xfs0
SCRATCH_DEV=/dev/sda7
RMT_TAPE_USER=guest
;;
frodo)
+ MODULAR=0
+ EMAIL="nathans@larry"
TEST_DEV=/dev/hda6
TEST_DIR=/mnt/test
SCRATCH_DEV=/dev/hda7
SCRATCH_MNT=/mnt/scratch
;;
troppo)
+ MODULAR=0
+ EMAIL="kaos@larry"
TEST_DEV=/dev/hdb13
TEST_DIR=/mnt/test
SCRATCH_DEV=/dev/hdb14
SCRATCH_MNT=/mnt/sda2
SCRATCH_LOGDEV=/dev/sda3
;;
- dmfnt2)
+ dmfnt2)
TEST_DEV=/dev/sda6
TEST_DIR=/mnt/test
SCRATCH_DEV=/dev/sdc6
RMT_TAPE_USER=guest
;;
*)
- echo "common.config: Error: need to define parameters for host `hostname -s`"
+ echo "common.config: Error: need to define parameters for host $HOST"
exit 1
;;
esac
exit 1
fi
+_readlink()
+{
+ if [ $# -ne 1 ]
+ then
+ echo "Usage: _readlink filename" 1>&2
+ exit 1
+ fi
+
+ perl -e "\$in=\"$1\";" -e '
+ $lnk = readlink($in);
+ if ($lnk =~ m!^/.*!) {
+ print "$lnk\n";
+ }
+ else {
+ chomp($dir = `dirname $in`);
+ print "$dir/$lnk\n";
+ }'
+}
+
# if devfs is running expand the full /dev/.. pathname - this is what will be
# returned by utilities such as mount
[ -L "$TEST_DEV" ] && TEST_DEV=`_readlink $TEST_DEV`
# configuration (you could tune this)
-BOOT="/boot"
-SOAK_PASSES="-1"
-SOAK_STRESS="10000"
-SOAK_PROC="3"
-export EXTRA=${EXTRA:=-xfs-qa}
-export MKFS_OPTIONS=${MKFS_OPTIONS:=-bsize=4096}
-export MOUNT_OPTIONS=${MOUNT_OPTIONS:=-ologbufs=2}
-export MALLOCLIB=${MALLOCLIB:=/usr/lib/libefence.a}
-
_log()
{
echo "$*" >&2
echo "$*" >> $LOG
+ sync
}
_fail()
case $state
in
cron*)
- mail -s "XFS QA status report" $ADMINEMAIL \
+ mail -s "XFS QA status report" $EMAIL \
< $LOG 2>&1
;;
esac
SH="/bin/sh"
LOG="$ROOT/qa.log"
-# need to add auto-qa hosts here
-
-case $HOST
-in
- bruce)
- EMAIL="nathans@larry"
- ADMINEMAIL="nathans@larry"
- MODULAR=0
- ;;
- sagan)
- EMAIL="tes@larry"
- ADMINEMAIL="tes@larry"
- MODULAR=1
- ;;
- troppo)
- EMAIL="kaos@larry"
- ADMINEMAIL="kaos@larry"
- MODULAR=0
- ;;
- frodo)
- EMAIL="nathans@larry"
- ADMINEMAIL="nathans@larry"
- MODULAR=0
- ;;
- *)
- _fail "auto-qa: no configuration information for host '$HOST'"
- ;;
-esac
-
# do some cleanup on exit
_cleanup()
*restart)
_log " *** select qa kernel"
- _sudo /sbin/lilo -R linux-xfs-qa 2>&1 \
+ _sudo /sbin/lilo -R linux-xfs-qa $KERNEL_OPTIONS 2>&1 \
|| _fail " !!! lilo failed"
_log " *** prepare to restart"
new_state="run"
;;
-
soak-run)
cd $QADIR
_log " *** run soak test"
- _sudo ./soak $SOAK_PASSES $SOAK_STRESS $SOAK_PROC\
+ _sudo ./soak $SOAK_PASSES $SOAK_STRESS $SOAK_PROC \
+ || _fail " !!! failed to run soak test"
+
+ new_state="done"
+ ;;
+
+ bench-run)
+ cd $QADIR
+
+ _log " *** run benchmarks"
+ _sudo ./bench $BENCH_PASSES `id -u && id -g` \
|| _fail " !!! failed to run soak test"
new_state="done"