#!/bin/bash

finish() {
for HOST in $HOSTS; do
	ssh -x $HOST << EOF
killall -9 dbt2-client dbt2-post-process dbt2-generate-report dbt2-pgsql-db-stat
EOF
done
}
trap finish EXIT

start_client()
{
	local H=$1

	# Sleep is duration + client rampup + driver rampup + arbitrary 10s
	# Rampup is assumed to be default 1 second per thread.
	ssh -t -x $H << EOF
source dbt2_profile

mkdir -p $OUTDIR
cd $OUTDIR

dbt2-client -f -d localhost -c $CLIENTS -b $PGDATABASE
EOF
}

start_driver()
{
	local H=$1
	local W1=$(( $2 * $RANGE + 1))
	local W2=$(( $W1 + $RANGE - 1 ))

	# Sleep is duration + client rampup + driver rampup + arbitrary 10s
	# Rampup is assumed to be default 1 second per thread.
	ssh -x $H << EOF
source dbt2_profile

mkdir -p $OUTDIR
cd $OUTDIR

dbt2-driver -d localhost -wmin $W1 -wmax $W2 -l $DURATION -w $SCALE_FACTOR -ktd 0 -ktn 0 -kto 0 -ktp 0 -kts 0 -ttd 0 -ttn 0 -tto 0 -ttp 0 -tts 0
EOF
}

start_prof()
{
	local H=$1

	# Arbitrary, but can't let perf data get too big
	#SMALLER=$(( $DURATION / 4 ))
	SMALLER="90"

	ssh -t -x $H << EOF
mkdir -p $OUTDIR/db
cd $OUTDIR/db
sudo perf record -o perf.data -a -g -s sleep $SMALLER
EOF
}

start_stats()
{
	local H=$1

	ssh -t -x $H << EOF
source dbt2_profile

mkdir -p $OUTDIR/db
cd $OUTDIR/db

dbt2-sysstats --iter $SAMPLES --sample $SAMPLE_LENGTH --outdir . > stats.txt 2>&1 &

dbt2-pgsql-db-stat -i $SAMPLES -s $SAMPLE_LENGTH -o . > dbstats.txt 2>&1 &
EOF
}

process_perf()
{
	local H=$1

	ssh -t -x $H << EOF
mkdir -p $OUTDIR/db
cd $OUTDIR/db
sudo perf report -i perf.data -n > perf-report.txt
sudo perf annotate -l -P -i perf.data > perf-annotate.txt
sudo perf script -L -i perf.data > perf-trace.txt
sudo chown ubuntu:ubuntu perf*
EOF
}

process_sar()
{
	local H=$1

	SADF="sadf -d -U"
	FILE="sar_raw.out"

	# Sleep is duration + client rampup + driver rampup + arbitrary 10s
	# Rampup is assumed to be default 1 second per thread.
	ssh -t -x $H << EOF
cd $OUTDIR/db

$SADF -P ALL $FILE > sar-cpu.csv
$SADF $FILE -- -B > sar-paging.csv
$SADF $FILE -- -d -p > sar-blockdev.csv
# Not on ubuntu???
#$SADF $FILE -- -R > sar-mem1.csv
$SADF $FILE -- -r > sar-mem2.csv
$SADF $FILE -- -W > sar-swap.csv
$SADF $FILE -- -n DEV > sar-net.csv
EOF
}

usage()
{
	echo "usage: $0 [options]"
	echo "  options:"
	echo "    -c <database connections per node>"
	echo "    -d <duration in seconds>"
	echo "    -o <output directory>"
	echo "    -P <warehouses per shard>"
	echo "    -p # use linux prof"
	echo "    -w <scale factor>"
}

PROFILE=0
while getopts "c:d:o:P:pw:" OPT; do
	case ${OPT} in
	c)
		CLIENTS=$OPTARG
		;;
	d)
		DURATION=$OPTARG
		;;
	o)
		OUTDIR=$OPTARG
		;;
	P)
		RANGE=$OPTARG
		;;
	p)
		PROFILE=1
		;;
	w)
		SCALE_FACTOR=$OPTARG
		;;
	esac
done
shift $((OPTIND - 1))

HOSTS="$@"

if [ -z $CLIENTS ] || [ -z $DURATION ] || [ -z $OUTDIR ] || [ -z $RANGE ] || \
		[ -z $SCALE_FACTOR ]; then
	usage
	exit 1
fi

SAMPLE_LENGTH=60
SAMPLES=$(( $DURATION + ($RANGE * 10) + $CLIENTS ))
SAMPLES=`expr $SAMPLES / $SAMPLE_LENGTH`
SAMPLES=`expr $SAMPLES + 3`

echo "ramping up clients on each partition..."

for HOST in $@; do
	start_stats $HOST &
	start_client $HOST &
done

sleep $CLIENTS

echo "ramping up drivers on each partition..."

C=0
for HOST in $@; do
	start_driver $HOST $C &
	C=$(( $C + 1 ))
done

sleep $(( $RANGE * 10 ))

if [ $PROFILE -eq 1 ]; then
	for HOST in $@; do
		start_prof $HOST &
	done
fi

sleep $(( $DURATION + 20))

finish

mkdir -p $OUTDIR
cd $OUTDIR

date >> readme.txt
echo "$COMMENT" >> readme.txt
uname -a >> readme.txt
echo "Command line: $0 $@" >> readme.txt

# Output run information into the readme.txt.
echo "RDBMS: pgsql" >> readme.txt
echo "Database Name: $PGDATABASE" >> readme.txt
echo "Database Scale Factor: $SCALE_FACTOR warehouses" >> readme.txt
echo "Test Duration: $DURATION seconds" >> readme.txt
echo "Database Connections: $CLIENTS" >> readme.txt

WPIDS=""
for HOST in $@; do
	process_sar $HOST &
	WPIDS="$WPIDS $!"
	process_perf $HOST &
	WPIDS="$WPIDS $!"
done
wait $WPIDS

for HOST in $@; do
	rsync -avz $HOST:$OUTDIR/ $HOST
done

cat */mix.log > mix.log

for HOST in $@; do
	# copy readme.txt to fake out report script
	cp readme.txt $HOST/
	dbt2-post-process $HOST/mix.log > $HOST/report.txt
	dbt2-generate-report -i $HOST -o $HOST/report
done
dbt2-post-process mix.log > report.txt
dbt2-generate-report -i . -o report
cat report.txt
