#!/bin/bash 

function force_exit {
    echo "Committing suicide (PID $$)"
    exit
}

trap force_exit SIGINT

. ./config.sh



for COUNT in ${COUNT_ARR[@]}; do
for TYPE in ${TYPE_ARR[@]}; do
for NN in ${NN_ARR[@]}; do 
for T in ${T_ARR[@]}; do 
for PPN in ${PPN_ARR[@]}; do 
for API in ${API_ARR[@]}; do 
for FS in ${FS_ARR[@]}; do 
    BENCHFILE="./output_v2/COUNT:$COUNT-NN:$NN-PPN:$PPN-API:$API-FS:$FS-T:$T-TYPE:$TYPE.txt"

    if [ ! -e "${BENCHFILE}" ]; then
        OUTDIR="$(dirname $BENCHFILE)"
        [ ! -d $OUTDIR ] && mkdir $OUTDIR
        touch $BENCHFILE

        if [[ $API == "IME" ]]; then
            if [[ "read" == $TYPE ]]; then
                IOR_TYPE_OPTS="-r -E -k"
                #IOR_TYPE_OPTS="-w -k"
                TESTFILE="ime:///gsfs/jtacquaviva/file_read"
                ime-stat $TESTFILE
                #ime-prestage -b $TESTFILE
                #ime-stat $TESTFILE
            elif [[ "write" == $TYPE ]]; then
                IOR_TYPE_OPTS="-w"
                CLEAN_UP_TESTFILE="/gsfs/jtacquaviva/file_write"
                TESTFILE="ime:///gsfs/jtacquaviva/file_write"
            fi
        elif [[ $API == "MPIIO" ]]; then
            if [[ "read" == $TYPE ]]; then
                IOR_TYPE_OPTS="-r -E -k"
                if [[ "gpfs" == $FS ]]; then
                    TESTFILE="/gsfs/jtacquaviva/file_read"
                elif [[ "fuse" == $FS ]]; then
                    TESTFILE="/ime/jtacquaviva/file_read"
                else
                    echo "Unknown FS $FS"
                fi  
                TESTDIR="$(dirname $TESTFILE)"
            elif [[ "write" == $TYPE ]]; then
                IOR_TYPE_OPTS="-w"
                if [[ "gpfs" == $FS ]]; then
                    TESTFILE="/gsfs/jtacquaviva/file_write"
                elif [[ "fuse" == $FS ]]; then
                    TESTFILE="/ime/jtacquaviva/file_write"
                else
                    echo "Unknown FS $FS"
                fi
                TESTDIR="$(dirname $TESTFILE)"
            fi
        fi

        IOR_PARAMS="-i 3 "
        IOR_PARAMS+="-s 1 -t $T -b $(($DATASIZE / $PPN)) "
        IOR_PARAMS+="-D 60 "
        IOR_PARAMS+="-O stoneWallingWearOut=1 "
        IOR_PARAMS+="-a $API "
        #IOR_PARAMS+="-p " # preallocate -- preallocate file size
        #IOR_PARAMS+="-e " # fsync -- perform sync operation after each block write
        IOR_PARAMS+="-g " # intraTestBarriers -- use barriers between open, write/read, and close
        IOR_PARAMS+="-H " # showHints -- show hints 
        IOR_PARAMS+="-z " # randomOffset -- access is to random, not sequential, offsets within a file
        IOR_PARAMS+="-o $TESTFILE $IOR_TYPE_OPTS "
        IOR_PARAMS+="-O summaryFile=${BENCHFILE}.json "
        IOR_PARAMS+="-O summaryFormat=JSON "
        
        if [[ "isc17" == ${hostname:0:5} ]]; then
            #$MPIEXEC -np $NN --hosts $(hosts $NN) ./drop_caches.sh
            $MPIEXEC -np $NN --hosts $(hosts $NN) echo 3 > /proc/sys/vm/drop_caches 
            MPIEXEC_PARAMS=" -ppn $PPN -np $(($NN * $PPN)) --hosts $(hosts $NN) -wdir $WD "
            MPIEXEC_PARAMS+="-genv MV2_NUM_HCAS 1 "
            MPIEXEC_PARAMS+="-genv MV2_CPU_BINDING_LEVEL core "
            MPIEXEC_PARAMS+="-genv MV2_CPU_BINDING_POLICY scatter "
            MPIEXEC_PARAMS+="-genv MV2_SHOW_CPU_BINDING 1 "
            MPIEXEC_PARAMS+="-genv RDMAV_FORK_SAFE 1 "
            MPIEXEC_PARAMS+="-genv RDMAV_HUGEPAGES_SAFE 1 "
        elif [[ "m" == ${hostname:0:1} ]]; then
            #MPIEXEC_PARAMS=" -ppn $PPN -n $(($NN * $PPN)) -wdir $WD --host $(hosts $NN) "
            MPIEXEC_PARAMS=" -ppn $PPN -n $(($NN * $PPN)) -wdir $WD "
        else
            echo "Cluster $hostname is not supported. Quitting."
            exit 1
        fi

        NETOUTDIR="${BENCHFILE}_network"
        [[ ! -d $NETOUTDIR ]] && mkdir $NETOUTDIR || rm $NETOUTDIR/HOST*PID*.txt

        WAIT=true
        declare -a avgload
        while $WAIT; do
            for i in 1 2 3 4; do
                avgload[$i]=$(ssh ime${i} 'cat /proc/loadavg' | cut -f1 -d" ")
                if [[ ${avgload[$i]} > 25 ]]; then
                    WAIT=true
                    echo "ime$i is not ready. Average load is ${avgload[$i]}. Waiting."
                    break
                else
                    WAIT=false
                fi
            done
            sleep 5
        done

        (
        set -x
        $MPIEXEC $MPIEXEC_PARAMS ./ior_wrapper.sh "$IOR_PARAMS" "$NETOUTDIR" | tee -a $BENCHFILE
        #$MPIEXEC $MPIEXEC_PARAMS $IOR $IOR_PARAMS | tee -a $BENCHFILE

        if [[ "" != $CLEAN_UP_TESTFILE ]]; then
            echo rm $CLEAN_UP_TESTFILE
        fi
        set +x
        ) 2> >(tee -a $BENCHFILE)
    else
        echo "skip $(readlink -f $BENCHFILE), already exists"
    fi

done
done
done
done
done
done

