#!/bin/bash
#
# This benchmark stresses blktrace by simply generating a lot of IO and running
# blktrace for a configured amount of time. This is a basic stress that is only
# run to stress slab allocations as there was evidence in the past that some
# drivers were corrupting slab in a way that could be caught with this test

. $SHELLPACK_INCLUDE/common.sh
MEMTOTAL_BYTES=`free -b | grep Mem: | awk '{print $2}'`
DURATION=${STRESS_BLKTRACE_DURATION:=3600}
FILESIZE=${STRESS_BLKTRACE_FILESIZE:=MEMTOTAL_BYTES*2}
TESTTHREADS=${STRESS_BLKTRACE_THREADS:=1}
TESTTHREAD_FILESIZE=$((FILESIZE/TESTTHREADS))
DD_BLOCKSIZE=8192
DD_COUNT=$((TESTTHREAD_FILESIZE/DD_BLOCKSIZE))
unset MALLOC_CHECK_

which btrace > /dev/null || die blktrace binary btrace is not installed

STARTTIME=`date +%s`
ENDTIME=$(($STARTTIME+$DURATION))
HEARTBEAT=$(($STARTTIME+10))

# Discover parittion for blktrace and initialise pid files
TRACE_PARTITION=`df $TESTDISK_DIR | tail -1 | awk '{print $1}'`
for TESTTHREAD in `seq 1 $TESTTHREADS`; do
	echo -n > $SHELLPACK_TEMP/thread-$TESTTHREAD.pid
done

# Loop dd and btrace for the configured amount of time
while [ `date +%s` -lt $ENDTIME ]; do

	if [ `date +%s` -gt $HEARTBEAT ]; then
		HEARTBEAT=$(($STARTTIME+10))
	fi
	for TESTTHREAD in `seq 1 $TESTTHREADS`; do
		PIDFILE=$SHELLPACK_TEMP/thread-$TESTTHREAD.pid
		PID=`cat $PIDFILE`
		ALIVE=no
		if [ "$PID" != "" ]; then
			TEST=`ps -p $PID | grep -v PID`
			if [ "$TEST" != "" ]; then
				ALIVE=yes
			fi
		fi
			
		if [ "$PID" = "" -o "$ALIVE" = "no" ]; then
			echo Restarting thread $TESTTHREAD dd
			dd if=/dev/zero of=$TESTDISK_DIR/zerofile-$TESTTHREAD bs=$DD_BLOCKSIZE count=$DD_COUNT &
			echo $! > $PIDFILE
		fi
	done

	# Run trace for a short time
	echo Tracing: `date`
	MALLOC_CHECK_=0 btrace -w 5 $TRACE_PARTITION > /dev/null 2> /dev/null &
	BTRACE_PID=$!
	sleep 8
	TEST=`ps -p $BTRACE_PID | grep -v PID`
	if [ "$TEST" != "" ]; then
		echo Force killing btrace blktrace
		killall btrace blktrace
	fi
	sleep 2
done

echo Killing dd instances
for TESTTHREAD in `seq 1 $TESTTHREADS`; do
	kill -9 `cat $SHELLPACK_TEMP/thread-$TESTTHREAD.pid`
done

echo Cleaning temporary directory
rm -rf $SHELLPACK_TEMP/*
#### Description Stress blktrace which can lead to slab failures
#### Details stress-blktrace-bench 19
