#!/bin/bash
#Script to run bonnie++ io tests
# Copyright Peter Sjoberg ( peters-gpl AT techwiz.ca )
# License: GPL
# 2005-12-19: Created
#

TESTUSER=peters
TESTDIR=/test
DISKSIZE=18G

################################################################
DoTestSize()
{
    local TESTDIR
    TESTDIR=${1:-/test}
    
#Get memorysize in mb
    MEMSIZE=$(grep MemTotal /proc/meminfo|awk '{print $2"/1024"}'|bc)
    [ $MEMSIZE -gt 180 -a $MEMSIZE -lt 193 ] && MEMSIZE=192
    [ $MEMSIZE -gt 220 -a $MEMSIZE -lt 257 ] && MEMSIZE=256
    [ $MEMSIZE -gt 490 -a $MEMSIZE -lt 513 ] && MEMSIZE=512
    [ $MEMSIZE -gt 980 -a $MEMSIZE -lt 1025 ] && MEMSIZE=1024
    [ $MEMSIZE -gt 1980 -a $MEMSIZE -lt 2049 ] && MEMSIZE=2048

#Test filesize=4*memsize
    FILESIZE=$(echo $MEMSIZE*4|bc)
    
    SPACEFREE=$(df -kP $TESTDIR|tail -1|awk '{print $4"/1024"}'|bc)
    if [ $SPACEFREE -lt $FILESIZE ]
	then
	echo Not enough free space on $TESTDIR, need $FILESIZE  but it is only $SPACEFREE
	echo ABORT
	exit 1
    fi
    
    chown $TESTUSER $TESTDIR;bonnie++ -d $TESTDIR -s $FILESIZE -u $TESTUSER
    echo /usr/bin/time bonnie++ -d $TESTDIR -f -s$FILESIZE -f -u $TESTUSER -m $HOSTNAME
    /usr/bin/time bonnie++ -d $TESTDIR -f -s$FILESIZE -f -u $TESTUSER -m $HOSTNAME
} # DoTest-size()

################################################################
DoTestCount()
{
    local TESTDIR FILECOUNT FILESIZE
    TESTDIR=${1:-/test}
    FILECOUNT=${2:-10}
#max:min:dirs
    FILESIZERANGE=${3:-"5555:4444:1"}
    
    chown $TESTUSER $TESTDIR
    echo /usr/bin/time bonnie++ -d $TESTDIR -f -s0 -u $TESTUSER -m $HOSTNAME -n$FILECOUNT:$FILESIZERANGE
    /usr/bin/time bonnie++ -d $TESTDIR -f -s0 -u $TESTUSER -m $HOSTNAME -n$FILECOUNT:$FILESIZERANGE
} # DoTest-count
################################################################
DoTest()
{
    local TESTDIR FILECOUNT FILESIZE
    TESTDIR=${1:-/test}
    FILECOUNT=${2:-10}
#max:min:dirs
    FILESIZERANGE=${3:-"5555:4444:1"}

#Get memorysize in mb
    MEMSIZE=$(grep MemTotal /proc/meminfo|awk '{print $2"/1024"}'|bc)
    [ $MEMSIZE -gt 180 -a $MEMSIZE -lt 193 ] && MEMSIZE=192
    [ $MEMSIZE -gt 220 -a $MEMSIZE -lt 257 ] && MEMSIZE=256
    [ $MEMSIZE -gt 490 -a $MEMSIZE -lt 513 ] && MEMSIZE=512
    [ $MEMSIZE -gt 980 -a $MEMSIZE -lt 1025 ] && MEMSIZE=1024
    [ $MEMSIZE -gt 1980 -a $MEMSIZE -lt 2049 ] && MEMSIZE=2048

#Test filesize=4*memsize
    let FILESIZE=$MEMSIZE*4
    
    SPACEFREE=$(df -kP $TESTDIR|tail -1|awk '{print $4"/1024"}'|bc)
    if [ $SPACEFREE -lt $FILESIZE ]
	then
	echo Not enough free space on $TESTDIR, need $FILESIZE  but it is only $SPACEFREE
	echo ABORT
	exit 1
    fi

    chown $TESTUSER $TESTDIR
    echo /usr/bin/time bonnie++ -d $TESTDIR -f -s$FILESIZE -f -u $TESTUSER -m $HOSTNAME -n$FILECOUNT:$FILESIZERANGE
    /usr/bin/time bonnie++ -d $TESTDIR -f -s$FILESIZE -u $TESTUSER -m $HOSTNAME -n$FILECOUNT:$FILESIZERANGE
} # DoTest-count
################################################################

################################################################
################
# Prep the fs

FS=/dev/vgr/testlv

PrepLVM()
{
    cd /
    grep $FS /proc/mounts &>/dev/null && umount $FS
    [ -r $FS ] && lvremove -f $FS
    
    lvcreate -L$DISKSIZE -n testlv vgr
    
    if [ ! -r $FS ] ; then
	echo "Can't prepare a filesystem to test on"
	echo "ABORTING"
	exit 1
    fi
    
} # PrepLVM()

PrepRaw()
{
    cd /
    grep $FS /proc/mounts &>/dev/null && umount $FS
    
    if [ ! -r $FS ] ; then
	echo "Can't prepare a filesystem to test on"
	echo "ABORTING"
	exit 1
    fi
    
} # PrepRaw()

#FS=/dev/vgr/testlv
#PrepLVM

FS=/dev/hda1
PrepRaw
if [ ! -d $TESTDIR ]
    then
    rm -rf $TESTDIR
    mkdir $TESTDIR
fi

FILECOUNT=2000
#FILECOUNT=200

echo '################################################################'
echo '################################################################'
echo $(date +"%Y%m%d %H%M%S; ")"Test with reisterfs"
mkfs.reiserfs -f $FS && mount $FS $TESTDIR && DoTest $TESTDIR $FILECOUNT
umount $FS

echo '################################################################'
echo '################################################################'
echo $(date +"%Y%m%d %H%M%S; ")"Test with ext3"
mkfs.ext3 $FS && mount $FS $TESTDIR && DoTest $TESTDIR $FILECOUNT
umount $FS

echo '################################################################'
echo '################################################################'
echo $(date +"%Y%m%d %H%M%S; ")"Test with xfs"
mkfs.xfs -f $FS && mount $FS $TESTDIR && DoTest $TESTDIR $FILECOUNT
umount $FS

echo '################################################################'
echo '################################################################'
echo $(date +"%Y%m%d %H%M%S; ")"Test with ext2"
mkfs.ext2 $FS && mount $FS $TESTDIR && DoTest $TESTDIR $FILECOUNT
umount $FS

echo '################################################################'
echo '################################################################'
echo $(date +"%Y%m%d %H%M%S; ")"Test with jfs"
mkfs.jfs $FS && mount $FS $TESTDIR && DoTest $TESTDIR $FILECOUNT
umount $FS

echo '################################################################'
echo '################################################################'
echo $(date +"%Y%m%d %H%M%S; ")DONE

