blob: 095e0c0ef2b57e459150c5fd5c29e04d9467ef05 [file] [log] [blame]
#!/bin/bash
# Main pounder control script.
# Copyright (C) 2003-2006 IBM
#
# 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; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will 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 to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# By default, pounder runs forever. Howver, the -k option can be used to stop
# all the tests. Our process ID (which is the process-group ID of all our
# children) is saved in a file called pounder_pgrp in the POUNDER_HOME
# directory. A negative sign is prepended to the PID so that a simple
# "kill -TERM `cat $POUNDER_HOME/pounder_pgrp`" will stop all the tests.
#
# Howver, if a test starts an xterm, then all its sub-processes will run under
# a new process-group, which requires that the test regester its own PID (with
# a negative sign prepended) to the pounder_pgrp file. See the testtime script
# for an example of this.
#
# To schedule pounder to run for a limited length of time, use the -d option
# to set a duration in hours for the run. A process will be spawned that will
# sleep the allotted time and then kill the process group(s) in pounder_pgrp.
# If you decide to stop the tests, pounder -k will kill the sleeping process as
# well.
#
# It should also be noted that in order to clean up completly, some tests may
# need to trap interrupts and do some cleanup. See the testnet script for an
# example of this.
#
# Author: Darrick Wong <djwong@us.ibm.com> and John Stultz <johnstul@us.ibm.com>
source libpounder.sh
# This function kills off pounder and related subprocesses.
function dokill() {
echo "Killing off pounder(s)..."
kill -INT `cat $POUNDER_PIDFILE`;
rm -rf $POUNDER_PIDFILE
#killall -9 randasys 2> /dev/null # These run as user 'daemon' and have to be killed manually.
}
# Main function follows
function help() {
cat << ENDL
Usage: $0 [-l logdir] [-x] [-d duration] [-n ipaddr] [-f] [-u|-r|-k] [-s]
-x Enable X stress tests.
-d Run pounder for duration seconds.
-n Use ipaddr for NFS tests.
-f Remove pounder pid file before running.
-u Unmount NFS log storage.
-r Remount NFS log storage.
-l Use logdir as the log directory. (You probably want -s too.)
-s Store logs locally.
-k Kill pounder.
ENDL
}
# process options: -x to run in xterms, -k to kill tests, -d to set duration,
# -f to remove bogus pounder.pid files.
while getopts d:kn:l:xurs? o
do
case "$o" in
d) export DURATION="$OPTARG";;
k) dokill; exit;;
n) export NFS_SERVER="$OPTARG";;
l) export POUNDER_LOGDIR="$OPTARG";;
x) export DO_X_TESTS=1;;
f) rm -rf "$POUNDER_PIDFILE";;
u) umount $POUNDER_HOME/log 2> /dev/null; exit 0;;
s) export NFS_LOGGING=0;;
r) ./nfs_logging; exit;;
'?') help $0; exit 1;;
esac
done
# Did user ask for X tests when DISPLAY is set?
# Probably _not_ what the user wants.
if [ $DO_X_TESTS -eq 1 ] && [ ! -z "$DISPLAY" ]; then
echo "WARNING: X tests are enabled and DISPLAY is set. xterms will appear on this desktop!"
echo "WARNING: Kill pounder NOW if this is not what you intended."
fi
# Get set up to read arguments, even though there aren't any...
shift `expr $OPTIND - 1`
# Are we already running?
if [ -f "$POUNDER_PIDFILE" ]; then
echo "File $POUNDER_PIDFILE exists; pounder may already be running." > /dev/tty
echo "Either run 'pounder -k' to stop all tests, or remove it." > /dev/tty
exit 1
fi
# Did the user run Install?
if [ ! -x run-helper -o ! -x timed_loop -o ! -x infinite_loop ]; then
echo "Could not find run-helper, infinite_loop or timed_loop. Did you run Install?"
exit -1
fi
# Try to mount NFS log store.
if [ -z "$NFS_LOGSERVER" -o -z "$NFS_LOGDIR" ]; then
echo "NFS logging disabled because NFS_LOGSERVER or NFS_LOGDIR are not set."
export NFS_LOGGING=0
else
if [ $NFS_LOGGING -gt 0 ]; then
./nfs_logging
fi
fi
# Set up log directory
mkdir -p "$POUNDER_LOGDIR" 2> /dev/null
if [ ! -d "$POUNDER_LOGDIR" ]; then
echo "Could not create $POUNDER_LOGDIR; aborting." > /dev/tty
exit 1
fi
# Set up dir for optional components
mkdir -p "$POUNDER_OPTDIR"
if [ ! -d "$POUNDER_OPTDIR" ]; then
echo "Could not create $POUNDER_OPTDIR; aborting." > /dev/tty
exit 1
fi
# Set up tmpdir
mkdir -p "$POUNDER_TMPDIR"
if [ ! -d "$POUNDER_TMPDIR" ]; then
echo "Could not create $POUNDER_TMPDIR; aborting." > /dev/tty
exit 1
fi
TEST_HEAD="$1"
if [ -z $TEST_HEAD ]; then
TEST_HEAD=tests
fi
# needs to be a separate check in case there is no tests/ dir...
if [ ! -d "$TEST_HEAD" -a ! -f "$TEST_HEAD" ]; then
echo "$TEST_HEAD does not exist!"
exit 1
fi
# Dump environment variables...
export > "$POUNDER_LOGDIR/environment"
echo "STARTING TESTS." > /dev/tty
echo "To kill all tests, run 'pounder -k' or press ^C."> /dev/tty
# Handle the duration thing...
function kill_after {
sleep $DURATION
./pounder -k
}
if [ ! -z "$DURATION" -a "$DURATION" -gt 0 ]; then
kill_after &
fi
# Now run the tests
./run-helper $TEST_HEAD --leader