#!/bin/bash
# This script installs fsmark and runs the regression tests

###SHELLPACK preamble fsmark-bench 3.3
MIN_THREADS=1
MAX_THREADS=1
NR_SUB_DIRECTORIES=100
NR_FILES_PER_ITERATION=50000
ITERATIONS=63
FILESIZE=0

###SHELLPACK parseargBegin
###SHELLPACK parseargInstall
###SHELLPACK parseargParam --min-threads            MIN_THREADS
###SHELLPACK parseargParam --max-threads            MAX_THREADS
###SHELLPACK parseargParam --filesize               FILESIZE
###SHELLPACK parseargParam --nr-files-per-iteration NR_FILES_PER_ITERATION
###SHELLPACK parseargParam --nr-top-directories     FSMARK_NR_TOP_DIRECTORIES
###SHELLPACK parseargParam --nr-sub-directories     NR_SUB_DIRECTORIES
###SHELLPACK parseargParam --sync-mode              FSMARK_SYNCMODE
###SHELLPACK parseargParam --iterations             ITERATIONS
###SHELLPACK parseargEnd
###SHELLPACK monitor_hooks

###SHELLPACK check_install_required fsmark-${VERSION}
###SHELLPACK init_complete

ln -s $SHELLPACK_DATA /tmp/fsmark-$$

# Scale iterations to fit on the disk
ACTUAL_DISKSIZE=`df -k $SHELLPACK_DATA | tail -1 | awk '{print $4}'`
ACTUAL_INODES=`df -i $SHELLPACK_DATA | tail -1 | awk '{print $4}'`
ACTUAL_DISKSIZE=$((ACTUAL_DISKSIZE*1024))
USABLE_DISKSIZE=$((ACTUAL_DISKSIZE*7/10))
ESTIMATED_INODES=$((NR_FILES_PER_ITERATION*ITERATIONS))
ESTIMATED_USAGE=$((FILESIZE*ESTIMATED_INODES))

echo Requested iterations: $ITERATIONS, estimated usage $((ESTIMATED_USAGE/(1048576*1024)))GB inodes $ESTIMATED_INODES, diskspace $((ACTUAL_DISKSIZE/(1048576*1024)))GB inodes $ACTUAL_INODES

if [ $ESTIMATED_USAGE -gt $USABLE_DISKSIZE ]; then
	while [ $ESTIMATED_USAGE -gt $USABLE_DISKSIZE ]; do
		ITERATIONS=$((ITERATIONS-1))
		ESTIMATED_USAGE=$((FILESIZE*NR_FILES_PER_ITERATION*ITERATIONS))
	done
	echo Requested iterations: $ITERATIONS, estimated usage $((ESTIMATED_USAGE/(1048576*1024)))GB inodes $ESTIMATED_INODES, diskspace $((ACTUAL_DISKSIZE/(1048576*1024)))GB inodes $ACTUAL_INODES
	echo Revised due to size:  $ITERATIONS, estimated usage $((ESTIMATED_USAGE/(1048576*1024)))GB inodes $ESTIMATED_INODES, diskspace $((ACTUAL_DISKSIZE/(1048576*1024)))GB inodes $ACTUAL_INODES
fi

if [ $ACTUAL_INODES -gt 0 -a $ESTIMATED_INODES -gt $ACTUAL_INODES ]; then
	while [ $ESTIMATED_INODES -gt $ACTUAL_INODES ]; do
		ITERATIONS=$((ITERATIONS-1))
		ESTIMATED_INODES=$((NR_FILES_PER_ITERATION*ITERATIONS))
		ESTIMATED_USAGE=$((FILESIZE*ESTIMATED_INODES))
	done
	echo Revised due to inode: $ITERATIONS, estimated usage $((ESTIMATED_USAGE/(1048576*1024)))GB inodes $ESTIMATED_INODES, diskspace $((ACTUAL_DISKSIZE/(1048576*1024)))GB inodes $ACTUAL_INODES

fi

if [ $ITERATIONS -le 0 ]; then
	fail_log "Disk is too small to potentially run benchmark"
	die "Disk is too small to potentially run benchmark"
fi

echo Testing iterations: $ITERATIONS, estimated usage $((ESTIMATED_USAGE/(1048576*1024)))GB inodes $ESTIMATED_INODES, diskspace $((ACTUAL_DISKSIZE/(1048576*1024)))GB inodes $ACTUAL_INODES

PARAM_EXTRA=
if [ "$FSMARK_KEEP_FILES" = "yes" ]; then
	PARAM_EXTRA+=" -k"
fi

###SHELLPACK threads_large_stride_begin $MIN_THREADS $MAX_THREADS
	NR_TOP_DIRECTORIES=0
	if [ "$FSMARK_NR_TOP_DIRECTORIES" = "nr_threads" ]; then
		NR_TOP_DIRECTORIES=$NR_THREADS
	else
		NR_TOP_DIRECTORIES=$FSMARK_NR_TOP_DIRECTORIES
	fi
	FSMARK_MAX_FILES=$(($NR_FILES_PER_ITERATION/$NR_TOP_DIRECTORIES))
	if [ $FSMARK_MAX_FILES -gt 1000000 ]; then
		echo WARNING: Limiting max files to 1000000
		FSMARK_MAX_FILES=1000000
	fi
	PARAMETERS=$PARAM_EXTRA
	PARAMETERS+=" -D $NR_SUB_DIRECTORIES"
	PARAMETERS+=" -S$FSMARK_SYNCMODE"
	PARAMETERS+=" -n $FSMARK_MAX_FILES"
	PARAMETERS+=" -s $FILESIZE"
	PARAMETERS+=" -L $ITERATIONS"
	PARAMETERS+=" -t $NR_THREADS"
	for TOPDIR in `seq 1 $NR_TOP_DIRECTORIES`; do
		mkdir -p /tmp/fsmark-$$/$TOPDIR
		PARAMETERS+=" -d /tmp/fsmark-$$/$TOPDIR"
	done

	# Cleanup previous thread count data
	echo Cleaning up old fs_mark test files
	rm -rf $SHELLPACK_DATA/*

	BENCH_CMD="./fs_mark $PARAMETERS"
	log_cmd $BENCH_CMD
	monitor_pre_hook $LOGDIR_RESULTS $NR_THREADS
	eval $BENCH_CMD &> $LOGDIR_RESULTS/fsmark-${NR_THREADS}.log
	RET=$?
	monitor_post_hook $LOGDIR_RESULTS $NR_THREADS
	gzip $LOGDIR_RESULTS/fsmark-${NR_THREADS}.log

	if [ $RET -ne 0 ]; then
		zgrep -q "No space left on device" $LOGDIR_RESULTS/fsmark-${NR_THREADS}.log.gz
		if [ $? -eq 0 -a $FILESIZE -eq 0 ]; then
			echo Warning: Ignoring failure due to inode exhaustion on zero-sized files
		else
			die "Benchmark failed to execute"
		fi
	fi
###SHELLPACK threads_stride_end

rm /tmp/fsmark-$$
rm -rf $SHELLPACK_DATA/fsmark-$$

exit $SHELLPACK_SUCCESS
