#!/bin/bash
# This is the script for running the graphdb benchmark
P=graphdb-bench
DEFAULT_VERSION=0
. $SHELLPACK_INCLUDE/common.sh
TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
fi

GRAPHDB_READ_DELAY=${GRAPHDB_READ_DELAY:=20000}
GRAPHDB_MAX_WRITE_DELAY=${GRAPHDB_MAX_WRITE_DELAY:=100000}
GRAPHDB_IO_READ_LATENCY_THRESHOLD=${GRAPHDB_IO_READ_LATENCY_THRESHOLD:=200}
GRAPHDB_IO_WRITE_LATENCY_THRESHOLD=${GRAPHDB_IO_WRITE_LATENCY_THRESHOLD:=400}
GRAPHDB_VM_LATENCY_THRESHOLD=${GRAPHDB_VM_LATENCY_THRESHOLD:=10}

# 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
		;;
	--read-threads)
		GRAPHDB_READ_THREADS=$2
		shift 2
		;;
	--write-threads)
		GRAPHDB_WRITE_THREADS=$2
		shift 2
		;;
	--file-size)
		GRAPHDB_FILESIZE=$2
		shift 2
		;;
	--workingset-size)
		GRAPHDB_WORKINGSET=$2
		shift 2
		;;
	--duration)
		GRAPHDB_DURATION=$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

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

pushd $SHELLPACK_SOURCES/graphdb-${VERSION}-installed > /dev/null
RESULTSLOG=$LOGDIR_RESULTS/graphdb

# Build test program
GB=$((1048576*1024))
GRAPHDB_WORKINGSET=$(((GRAPHDB_WORKINGSET+GB)&~(GB-1)))
NR_FILES=$((GRAPHDB_WORKINGSET/GRAPHDB_FILESIZE))
sed -i -e "s/int FILE_SIZE =.*/int FILE_SIZE = $GRAPHDB_FILESIZE;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/int NUM_FILES =.*/int NUM_FILES = $NR_FILES;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/int NUM_READ_THREADS =.*/int NUM_READ_THREADS = $GRAPHDB_READ_THREADS;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/int NUM_WRITE_THREADS =.*/int NUM_WRITE_THREADS = $GRAPHDB_WRITE_THREADS;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/int DURATION =.*/int DURATION = $GRAPHDB_DURATION;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/long IO_READ_LATENCY_THRESHOLD =.*/long IO_READ_LATENCY_THRESHOLD = $GRAPHDB_IO_READ_LATENCY_THRESHOLD;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/long IO_WRITE_LATENCY_THRESHOLD =.*/long IO_WRITE_LATENCY_THRESHOLD = $GRAPHDB_IO_WRITE_LATENCY_THRESHOLD;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/long VM_LATENCY_THRESHOLD =.*/long VM_LATENCY_THRESHOLD = $GRAPHDB_VM_LATENCY_THRESHOLD;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/useconds_t read_delay =.*/useconds_t read_delay = $GRAPHDB_READ_DELAY;/" graphdb.cpp || die Failed to edit driver
sed -i -e "s/useconds_t max_write_delay =.*/useconds_t max_write_delay = $GRAPHDB_MAX_WRITE_DELAY;/" graphdb.cpp || die Failed to edit driver
g++ -O2 -g -Wall -lpthread graphdb.cpp -o graphdb || die Failed to build driver program
cp graphdb.cpp $LOGDIR_RESULTS

# Setup input data
cd $SHELLPACK_DATA
mkdir mmap_set_0
mkdir mmap_set_1
mkdir mmap_live_data

NR_TEMPLATE=10
if [ $NR_FILES -lt $NR_TEMPLATE ]; then
	NR_TEMPLATE=NR_FILES
fi
for i in `seq 0 $NR_TEMPLATE`; do
	echo Creating random file ${i}.dat of $NR_FILES, size $((GRAPHDB_FILESIZE/1048576))MB
	dd if=/dev/urandom of=mmap_set_0/${i}.dat ibs=1048575 count=$((GRAPHDB_FILESIZE/1048576)) 2> /dev/null || die Failed to create file
	cp mmap_set_0/${i}.dat mmap_set_1/${i}.dat || die Failed to create file
done
for i in `seq $((NR_TEMPLATE+1)) $NR_FILES`; do
	INDEX=$((i%NR_TEMPLATE))
	echo Copying random file ${INDEX}.dat of $NR_FILES to ${i}.dat
	cp mmap_set_0/${INDEX}.dat mmap_set_0/${i}.dat || die Failed to copy fileset 0
	cp mmap_set_1/${INDEX}.dat mmap_set_1/${i}.dat || die Failed to copy fileset 1
done

# Sync and drop cache for cold start
sync
echo 3 > /proc/sys/vm/drop_caches

# Run the benchmark
mmtests_activity $CONN_NAME-$NR_THREADS
monitor_pre_hook $LOGDIR_RESULTS $NR_THREADS
$SHELLPACK_SOURCES/graphdb-${VERSION}-installed/graphdb
cat *-latency.dat | sort -n > $LOGDIR_RESULTS/graphdb.log
gzip $LOGDIR_RESULTS/graphdb.log
rm *-latency.dat
monitor_post_hook $LOGDIR_RESULTS $NR_THREADS

exit $SHELLPACK_SUCCESS
#### Description graphdb
#### Details graphdb-bench 29
