#!/bin/bash

P=filebench-bench
DEFAULT_VERSION=1.4.9.1
. $SHELLPACK_INCLUDE/common.sh
TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
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
		;;
	--personality)
		FILEBENCH_PERSONALITY=$2
		shift 2
		;;
	--iterations)
		FILEBENCH_ITERATIONS=$2
		shift 2
		;;
	--working-set)
		FILEBENCH_WORKING_SET=$2
		shift 2
		;;
	--min-threads)
		FILEBENCH_MIN_THREADS=$2
		shift 2
		;;
	--max-threads)
		FILEBENCH_MAX_THREADS=$2
		shift 2
		;;
	--direct-io)
		FILEBENCH_DIRECT_IO=yes
		shift
		;;
	--install-only)
		INSTALL_ONLY=yes
		shift
		;;
	--install-force)
		INSTALL_FORCE=yes
		shift
		;;
	*)
		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

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

echo Disabling VA randomisation as recommended by benchmark
echo 0 > /proc/sys/kernel/randomize_va_space

echo Setting virtual space and stack space use to unlimited
ulimit -u unlimited
ulimit -s unlimited

echo $FILEBENCH_PERSONALITY > $LOGDIR_RESULTS/model

echo -n > $LOGDIR_RESULTS/filebench.script
case $FILEBENCH_PERSONALITY in
oltp)
	FILESIZE=$((FILEBENCH_WORKING_SET/10))
	DURATION=$((FILEBENCH_WORKING_SET/(60*1048576)))
	if [ "$FILEBENCH_DIRECT_IO" = "yes" ]; then
		DIRECT_IO_PARAM=1
	else
		DIRECT_IO_PARAM=0
	fi

	echo "File size:      $FILESIZE"
	echo "Duration:       $DURATION"
	echo "Iterations:     $FILEBENCH_ITERATIONS"
	cat $SHELLPACK_SOURCES/filebench-${VERSION}-installed/share/filebench/workloads/oltp.f | \
		sed -e 's/,useism//' > $SHELLPACK_SOURCES/filebench-${VERSION}-installed/share/filebench/workloads/oltp-noism.f
	cat > $LOGDIR_RESULTS/filebench.script << EOF
	load $SHELLPACK_SOURCES/filebench-${VERSION}-installed/share/filebench/workloads/oltp-noism
	set \$dir=$SHELLPACK_DATA
	set \$filesize=$FILESIZE
	set \$directio=$DIRECT_IO_PARAM
	run $DURATION
EOF
	monitor_pre_hook $LOGDIR_RESULTS oltp-$NR_THREADS
for ITERATION in `seq 1 $FILEBENCH_ITERATIONS`; do
	mmtests_activity iteration $ITERATION
		echo Running filebench iter $ITERATION/$FILEBENCH_ITERATIONS
		save_rc ./bin/filebench -f $LOGDIR_RESULTS/filebench.script 2>&1 \
			| tee $LOGDIR_RESULTS/oltp-1.$ITERATION
		recover_rc
		if [ $? -ne 0 ]; then
			die Failed to run filebench
		fi
done
	monitor_post_hook $LOGDIR_RESULTS oltp-$NR_THREADS
	;;
varmail|webserver|webproxy)
	MEANFILESIZE=$((16*1024))
	NR_FILES=$((FILEBENCH_WORKING_SET/MEANFILESIZE))
	DURATION=$((FILEBENCH_WORKING_SET/(30*1048576)))
	echo "Mean file size: $MEANFILESIZE"
	echo "Number files:   $NR_FILES"
	echo "Duration:       $DURATION"
	echo "Iterations:     $FILEBENCH_ITERATIONS"
THREADS="$FILEBENCH_MIN_THREADS"
THREAD_DIFF=$(($FILEBENCH_MAX_THREADS-$FILEBENCH_MIN_THREADS))
if [ "$THREAD_DIFF" -lt 4 ]; then
	THREADS=`seq $FILEBENCH_MIN_THREADS $FILEBENCH_MAX_THREADS`
else
	for ITER in `seq 2 $((4-1))`; do
		THREADS="$THREADS $((THREAD_DIFF/4*$ITER))"
	done
	THREADS="$THREADS $FILEBENCH_MAX_THREADS"
fi
for NR_THREADS in $THREADS; do
	if [ $NR_THREADS -lt $FILEBENCH_MIN_THREADS ]; then
		continue
	fi
	mmtests_activity process $NR_THREADS/$END_THREAD
	cat > $LOGDIR_RESULTS/filebench.script << EOF
	load $SHELLPACK_SOURCES/filebench-${VERSION}-installed/share/filebench/workloads/$FILEBENCH_PERSONALITY
	set \$dir=$SHELLPACK_DATA
	set \$meanfilesize=$MEANFILESIZE
	set \$nfiles=$NR_FILES
	set \$nthreads=$NR_THREADS
	run $DURATION
EOF
	monitor_pre_hook $LOGDIR_RESULTS $FILEBENCH_PERSONALITY-$NR_THREADS
for ITERATION in `seq 1 $FILEBENCH_ITERATIONS`; do
	mmtests_activity iteration $ITERATION
		echo Running filebench threads $NR_THREADS/$FILEBENCH_MAX_THREADS iter $ITERATION/$FILEBENCH_ITERATIONS
		save_rc ./bin/filebench -f $LOGDIR_RESULTS/filebench.script 2>&1 \
			| tee $LOGDIR_RESULTS/$FILEBENCH_PERSONALITY-$NR_THREADS.$ITERATION
		recover_rc
		if [ $? -ne 0 ]; then
			die Failed to run filebench
		fi
done
	monitor_post_hook $LOGDIR_RESULTS $FILEBENCH_PERSONALITY-$NR_THREADS

done
	;;
*)
	die Unrecognised model $FILEBENCH_PERSONALITY
	;;
esac

exit $SHELLPACK_SUCCESS
#### Description filebench
#### Details filebench-bench 25
