1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21
22 #
23 # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 # Use is subject to license terms.
25 #
26
27 #
28 # Copyright (c) 2013, 2016 by Delphix. All rights reserved.
29 # Copyright 2015 Nexenta Systems, Inc. All rights reserved.
30 #
31
32 . $STF_SUITE/include/libtest.shlib
33 . $STF_SUITE/tests/functional/slog/slog.cfg
34
35 function cleanup
36 {
37 if datasetexists $TESTPOOL ; then
38 log_must destroy_pool $TESTPOOL
39 fi
40 if datasetexists $TESTPOOL2 ; then
41 log_must destroy_pool $TESTPOOL2
42 fi
43 }
44
45 #
46 # Try zpool status/iostat for given pool
47 #
48 # $1 pool
49 #
50 function display_status
51 {
52 typeset pool=$1
53
54 typeset -i ret=0
55 zpool status -xv $pool > /dev/null 2>&1
56 ret=$?
57
58 zpool iostat > /dev/null 2>&1
59 ((ret |= $?))
60
61 typeset mntpnt=$(get_prop mountpoint $pool)
62 dd if=/dev/random of=$mntpnt/testfile.$$ &
63 typeset pid=$!
64
65 zpool iostat -v 1 3 > /dev/null
66 ((ret |= $?))
67
68 kill -9 $pid
69
70 return $ret
71 }
72
73 #
74 # Verify the give slog device have correct type and status
75 #
76 # $1 pool name
77 # $2 device name
78 # $3 device status
79 # $4 device type
80 #
81 function verify_slog_device
82 {
83 typeset pool=$1
84 typeset device=$2
85 typeset status=$3
86 typeset type=$4
87
88 if [[ -z $pool || -z $device || -z $status ]]; then
89 log_fail "Usage: verify_slog_device <pool> <device> " \
90 "<status> [type]"
91 fi
92
93 #
94 # Get all the slog devices and status table like below
95 #
96 # mirror:/disks/d ONLINE mirror:/disks/e ONLINE stripe:/disks/f ONLINE
97 #
98 set -A dev_stat_tab $(zpool status -v $pool | nawk 'BEGIN {start=0} \
99 /\tlogs/ {start=1}
100 /\tmirror/ || /\tspares/ || /^$/ {start=0}
101 (start==1) && /\t (\/|[a-zA-Z])/ \
102 {print "stripe:" $1 " " $2}
103 (start==1) && /\t (\/|[a-zA-Z])/ \
104 {print "mirror:" $1 " " $2}
105 # When hotspare is replacing
106 (start==1) && /\t (\/|[a-zA-Z])/ \
107 {print "mirror:" $1 " " $2}'
108 )
109
110 typeset -i i=0
111 typeset find=0
112 while (( i < ${#dev_stat_tab[@]} )); do
113 typeset dev=${dev_stat_tab[$i]}
114 typeset stat=${dev_stat_tab[((i+1))]}
115
116 case $dev in
117 stripe:$device)
118 if [[ "$type" == 'mirror' ]]; then
119 log_note "Unexpected type: mirror"
120 return 1
121 else
122 if [[ $stat != $status ]]; then
123 log_note "Status($stat) " \
124 "!= Expected stat($status)"
125 return 1
126 fi
127 return 0
128 fi
129 ;;
130 mirror:$device)
131 if [[ -z "$type" || $type == 'stripe' ]]; then
132 log_note "Unexpected type: stripe"
133 return 1
134 else
135 if [[ $stat != $status ]]; then
136 log_note "Status($stat) " \
137 "!= Expected stat($status)"
138 return 1
139 fi
140 return 0
141 fi
142 ;;
143 esac
144
145 ((i += 2))
146 done
147
148 log_note "Can not find device: $device"
149
150 return 1
151 }