#!/bin/bash
# This script runs tbench for varying numbers of clients
P=dbench-bench
DEFAULT_VERSION=4.0
. $SHELLPACK_INCLUDE/common.sh
TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
fi

SERVER_HOST=127.0.0.1
if [ "$REMOTE_SERVER_HOST" != "" ]; then
        SERVER_HOST=$REMOTE_SERVER_HOST
fi

# Basic argument parser
TASKSET_SERVER=
TASKSET_CLIENT=
SERVERSIDE_COMMAND=none
SERVERSIDE_NAME=`date +%Y%m%d-%H%M-%S`

while [ "$1" != "" ]; do
	case "$1" in
	-v)
		VERSION=$2
		shift 2
		;;
	--serverside-command)
		SERVERSIDE_COMMAND=$2
		shift 2
		;;
	--serverside-name)
		SERVERSIDE_NAME=$2
		shift 2
		;;
	--install-only)
		INSTALL_ONLY=yes
		shift
		;;
	--install-force)
		INSTALL_FORCE=yes
		shift
		;;
	--max-clients)
		TBENCH_MAX_CLIENTS=$2
		shift 2
		;;
	*)
		echo Unrecognised option: $1
		shift
	esac
done
if [ "$TASKSET_SERVER" != "" ]; then
	echo TASKSET_SERVER: $TASKSET_SERVER
	echo TASKSET_CLIENT: $TASKSET_CLIENT
fi
if [ -z "$VERSION" ]; then
	VERSION=$DEFAULT_VERSION
fi

install-depends popt-devel
if [ "$INSTALL_FORCE" = "yes" ]; then
	rm -rf $SHELLPACK_SOURCES/dbench-${VERSION}
fi
if [ ! -d $SHELLPACK_SOURCES/dbench-${VERSION}-installed ]; then
	mmtests_activity source-install
	$SHELLPACK_INCLUDE/shellpack-install-dbench -v ${VERSION}  || die dbench install script returned error
	mmtests_activity source-installed
fi
cd $SHELLPACK_SOURCES/dbench-${VERSION}-installed || die Failed to cd to dbench install directory
if [ "$INSTALL_ONLY" = "yes" ]; then
	echo dbench installed only as requested.
	exit $SHELLPACK_SUCCESS
fi
# Include monitor hooks
. $SHELLPACK_INCLUDE/include-monitor.sh

server_start() {
	echo Starting tbench_srv
	mmtests_activity tserver-$SERVERSIDE_NAME
	monitor_pre_hook $LOGDIR_RESULTS $NR_THREADS
	if [ "$REMOTE_SERVER_HOST" = "" ]; then
		nohup ./bin/tbench_srv 0<&- &>/dev/null &
		sleep 5
	else
		mmtests_server_ctl start --serverside-name $1
	fi
}

server_stop() {
	echo Stopping tbench_srv
	monitor_post_hook $LOGDIR_RESULTS $NR_THREADS
	if [ "$REMOTE_SERVER_HOST" = "" ]; then
		killall -KILL tbench_srv
	else
		mmtests_server_ctl stop --serverside-name $1
	fi
}

case $SERVERSIDE_COMMAND in
start)
	server_start $SERVERSIDE_NAME
	exit $SHELLPACK_SUCCESS
	;;
stop)
	server_stop $SERVERSIDE_NAME
	exit $SHELLPACK_SUCCESS
	;;
flush)
	exit $SHELLPACK_SUCCESS
	;;
none)
	echo
	;;
*)
	die Unrecognised server-side command
	;;
esac

server_stop 0
NR_THREADS=1
if [ "$NR_THREADS" = "" ]; then
	NR_THREADS=1
fi
THREADS=$NR_THREADS
NR_THREADS=$((NR_THREADS*2))
while [ $NR_THREADS -le $TBENCH_MAX_CLIENTS ]; do
	THREADS="$THREADS $NR_THREADS"
	NR_THREADS=$((NR_THREADS*2))
done
if [ `echo $THREADS | awk '{print $NF}'` -ne $TBENCH_MAX_CLIENTS ]; then
	THREADS="$THREADS $TBENCH_MAX_CLIENTS"
fi
for NR_THREADS in $THREADS; do
	if [ $NR_THREADS -gt $TBENCH_MAX_CLIENTS ]; then
		NR_THREADS=$TBENCH_MAX_CLIENTS
	fi
	mmtests_activity process $NR_THREADS/$TBENCH_MAX_CLIENTS
	server_start $NR_THREADS
	./bin/tbench \
		-t $TBENCH_DURATION \
		$NR_THREADS $SERVER_HOST 2>&1 | tee $LOGDIR_RESULTS/tbench-$NR_THREADS.log \
			|| die Failed to run tbench
	server_stop $NR_THREADS
	kill -9 $PID_SERVER
done

exit $SHELLPACK_SUCCESS
#### Description tbench
#### Details tbench-bench 4
#### Description tbench
#### Details tbench-bench 20
