#!/bin/ksh93 # first controller integer C_FIRST=3 function createPoolScript { integer N=0 C T typeset X='' for (( T=0; T < 8; T++ )); do for (( C=C_FIRST; C < C_FIRST+6; C++ )); do (( N++ )) # skip rpool (( (C == C_FIRST || C == C_FIRST + 1) && T == 0 )) && continue X+="zpool destroy pool${N}\n" X+="zpool create pool${N} c${C}t${T}d0\n" X+="chown admin /pool${N}\n" done done print "$X\nsync" } typeset -a PIDS=( 0 0 0 0 0 0 ) function getSLOT { typeset -n S=$1 for (( I=0; I < ${#PIDS[@]} ; I++ )); do (( ! PIDS[I] )) && S=$I && return [[ -d /proc/${PIDS[I]} ]] && continue PIDS[I]=0 S=$I return done S=-1 } typeset -a TPIDS=( 0 0 0 0 0 0 ) function runTests { integer S P typeset X TAIL POOL set -- /pool{0..48} while [[ -n $1 ]]; do ZFS=$1 [[ ! -d ${ZFS} ]] && shift && continue getSLOT S (( S == -1 )) && sleep 10 && continue # no slots available P=${TPIDS[S]} (( P )) && kill $P && sleep 1 # kill the monitor DEV='' zpool status ${ZFS:1} | while read X TAIL ; do [[ ${X} =~ ^c[0-9]+t[0-9]+d0$ ]] && DEV=$X && break done if [[ -n ${DEV} ]]; then iostat -xrn ${DEV} 1 >/var/tmp/${DEV}.io 2>&1 & TPIDS[S]=$! time mkfile 450g ${ZFS}/test >/var/tmp/${DEV}.out 2>&1 & PIDS[S]=$! fi shift done } function wait4finish { integer I N=1 while (( N )); do N=${#PIDS[@]} sleep 10 for (( I=0; I < ${#PIDS[@]} ; I++, N-- )); do (( ! PIDS[I] )) && continue [[ -d /proc/${PIDS[I]} ]] && break PIDS[I]=0 kill ${TPIDS[I]} TPIDS[I]=0 done done } SCRIPT="${ createPoolScript ; }" print "${SCRIPT}" >/tmp/pooldo.sh exit + sh /tmp/pooldo.sh #typeset -ft ${ typeset +f ; } runTests >/var/tmp/tests.out wait4finish >>/var/tmp/tests.out