blob: bede946a09c56f4702bd3a0834836bebfb7c75ac [file] [log] [blame]
#!/bin/ksh -p
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2019 by Tim Chase. All rights reserved.
# Copyright (c) 2019 Lawrence Livermore National Security, LLC.
#
. $STF_SUITE/tests/functional/cli_root/zpool_trim/zpool_trim.kshlib
#
# Get the actual size on disk for the provided file.
#
function get_size_mb
{
typeset rval=$(du --block-size 1048576 -s "$1" | awk '{print $1}')
echo -n "$rval"
}
#
# Get the number of trim IOs issued for the pool (ind or agg).
#
function get_trim_io
{
typeset pool="${1-:$TESTPOOL}"
typeset type="${2-:ind}"
typeset vdev="${3}"
typeset rval
# Sum the ind or agg columns of the trim request size histogram.
case "$type" in
"ind")
rval=$(zpool iostat -pr $pool $vdev | awk \
'$1 ~ /[0-9].*/ { sum += $12 } END { print sum }')
echo -n "$rval"
;;
"agg")
rval=$(zpool iostat -pr $pool $vdev | awk \
'$1 ~ /[0-9].*/ { sum += $13 } END { print sum }')
echo -n "$rval"
;;
*)
log_fail "Type must be 'ind' or 'agg'"
;;
esac
}
#
# Verify that trim IOs were send to devices in the pool.
#
function verify_trim_io
{
typeset pool="${1:-$TESTPOOL}"
typeset type="${2:-ind}"
typeset min_trim_ios=${3:-100}
typeset vdev="${4}"
typeset ios
ios=$(get_trim_io $pool $type $vdev)
if [[ $ios -ge $min_trim_ios ]]; then
log_note "Issued $ios $type trim IOs for pool $pool"
else
log_fail "Too few trim IOs issued $ios/$min_trim_ios"
fi
}
#
# Run N txgs which should be enough to trim the entire pool.
#
function wait_trim_io # pool type txgs
{
typeset pool="${1-:$TESTPOOL}"
typeset type="${2-:ind}"
typeset txgs=${3:-10}
typeset timeout=120
typeset stop_time=$(( $(date +%s) + $timeout ))
typeset -i i=0
while [[ $i -lt $txgs ]]; do
if [ "$(date +%s)" -ge $stop_time ]; then
log_fail "Exceeded trim time limit of ${timeout}s"
return
fi
zpool sync -f
((i = i + 1))
done
typeset ios=$(get_trim_io $pool $type)
log_note "Waited for $txgs txgs, $ios $type TRIM IOs"
}
#
# Verify that file vdevs against a target value.
#
function verify_vdevs # op size vdevs
{
typeset tgt_op=$1
typeset tgt_size=$2
shift 2
typeset vdevs=$@
for vdev in $vdevs; do
typeset size=$(get_size_mb $vdev)
if test $size $tgt_op $tgt_size; then
log_note "Success $vdev is $size MB which is $tgt_op" \
"than $tgt_size MB"
else
log_fail "Failure $vdev is $size MB which is not" \
"$tgt_op than $tgt_size MB"
fi
done
}