Viewing: rundbench
#!/usr/bin/bash
set -o errexit
set -o pipefail
MOUNT=${MOUNT:-/mnt/lustre}
DIR=${DIR:-$MOUNT/$HOSTNAME}
SCRIPT=$(realpath "$0")
LUSTRE=${LUSTRE:-$(dirname "$SCRIPT")/..}
. $LUSTRE/tests/test-framework.sh
CHROOT="no"
PREFIX="on"
LIBS71=()
DBENCHPID=""
usage() {
cat <<-EOF
Usage: $SCRIPT [-C] [-D DIR] [dbench options]
-C use chroot instead of change directory
-D DIR use DIR as work directory
EOF
exit 1
}
clean_dbench() {
local rc=$?
trap '' ERR HUP INT TERM EXIT
if (( rc > 128 )); then
local signal=$((rc - 128))
echo "dbench killed by signal $signal"
rc=0
fi
echo "stopping dbench $PREFIX $DIR at $(date) with return code $rc"
if [[ -n "$DBENCHPID" ]]; then
if ps -h -p "$DBENCHPID" && kill "$DBENCHPID"; then
echo "killed dbench main pid $DBENCHPID"
fi
fi
if [[ -d "$DIR" ]]; then
echo "clean dbench files $PREFIX $DIR"
pushd "$DIR"
rm -frv clients client.txt dbench "${LIBS71[@]}"
popd
fi
if (( rc == 0 )); then
echo "dbench successfully finished"
else
echo "dbench exit with error $rc"
fi
exit $rc
}
trap clean_dbench ERR HUP INT TERM EXIT
if [[ -n "$DBENCH_LIB" ]]; then
PATH=${DBENCH_LIB}:${PATH}
fi
while getopts "CD:" OPT; do
case "$OPT" in
D) test -d "$OPTARG" && DIR="$OPTARG" ;;
C) CHROOT="yes" ;;
\?) usage ;;
esac
done
shift $((OPTIND - 1))
echo "looking for dbench program"
if ! type -P dbench; then
if [[ -z "$MISSING_DBENCH_OK" ]]; then
error "dbench is not installed"
fi
skip_env "dbench is not installed"
exit 0
fi
if [[ ! -d "$DIR" ]]; then
echo "creating output directory $DIR"
mkdir -pv "$DIR"
fi
if ! cd "$DIR"; then
error "failed to change directory to $DIR"
fi
if [[ -n "$DBENCH_SRC" && -s "$DBENCH_SRC" ]]; then
echo "use dbench client file $DBENCH_SRC"
cp -v "$DBENCH_SRC" client.txt
else
CLIENT_DIRS=(/usr/share/dbench /usr/local/share /usr/lib/dbench)
CLIENT_FILES=(client.txt client_plain.txt dbench_client)
if [[ -n "$DBENCH_LIB" ]]; then
CLIENT_DIRS=("$DBENCH_LIB" "${CLIENT_DIRS[@]}")
fi
for CLIENT_DIR in "${CLIENT_DIRS[@]}"; do
for CLIENT_FILE in "${CLIENT_FILES[@]}"; do
CLIENT_PATH="$CLIENT_DIR/$CLIENT_FILE"
if [[ -s "$CLIENT_PATH" ]]; then
echo "found dbench client file $CLIENT_PATH"
cp -v "$CLIENT_PATH" client.txt
break 2
fi
done
done
fi
if [[ ! -s client.txt ]]; then
skip_env "no dbench client file found" \
"DBENCH_LIB=$DBENCH_LIB DBENCH_SRC=$DBENCH_SRC"
exit 0
fi
if [[ "$CHROOT" == "yes" ]]; then
echo "copying required dbench files to chroot directory $DIR"
cp -v "$(type -P dbench)" dbench
LIBS71=($(ldd dbench | awk '
{
if (NF == 2 && $1 ~ /^[/]/)
lib = $1
else if (NF == 4 && $3 ~ /^[/]/)
lib = $3
else
next
print(substr(lib, 2))
}
'))
if (( ${#LIBS71[@]} == 0 )); then
error "failed to get required dbench libraries"
fi
if ! tar -C / -chf - "${LIBS71[@]}" | tar -xvf -; then
error "failed to copy libs ${LIBS71[*]} to $DIR"
fi
RUN="chroot $DIR"
PREFIX="in"
PATH=.:/:$PATH
fi
export PATH
echo "running 'dbench $*' $PREFIX $DIR at $(date)"
$RUN dbench -c client.txt "$@" &
DBENCHPID=$!
echo "waiting for dbench pid $DBENCHPID"
wait $DBENCHPID