#!/bin/bash
# This is the script for running the graphdb benchmark
###SHELLPACK preamble graphdb-bench 0

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}

###SHELLPACK parseargBegin
###SHELLPACK parseargInstall
###SHELLPACK parseargParam --read-threads	GRAPHDB_READ_THREADS
###SHELLPACK parseargParam --write-threads	GRAPHDB_WRITE_THREADS
###SHELLPACK parseargParam --file-size		GRAPHDB_FILESIZE
###SHELLPACK parseargParam --workingset-size	GRAPHDB_WORKINGSET
###SHELLPACK parseargParam --duration		GRAPHDB_DURATION
###SHELLPACK parseargEnd

###SHELLPACK check_install_required graphdb
###SHELLPACK monitor_hooks

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
