#!/bin/bash
#
# test_disk_load
#
# Schickt Disk-Auslastungen ans ULS
#
# Es werden 6 Werte geschrieben
#
#  rdps:     Reads per second
#  wrps:     Write per second
#  rdkbpsec: Read kByte/sec
#  wrkbpsec: Write kByte/sec
#  rdmb:     Read MByte seit der letzten Messung
#  wrmb:     Write MByte seit der letzten Messung
#  SW
#  -R  tsr:    Time spent reading in ms
#  -W  tsw:    Time spent writing in ms
#  -I  iocip:  I/Os currently in prgress
##################################################################################
#
unset TMP_PATH SETULSHOSTNAME SECTION TESTSTEP SAVESTATEPATH RFLAF WFLAG IFLAG CONFIGDIR
while getopts h:s:t:d:C:T:MIP op
 do
  case "$op" in
   C) [[ -n "$OPTARG" ]] && CONFIGDIR="$OPTARG";;
   d) [[ -n "$OPTARG" ]] && TMP_PATH="-d $OPTARG";;
   h) [[ -n "$OPTARG" ]] && SETULSHOSTNAME="$OPTARG";;
   s) [[ -n "$OPTARG" ]] && SECTION="$OPTARG";;
   t) [[ -n "$OPTARG" ]] && TESTSTEP="$OPTARG";;
   T) [[ -n "$OPTARG" ]] && SAVESTATEPATH="$OPTARG";;
   R) RFLAG=1;;
   W) WFLAG=1;;
   I) IFLAG=1;;
   *) echo "usage: `basename $0` [-RWI] [-c <path>] [-d <path>] [-h <ulshostname>] [-s <section>] [-t <teststep>] [-T <savestatepath>]"
      exit 1;;
  esac
done
shift $(( $OPTIND -1))
#
. `dirname $0`/uls_header
#
if [[ ! -f ${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last ]]
 then
  [[ -n "$SAVESTATEPATH" && ! -d "$SAVESTATEPATH" ]] && mkdir -p "$SAVESTATEPATH"
  date '+SECS %s' >${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last
  cat /proc/diskstats >>${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last
  exit 0
fi
#
( cat ${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last
  date '+SECS %s' >${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last
  cat /proc/diskstats >>${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last
  cat ${SAVESTATEPATH:-/dev/shm}/uls.diskstats.last
) | awk -v ID=`id -u` -v H="${SETULSHOSTNAME:-$ULSHOSTNAME}" -v SECTION="${SECTION:-System}" -v TESTSTEP="${TESTSTEP:-Dev}" -v DT="$DT" -v RF=$RFLAG -v WF=$WFLAG -v IF=$IFLAG '
BEGIN { c = 0; z = 0
    while( (getline < "/proc/mounts") > 0 )
    { if( $1 ~ "^/dev/" )
      { gsub("/dev/", "", $1)
        if( $1 ~ "mapper/" )
        { cmd = "stat -Lc %t:%T /dev/"$1
          cmd | getline dm
          m[dm] = $2
          close(cmd)
        }
        else
          m[$1] = $2
      }
    }
    close("/proc/mounts")
    while( (getline < "/proc/swaps") > 0 )
    { if( $1 ~ "^/dev/" )
      { gsub("/dev/", "", $1);
        if( $1 ~ "mapper/" )
        { cmd = "stat -Lc %t:%T /dev/"$1
          cmd | getline dm
          m[dm] = "swap"
          close(cmd)
        }
        else
          m[$1] = "swap"
      }
    }
    close("/proc/swaps")
    if( ID == 0 )
    { while( ("pvs --noheadings" | getline) > 0 )
      { gsub("/dev/", "", $1)
        m[$1] = $2
      }
      close("pvs --noheadings")
    }
    print "D;" DT ";" H ";" SECTION ";"
}
$1 == "SECS" { c++;
               s[c] = $2
             }
NF == 7 { if( $4 + $5 > 0 && $3 !~ "fd" )
          { nr[c":"$3] = $4
            sr[c":"$3] = $5
            nw[c":"$3] = $6
            sw[c":"$3] = $7
            dev[$3]++
          }
        }
NF == 14 { if( $4 + $5 > 0 && $3 !~ "fd" )
           { nr[c":"$3] = $4     # reads issued
             sr[c":"$3] = $6     # secrtors read
             msr[c":"$3] = $7    # milliseconds spent reading
             nw[c":"$3] = $8     # writes completed
             sw[c":"$3] = $10    # sectors written
             msw[c":"$3] = $11   # milliseconds spent writing
             iocip[c":"$3] = $12 # I/Os currently in progress
             dev[$3]++
           }
         }
END { ti = s[2] - s[1];
      if( ti > 0 )
      { for( i in dev )
        { if( m[i] != "" )
            d = i " ("m[i]")";
          else if( i ~ "dm-" )
          { cmd = "stat -Lc %t:%T /dev/" i
            cmd | getline dm
            if( dm && m[dm] )
              d = i " ("m[dm]")"
            else
              d = i
            close(cmd)
          }
          else
            d = i;
          if( nr["2:"i] < nr["1:"i] )
            nr["2:"i] += 4294967296
          if( nw["2:"i] < nw["1:"i] )
            nw["2:"i] += 4294967296
          if( sr["2:"i] < sr["1:"i] )
            sr["2:"i] += 4294967296
          if( sw["2:"i] < sw["1:"i] )
            sw["2:"i] += 4294967296
          printf("V;;;;%s:%s;rdps;%.2f;1/s\n", TESTSTEP, d, (nr["2:"i] - nr["1:"i])/ti)
          printf("V;;;;;wrps;%.2f;1/s\n", (nw["2:"i] - nw["1:"i])/ti)
          printf("V;;;;;rdkbpsec;%.2f;kB/s\n", (sr["2:"i] - sr["1:"i])/1.953125/ti)
          printf("V;;;;;wrkbpsec;%.2f;kB/s\n", (sw["2:"i] - sw["1:"i])/1.953125/ti)
          printf("V;;;;;rdmb;%.2f;MB\n", (sr["2:"i] - sr["1:"i])/1953.125)
          printf("V;;;;;wrmb;%.2f;MB\n", (sw["2:"i] - sw["1:"i])/1953.125)
          if( RF == 1 )
            printf("V;;;;;tsr;%.2f;ms\n", msr["2:"i] - msr["1:"i])
          if( WF == 1 )
            printf("V;;;;;tsw;%.2f;ms\n", msw["2:"i] - msw["1:"i])
          if( IF == 1 )
            printf("V;;;;;iocip;%d;#\n", iocip["2:"i])
        }
      }
    }' 2>/dev/null | send_test_tab $TMP_PATH
