#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin

BLKDEV=${1}
PREFIX=${2}

if [ -z "${BLKDEV}" ]
then
	echo "Usage: ${0} blockdev"
	exit 1
fi

#if [ ! -b ${BLKDEV} ]
#then
#	echo "${BLKDEV} is not a block device!"
#	exit 1
#fi

BD=`basename ${BLKDEV}`

BD_SIZE64=`blockdev --getsize64 ${BLKDEV}`
BD_BSZ=`blockdev --getbsz ${BLKDEV}`

if [ -z "${XDD}" ]
then
	XDD=/sbin/xdd.linux
fi
XDD_QUEUEDEPTHS="1 2 4 8 16 32 64 128"
if [ -z "${XDD_BLOCKSIZE}" ]
then
	XDD_BLOCKSIZE=${BD_BSZ}
fi
XDD_REQSIZES="1 2 4 8 16 32 64 128 256 512"
XDD_PASSES=1
if [ -z "${XDD_MBYTES}" ]
then
#	XDD_MBYTES=`expr ${BD_SIZE64} / 1048576`
	XDD_MBYTES=256
fi

if [ -n "${PREFIX}" ]
then
	PREFIX="${PREFIX}."
fi

OUTDIR=/tmp/perftest/${PREFIX}${BD}.`date +%Y-%m-%d.%H-%M-%S.$$`

mkdir -p ${OUTDIR} || exit 1

echo "Wipe the disk..."
dd if=/dev/zero of=${BLKDEV} bs=${XDD_MBYTES}M count=1 oflag=direct
echo ""

BD_INFO=${OUTDIR}/blockdev.txt

echo "#dev.path=${BLKDEV}" | tee -a ${BD_INFO}
echo "#dev.size=${BD_SIZE64}" | tee -a ${BD_INFO}
for p in hw_sector_size physical_block_size logical_block_size minimum_io_size optimal_io_size max_sectors_kb max_hw_sectors_kb nr_requests read_ahead_kb rq_affinity scheduler nomerges rotational
do
	v="unknown"
	[ -r /sys/block/${BD}/queue/${p} ] && v=`cat /sys/block/${BD}/queue/${p}`
	echo "#dev.${p}=${v}" | tee -a ${BD_INFO}
done

cat <<EOF > ${OUTDIR}/index.html
<html>
	<table border="1" align="center">
		<tr>
			<td><img src="xdd-op_read.png"></img></td>
		</tr>
		<tr>
			<td><img src="xdd-op_write.png"></img></td>
		</tr>
	</table>
</html>
EOF

ulimit -s 128

for op in write read
do
	gpi=${OUTDIR}/xdd-op_${op}.gpi
	echo "set term png" >> ${gpi}
	echo "set output 'xdd-op_${op}.png'" >> ${gpi}
	echo "set title 'XDD ${op} test of ${BLKDEV}'" >> ${gpi}
	echo "set xlabel 'reqsize [B]'" >> ${gpi}
	echo "set logscale x" >> ${gpi}
	echo "set ylabel 'rate [MB/s]'" >> ${gpi}
	echo "set yrange [0:]" >> ${gpi}
	echo "set grid" >> ${gpi}
	xtics=""
	first=1
	for rs in ${XDD_REQSIZES}
	do
		bs=`expr ${XDD_BLOCKSIZE} \* ${rs}`
		#if [ ${bs} -gt 2097152 ]
		#then
		#	break
		#fi
		if [ ${bs} -lt 1024 ]
		then
			xt="${bs}B"
		elif [ ${bs} -lt 1048576 ]
		then
			xt="`expr ${bs} / 1024`K"
		else
			xt="`expr ${bs} / 1048576`M"
		fi
		if [ ${first} -gt 0 ]
		then
			xtics="set xtics ('${xt}' ${bs}"
			first=0
		else
			xtics="${xtics}, '${xt}' ${bs}"
		fi
	done
	xtics="${xtics})"
	echo "${xtics}" >> ${gpi}

	plot=""
	first=1
	for qd in ${XDD_QUEUEDEPTHS}
	do
		data=xdd-op_${op}-qd_${qd}.dat
		if [ ${first} -gt 0 ]
		then
			plot="plot '${data}' title 'threads: ${qd}' with lines"
			first=0
		else
			plot="${plot}, '${data}' title 'threads: ${qd}' with lines"
		fi
	done
	echo "${plot}" >> ${gpi}

	for qd in ${XDD_QUEUEDEPTHS}
	do
		data=${OUTDIR}/xdd-op_${op}-qd_${qd}.dat
		for rs in ${XDD_REQSIZES}
		do
			bs=`expr ${XDD_BLOCKSIZE} \* ${rs}`
			#if [ ${bs} -gt 2097152 ]
			#then
			#	break
			#fi
			TMPFILE=${OUTDIR}/xdd-op_${op}-qd_${qd}-rs_${rs}.log
			sleep 2
			${XDD} -targets 1 ${BLKDEV} -op ${op} -queuedepth ${qd} -blocksize ${XDD_BLOCKSIZE} -reqsize ${rs} -mbytes ${XDD_MBYTES} -passes ${XDD_PASSES} -dio -verbose 2>&1 | sed 's/ //g' | tee ${TMPFILE}
			if [ $? -ne 0 ]
			then
				echo "FAILED"
				echo ""
				cat ${TMPFILE}
				echo ""
				exit 1
			fi
			rate=`cat ${TMPFILE} | grep -E '[[:blank:]]+Combined[[:blank:]]+.*' | awk '{ print $7 }' | cut -d '.' -f 1`
			echo "${bs} ${rate}" >> ${data}
		done
	done
done

echo "Packing results into ${OUTDIR}.tgz"
tar -zcf ${OUTDIR}.tar.gz ${OUTDIR}
echo "Done"
exit 0
