Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Code Block
languagebash
cat stab_zfs.sh 
#!/bin/bash

get_duration() {
  IFS=':' read -r -a tm <<< "$1"
  num=${#tm[@]}
  delta=$((${tm[0]} * 3600))
  if [[ $num -gt 1 ]]; then
    delta1=$((${tm[1]} * 60))
    (( delta += $delta1 ))
    if [[ $num -gt 2 ]]; then
      (( delta += ${tm[2]} ))
    fi
  fi
  echo $delta
}

get_time_diff() {
  local cur_time=$(date +%s)
  echo $(($cur_time - $1))
}

print_time_diff() {
  local delta=$(get_time_diff $1)
  local sec=$(($delta % 60))
  let "amin = $delta / 60"
  let "hour = $amin / 60"
  local min=$(($amin%60))
  if [ -n "$2" ]; then
    printf " Running time: %02d:%02d:%02d\n" $hour $min $sec >> $2
  else
    printf " Running time: %02d:%02d:%02d\n" $hour $min $sec
  fi
}

log_extra() {
  echo "---------------- ZPOOL LIST ------------------" >> $1
  zpool list >> $1
  echo "----------------  ZFS LIST  ------------------" >> $1
  zfs list >> $1
  echo "----------------    PS AX   ------------------" >> $1
  ps ax >> $1
  echo "---------------- TOP  -n 10 ------------------" >> $1
  top -n 10 >> $1
}

i=1
mode=0
TOTALLOG="/var/tmp/stabzfs.$(date +%F-%T).txt"
dsk1=$1
shift
dsk2=$1
shift
dsk3=$1
shift

echo "============ ZFS Stability test started at $(date +%F-%T) ==============" > ${TOTALLOG}
if [[ $# < 2 ]]; then
  echo "Missing parameters in the command" | /usr/bin/tee -a ${TOTALLOG}
  exit 1
fi

case "$1" in
  -i) mode=1
      # number of iterations is provided
      maxiter=$2
      echo "Stability Test : launched for $maxiter iterations at $(date)." | /usr/bin/tee -a ${TOTALLOG}
      ;;
  -d) mode=2
      # duration of tests is provided
      delta=$(get_duration $2)
      echo "Stability Test : launched for $2 interval ($delta seconds) at $(date)." | /usr/bin/tee -a ${TOTALLOG}
      ;;
  -t) mode=3
      # stop date/time is provided
      stopdt=$2
      ;;
  *)  echo "Stability Test : $1 is a wrong option" | /usr/bin/tee -a ${TOTALLOG}
      echo "Usage : stab_zfs.sh <disk1> <disk2> <disk3> (-i <iterations> | -t <HH:MM[:SS]> | -d <HH:MM[:SS] [DAY-MONTH-YEAR]>]) [-s | <test name>]"
      exit 1
      ;;
esac
shift
shift

if [[ $mode -eq 3 ]]; then
  # stop time/date mode
  if [[ $# > 0 ]]; then
    date -d $1 +%s
    stopat=$?
    if [[ $stopat -eq 0 ]]; then
      # stop date is entered after the time
      # if it is ommited then date is treated as current one
      stopdt="$stopdt $1"
      shift
    fi
  fi
  echo "Stability Test : launched until $stopdt at $(date)." | /usr/bin/tee -a ${TOTALLOG}
  stopat=$(date -d "$stopdt" "+%s")
fi

uname -a | /usr/bin/tee -a ${TOTALLOG}
diskinfo >>  null
diskinfo >> null
echo "---------------- DISKINFO -----------------------" >> ${TOTALLOG}
diskinfo | /usr/bin/tee -a ${TOTALLOG}

GLOB_START_TIME=$(date +%s)

while [[ $mode -gt 0 ]]
do
  case "$mode" in
  1) # number of iterations is provided
     if [[ $i -gt $maxiter ]]; then
       break
     fi
     ;;
  2) # duration of tests is provided
     difftm=$(get_time_diff $GLOB_START_TIME)
     if [[ $difftm -gt $delta ]]; then
       break
     fi
     ;;
  3) # stop date/time is provided
     tmpat=$(date +%s)
     if [[ $stopat -le $tmpat ]]; then
       break
     fi
     ;;
  *) break
     ;;
  esac

  LOG="/var/tmp/zfstest.$(date +%F-%T).txt"
  echo "----------------------- Pass ${i} <${LOG}>: started $(date)" | /usr/bin/tee -a ${TOTALLOG}
  echo "---------------- BEADM LIST -----------------------" >> ${TOTALLOG}
  
  beadm list | /usr/bin/tee -a ${TOTALLOG}
  echo "---------------- ZPOOL LIST -----------------------" >> ${TOTALLOG}
  zpool list | /usr/bin/tee -a ${TOTALLOG}
  
  START_TIME=$(date +%s)
  ./z.sh $dsk1 $dsk2 $dsk3 $LOG
  print_time_diff ${START_TIME} ${TOTALLOG}
  echo "----------------------- Pass ${i} : finished $(date)" | /usr/bin/tee -a ${TOTALLOG}
  (( i++ ))
done
echo "Tests are finished successfully at $(date) with ${i} passes." >> ${TOTALLOG}
print_time_diff ${GLOB_START_TIME} | /usr/bin/tee -a ${TOTALLOG}