diff options
Diffstat (limited to 'tests/zfs-tests/tests/functional/cache/cache.kshlib')
-rw-r--r-- | tests/zfs-tests/tests/functional/cache/cache.kshlib | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/tests/zfs-tests/tests/functional/cache/cache.kshlib b/tests/zfs-tests/tests/functional/cache/cache.kshlib new file mode 100644 index 000000000000..2e258e22cd39 --- /dev/null +++ b/tests/zfs-tests/tests/functional/cache/cache.kshlib @@ -0,0 +1,154 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2013, 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +function cleanup +{ + if datasetexists $TESTPOOL ; then + log_must zpool destroy -f $TESTPOOL + fi + if datasetexists $TESTPOOL2 ; then + log_must zpool destroy -f $TESTPOOL2 + fi +} + +# +# Try zpool status/iostat for given pool +# +# $1 pool +# +function display_status +{ + typeset pool=$1 + + typeset -i ret=0 + zpool status -xv $pool > /dev/null 2>&1 + ret=$? + + zpool iostat > /dev/null 2>&1 + ((ret |= $?)) + + typeset mntpnt=$(get_prop mountpoint $pool) + dd if=/dev/urandom of=$mntpnt/testfile.$$ & + typeset pid=$! + + zpool iostat -v 1 3 > /dev/null + ((ret |= $?)) + + kill -9 $pid + wait + + return $ret +} + +# +# Verify the given cache device have correct type and status +# +# $1 pool name +# $2 device name +# $3 device status +# $4 device type +# +function verify_cache_device +{ + typeset pool=$1 + typeset device=$2 + typeset status=$3 + typeset type=$4 + + if [[ -z $pool || -z $device || -z $status ]]; then + log_fail "Usage: verify_cache_device <pool> <device> " \ + "<status> [type]" + fi + + # + # Get all the cache devices and status table like below + # + # mirror:/disks/d ONLINE mirror:/disks/e ONLINE stripe:/disks/f ONLINE + # + set -A dev_stat_tab $(zpool status -v $pool | nawk 'BEGIN {start=0} \ + /\tcache/ {start=1} + /\tmirror/ || /\tspares/ || /^$/ {start=0} + (start==1) && /\t (\/|[a-zA-Z])/ \ + {print "stripe:" $1 " " $2} + (start==1) && /\t (\/|[a-zA-Z])/ \ + {print "mirror:" $1 " " $2} + # When hotspare is replacing + (start==1) && /\t (\/|[a-zA-Z])/ \ + {print "mirror:" $1 " " $2}' + ) + + typeset -i i=0 + typeset find=0 + while (( i < ${#dev_stat_tab[@]} )); do + typeset dev=${dev_stat_tab[$i]} + typeset stat=${dev_stat_tab[((i+1))]} + + case $dev in + stripe:$device) + if [[ "$type" == 'mirror' ]]; then + log_note "Unexpected type: mirror" + return 1 + else + if [[ $stat != $status ]]; then + log_note "Status($stat) " \ + "!= Expected stat($status)" + return 1 + fi + return 0 + fi + ;; + mirror:$device) + if [[ -z "$type" || $type == 'stripe' ]]; then + log_note "Unexpected type: stripe" + return 1 + else + if [[ $stat != $status ]]; then + log_note "Status($stat) " \ + "!= Expected stat($status)" + return 1 + fi + return 0 + fi + ;; + esac + ((i += 2)) + done + + log_note "Can not find device: $device" + return 1 +} + +function verify_cache_support +{ + zpool upgrade -v | grep "Cache devices" > /dev/null 2>&1 + return $? +} |