mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-27 11:29:36 +03:00
f8d55b95a5
The name overlaps with a command needed by FreeBSD. There is also no sense having two 'random' functions that do nearly the same thing, so consolidate to just the more general one and name it 'random_int_between'. Reviewed-by: John Kennedy <john.kennedy@delphix.com> Reviewed-by: Kjeld Schouten <kjeld@schouten-lebbing.nl> Reviewed-by: Igor Kozhukhov <igor@dilos.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Melikov <mail@gmelikov.ru> Signed-off-by: Ryan Moeller <ryan@ixsystems.com> Closes #9820
144 lines
3.4 KiB
Plaintext
144 lines
3.4 KiB
Plaintext
#
|
|
# 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) 2012, 2016 by Delphix. All rights reserved.
|
|
#
|
|
|
|
#
|
|
# Return 0 if the percentage difference between $a and $b is $percent or
|
|
# greater. Return 1 if the percentage is lower or if we would divide by
|
|
# zero. For use like this:
|
|
#
|
|
# Do $action if the calculated percentage is greater or equal to that passed in:
|
|
# within_percent A B P && $action
|
|
# Do $action if the calculated percentage is less than that passed in:
|
|
# within_percent A B P || $action
|
|
#
|
|
function within_percent
|
|
{
|
|
typeset a=$1
|
|
typeset b=$1
|
|
typeset percent=$3
|
|
|
|
# Set $a or $b to $2 such that a >= b
|
|
[[ '1' = $(echo "if ($2 > $a) 1" | bc) ]] && a=$2 || b=$2
|
|
|
|
# Prevent division by 0
|
|
[[ $a =~ [1-9] ]] || return 1
|
|
|
|
typeset p=$(echo "scale=2; $b * 100 / $a" | bc)
|
|
log_note "Comparing $a and $b given $percent% (calculated: $p%)"
|
|
[[ '1' = $(echo "scale=2; if ($p >= $percent) 1" | bc) ]] && return 0
|
|
|
|
return 1
|
|
}
|
|
|
|
#
|
|
# Return 0 if value is within +/-tolerance of target.
|
|
# Return 1 if value exceeds our tolerance.
|
|
# For use like this:
|
|
#
|
|
# Do $action if value is within the tolerance from target passed in:
|
|
# within_tolerance VAL TAR TOL && $action
|
|
# Do $action if value surpasses the tolerance from target passed in:
|
|
# within_tolerance VAL TAR TOL || $action
|
|
#
|
|
function within_tolerance #value #target #tolerance
|
|
{
|
|
typeset val=$1
|
|
typeset target=$2
|
|
typeset tol=$3
|
|
|
|
typeset diff=$((abs(val - target)))
|
|
log_note "Checking if $val is within +/-$tol of $target (diff: $diff)"
|
|
((diff <= tol)) && return 0
|
|
|
|
return 1
|
|
}
|
|
|
|
#
|
|
# Return 0 if the human readable string of the form <value>[suffix] can
|
|
# be converted to bytes. Allow suffixes are shown in the table below.
|
|
#
|
|
function to_bytes
|
|
{
|
|
typeset size=$1
|
|
typeset value=$(echo "$size" | grep -o '[0-9]\+')
|
|
|
|
case $size in
|
|
*PB|*pb|*P|*p) factor='1024^5' ;;
|
|
*TB|*tb|*T|*t) factor='1024^4' ;;
|
|
*GB|*gb|*G|*g) factor='1024^3' ;;
|
|
*MB|*mb|*M|*m) factor='1024^2' ;;
|
|
*KB|*kb|*K|*k) factor='1024^1' ;;
|
|
*B|*b) factor='1024^0' ;;
|
|
*[!0-9.]*) return 1 ;;
|
|
*) factor='1024^0' ;;
|
|
esac
|
|
|
|
echo "$value * ($factor)" | bc
|
|
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# Verify $a is equal to $b, otherwise raise an error specifying
|
|
# the $type of values being compared
|
|
#
|
|
function verify_eq # <a> <b> <type>
|
|
{
|
|
typeset a=$1
|
|
typeset b=$2
|
|
typeset type=$3
|
|
|
|
if [[ $a -ne $b ]]; then
|
|
log_fail "Compared $type should be equal: $a != $b"
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Verify $a is not equal to $b, otherwise raise an error specifying
|
|
# the $type of values being compared
|
|
#
|
|
function verify_ne # <a> <b> <type>
|
|
{
|
|
typeset a=$1
|
|
typeset b=$2
|
|
typeset type=$3
|
|
|
|
if [[ $a -eq $b ]]; then
|
|
log_fail "Compared $type should be not equal: $a == $b"
|
|
fi
|
|
}
|
|
|
|
# A simple function to get a random number between two bounds (inclusive)
|
|
#
|
|
# Probably not the most efficient for large ranges, but it's okay.
|
|
#
|
|
# Note since we're using $RANDOM, 32767 is the largest number we
|
|
# can accept as the upper bound.
|
|
#
|
|
# $1 lower bound
|
|
# $2 upper bound
|
|
function random_int_between
|
|
{
|
|
typeset -i min=$1
|
|
typeset -i max=$2
|
|
typeset -i rand=0
|
|
|
|
while [[ $rand -lt $min ]] ; do
|
|
rand=$(( $RANDOM % $max + 1))
|
|
done
|
|
|
|
echo $rand
|
|
}
|