X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Frundbench;h=d36671228e2d8eb7bebbcfff056a98529efe856e;hb=0439aaadb1b640225d700aeb2ae894d07e9b3c5b;hp=cb417d2579e29d7176443f9612e811218babed5a;hpb=576c9a8212bc6607146d99e3413f7a24cbf91b5c;p=fs%2Flustre-release.git diff --git a/lustre/tests/rundbench b/lustre/tests/rundbench index cb417d2..d366712 100755 --- a/lustre/tests/rundbench +++ b/lustre/tests/rundbench @@ -1,13 +1,157 @@ -#!/bin/sh - -DIR=${DIR:-/mnt/lustre/`hostname`} -#[ -e /proc/sys/portals/debug ] && echo 0 > /proc/sys/portals/debug -mkdir -p $DIR -TGT=$DIR/client.txt -SRC=${SRC:-/usr/lib/dbench/client.txt} -[ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT -SRC=/usr/lib/dbench/client_plain.txt -[ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT -cd $DIR -echo "running 'dbench $@' on $PWD at `date`" -dbench -c client.txt $@ +#!/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