+
+run_fio() {
+ FIO=${FIO:=$(which fio 2> /dev/null || true)}
+
+ local clients=${CLIENTS:-$(hostname)}
+ local fio_jobNum=${fio_jobNum:-4}
+ local fio_jobFile=${fio_jobFile:-$TMP/fiojobfile.$(date +%s)}
+ local fio_bs=${fio_bs:-1}
+ local testdir=$DIR/d0.fio
+ local file=${testdir}/fio
+ local runtime=60
+ local propagate=false
+
+ [ "$SLOW" = "no" ] || runtime=600
+
+ [ x$FIO = x ] &&
+ { skip_env "FIO not found" && return; }
+
+ mkdir -p $testdir
+
+ # use fio job file if exists,
+ # create a simple one if missing
+ if ! [ -f $fio_jobFile ]; then
+ cat >> $fio_jobFile <<EOF
+[global]
+rw=randwrite
+size=128m
+time_based=1
+runtime=$runtime
+filename=${file}_\$(hostname)
+EOF
+ # bs size increased by $i for each job
+ for ((i=1; i<=fio_jobNum; i++)); do
+ cat >> $fio_jobFile <<EOF
+
+[job$i]
+bs=$(( fio_bs * i ))m
+EOF
+ done
+ # job file is created, should be propagated to all clients
+ propagate=true
+ fi
+
+
+ # propagate the job file if not all clients have it yet or
+ # if the job file was created during the test run
+ if ! do_nodesv $clients " [ -f $fio_jobFile ] " ||
+ $propagate; then
+ local cfg=$(cat $fio_jobFile)
+ do_nodes $clients "echo \\\"$cfg\\\" > ${fio_jobFile}" ||
+ error "job file $fio_jobFile is not propagated"
+ do_nodesv $clients "cat ${fio_jobFile}"
+ fi
+
+ cmd="$FIO $fio_jobFile"
+ echo "+ $cmd"
+
+ log "clients: $clients $cmd"
+
+ local rc=0
+ do_nodesv $clients "$cmd "
+ rc=$?
+
+ [ $rc = 0 ] || error "fio failed: $rc"
+ rm -rf $testdir
+}
+
+run_xdd() {
+ XDD=${XDD:=$(which xdd 2> /dev/null || true)}
+
+ local clients=${CLIENTS:-$(hostname)}
+ local testdir=$DIR/d0.xdd
+ xdd_queuedepth=${xdd_queuedepth:-4}
+ xdd_blocksize=${xdd_blocksize:-512}
+ xdd_reqsize=${xdd_reqsize:-128}
+ xdd_mbytes=${xdd_mbytes:-100}
+ xdd_passes=${xdd_passes:-40}
+ xdd_rwratio=${xdd_rwratio:-0}
+ xdd_ntargets=${xdd_ntargets:-6}
+ local xdd_custom_params=${xdd_custom_params:-"-dio -stoponerror \
+ -maxpri -minall -noproclock -nomemlock"}
+
+ [ x$XDD = x ] &&
+ { skip "XDD not found" && return; }
+
+ print_opts XDD clients xdd_queuedepth xdd_blocksize xdd_reqsize \
+ xdd_mbytes xdd_passes xdd_rwratio
+
+ mkdir -p $testdir
+
+ local files=""
+ # Target files creates based on the given number of targets
+ for (( i=0; i < $xdd_ntargets; i++ ))
+ do
+ files+="${testdir}/xdd"$i" "
+ done
+
+ # -targets specifies the devices or files to perform operation
+ # -reqsize number of 'blocks' per operation
+ # -mbytes number of 1024*1024-byte blocks to transfer
+ # -blocksize size of a single 'block'
+ # -passes number of times to read mbytes
+ # -queuedepth number of commands to queue on the target
+ # -rwratio percentage of read to write operations
+ # -verbose will print out statistics on each pass
+
+ local cmd="$XDD -targets $xdd_ntargets $files -reqsize $xdd_reqsize \
+ -mbytes $xdd_mbytes -blocksize $xdd_blocksize \
+ -passes $xdd_passes -queuedepth $xdd_queuedepth \
+ -rwratio $xdd_rwratio -verbose $xdd_custom_params"
+ echo "+ $cmd"
+
+ local rc=0
+ do_nodesv $clients "$cmd "
+ rc=$?
+
+ [ $rc = 0 ] || error "xdd failed: $rc"
+
+ rm -rf $testdir
+}