]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_003_pos.ksh
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / tests / zfs-tests / tests / functional / cli_root / zpool_import / zpool_import_missing_003_pos.ksh
1 #!/bin/ksh -p
2 #
3 # CDDL HEADER START
4 #
5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
8 #
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
13 #
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 #
20 # CDDL HEADER END
21 #
22
23 #
24 # Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
25 # Use is subject to license terms.
26 #
27
28 #
29 # Copyright (c) 2012, 2016 by Delphix. All rights reserved.
30 #
31
32 . $STF_SUITE/include/libtest.shlib
33 . $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib
34 . $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg
35
36 #
37 # DESCRIPTION:
38 #       Once a pool has been exported, but one or more devices are
39 #       overlapped with other exported pool, import should handle
40 #       this kind of situation properly.
41 #
42 # STRATEGY:
43 #       1. Repeat 1-3, create two test pools upon device files separately.
44 #          These two pools should have one or more devices are overlapped.
45 #          using the various combinations.
46 #               - Regular pool
47 #               - Mirror
48 #               - Raidz
49 #       2. Create necessary filesystem and test files.
50 #       3. Export the test pool.
51 #       4. Verify 'zpool import -d' with these two pools will have results
52 #          as described:
53 #               - Regular, report error while any number of devices failing.
54 #               - Mirror could withstand (N-1) devices failing
55 #                 before data integrity is compromised
56 #               - Raidz could withstand one devices failing
57 #                 before data integrity is compromised
58 #
59
60 verify_runnable "global"
61
62 # See issue: https://github.com/openzfs/zfs/issues/6839
63 if ! is_illumos; then
64         log_unsupported "Test case may be slow"
65 fi
66
67 set -A vdevs "" "mirror" "raidz"
68
69 function verify
70 {
71         typeset pool=$1
72         typeset fs=$2
73         typeset mtpt=$3
74         typeset health=$4
75         typeset file=$5
76         typeset checksum1=$6
77
78         typeset myhealth
79         typeset mymtpt
80         typeset checksum2
81
82         log_must poolexists $pool
83
84         myhealth=$(zpool list -H -o health $pool)
85
86         [[ $myhealth == $health ]] || \
87                 log_fail "$pool: Incorrect health ($myhealth), " \
88                         "expected ($health)."
89
90         log_must ismounted $pool/$fs
91
92         mymtpt=$(get_prop mountpoint $pool/$fs)
93         [[ $mymtpt == $mtpt ]] || \
94                 log_fail "$pool/$fs: Incorrect mountpoint ($mymtpt), " \
95                         "expected ($mtpt)."
96
97         [[ ! -e $mtpt/$file ]] && \
98                 log_fail "$mtpt/$file missing after import."
99
100         checksum2=$(sum $mymtpt/$file | awk '{print $1}')
101         [[ "$checksum1" != "$checksum2" ]] && \
102                 log_fail "Checksums differ ($checksum1 != $checksum2)"
103
104         return 0
105
106 }
107
108 function cleanup
109 {
110         cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR"
111
112         for pool in $TESTPOOL1 $TESTPOOL2; do
113                 if poolexists "$pool" ; then
114                         cleanup_filesystem $pool $TESTFS
115                         destroy_pool $pool
116                 fi
117         done
118
119         [[ -e $DEVICE_DIR/$DEVICE_ARCHIVE ]] && \
120                 log_must tar xf $DEVICE_DIR/$DEVICE_ARCHIVE
121 }
122
123 function cleanup_all
124 {
125         cleanup
126
127         # recover dev files
128         typeset i=0
129         while (( i < $MAX_NUM )); do
130                 typeset file=${DEVICE_DIR}/${DEVICE_FILE}$i
131                 if  [[ -e $file ]]; then
132                         log_must rm $file
133                 fi
134                 log_must mkfile $FILE_SIZE $file
135                 ((i += 1))
136         done
137
138         log_must rm -f $DEVICE_DIR/$DEVICE_ARCHIVE
139         cd $CWD || log_fail "Unable change directory to $CWD"
140
141 }
142
143 log_onexit cleanup_all
144
145 log_assert "Verify that import could handle device overlapped."
146
147 CWD=$PWD
148
149 cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR"
150 log_must tar cf $DEVICE_DIR/$DEVICE_ARCHIVE ${DEVICE_FILE}*
151
152 checksum1=$(sum $MYTESTFILE | awk '{print $1}')
153
154 typeset -i i=0
155 typeset -i j=0
156 typeset -i count=0
157 typeset -i num=0
158 typeset vdev1=""
159 typeset vdev2=""
160 typeset action
161
162 while (( num < $GROUP_NUM )); do
163         vdev1="$vdev1 ${DEVICE_DIR}/${DEVICE_FILE}$num"
164         (( num = num + 1 ))
165 done
166
167 while (( i < ${#vdevs[*]} )); do
168         j=0
169         while (( j < ${#vdevs[*]} )); do
170
171                 (( j != 0 )) && \
172                         log_must tar xf $DEVICE_DIR/$DEVICE_ARCHIVE
173
174                 typeset -i overlap=1
175                 typeset -i begin
176                 typeset -i end
177
178                 while (( overlap <= $GROUP_NUM )); do
179                         vdev2=""
180                         (( begin = $GROUP_NUM - overlap ))
181                         (( end = 2 * $GROUP_NUM - overlap - 1 ))
182                         (( num = begin ))
183                         while (( num <= end )); do
184                                 vdev2="$vdev2 ${DEVICE_DIR}/${DEVICE_FILE}$num"
185                                 (( num = num + 1 ))
186                         done
187
188                         setup_filesystem "$vdev1" $TESTPOOL1 $TESTFS $TESTDIR1 \
189                                 "" ${vdevs[i]}
190                         log_must cp $MYTESTFILE $TESTDIR1/$TESTFILE0
191                         log_must zfs umount $TESTDIR1
192                         poolexists $TESTPOOL1 && \
193                                 log_must zpool export $TESTPOOL1
194
195                         setup_filesystem "$vdev2" $TESTPOOL2 $TESTFS $TESTDIR2 \
196                                 "" ${vdevs[j]}
197                         log_must cp $MYTESTFILE $TESTDIR2/$TESTFILE0
198                         log_must zfs umount $TESTDIR2
199                         poolexists $TESTPOOL2 && \
200                                 log_must zpool export $TESTPOOL2
201
202                         action=log_must
203                         case "${vdevs[i]}" in
204                                 'mirror') (( overlap == $GROUP_NUM )) && \
205                                         action=log_mustnot
206                                         ;;
207                                 'raidz')  (( overlap > 1 )) && \
208                                         action=log_mustnot
209                                         ;;
210                                 '')  action=log_mustnot
211                                         ;;
212                         esac
213
214                         $action zpool import -d $DEVICE_DIR $TESTPOOL1
215                         log_must zpool import -d $DEVICE_DIR $TESTPOOL2
216
217                         if [[ $action == log_must ]]; then
218                                 verify "$TESTPOOL1" "$TESTFS" "$TESTDIR1" \
219                                         "DEGRADED" "$TESTFILE0" "$checksum1"
220                         fi
221
222                         verify "$TESTPOOL2" "$TESTFS" "$TESTDIR2" \
223                                 "ONLINE" "$TESTFILE0" "$checksum1"
224
225                         cleanup
226
227                         (( overlap = overlap + 1 ))
228
229                 done
230
231                 ((j = j + 1))
232         done
233
234         ((i = i + 1))
235 done
236
237 log_pass "Import could handle device overlapped."