aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/tests/zfs-tests/tests/functional/online_offline/online_offline_002_neg.ksh
blob: a2427f2e18227370a76250490c4c5a7a1a6a2664 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/ksh -p
#
# 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
. $STF_SUITE/tests/functional/online_offline/online_offline.cfg

#
# DESCRIPTION:
# Turning disks in a pool offline should fail when there is no longer
# sufficient redundancy.
#
# STRATEGY:
# 1. Start some random I/O on the mirror or raidz.
# 2. Verify that we can offline as many disks as the redundancy level
# will support, but not more.
# 3. Verify the integrity of the file system and the resilvering.
#

verify_runnable "global"

DISKLIST=$(get_disklist $TESTPOOL)

function cleanup
{
	#
	# Ensure we don't leave disks in the offline state
	#
	for disk in $DISKLIST; do
		log_must zpool online $TESTPOOL $disk
		log_must check_state $TESTPOOL $disk "online"
	done

	kill $killpid >/dev/null 2>&1
	[[ -e $TESTDIR ]] && log_must rm -rf $TESTDIR/*
}

log_assert "Turning both disks offline should fail."

log_onexit cleanup

file_trunc -f $((64 * 1024 * 1024)) -b 8192 -c 0 -r $TESTDIR/$TESTFILE1 &
typeset killpid="$! "

disks=($DISKLIST)

#
# The setup script will give us either a mirror or a raidz. The former can have
# all but one vdev offlined, whereas with raidz there can be only one.
#
pooltype='mirror'
zpool list -v $TESTPOOL | grep raidz >/dev/null 2>&1 && pooltype='raidz'

typeset -i i=0
while [[ $i -lt ${#disks[*]} ]]; do
	typeset -i j=0
	if [[ $pooltype = 'mirror' ]]; then
		# Hold one disk online, verify the others can be offlined.
		log_must zpool online $TESTPOOL ${disks[$i]}
		check_state $TESTPOOL ${disks[$i]} "online" || \
		    log_fail "Failed to set ${disks[$i]} online"
		log_must zpool wait -t resilver $TESTPOOL
		log_must zpool clear $TESTPOOL
		while [[ $j -lt ${#disks[*]} ]]; do
			if [[ $j -eq $i ]]; then
				((j++))
				continue
			fi
			log_must zpool offline $TESTPOOL ${disks[$j]}
			check_state $TESTPOOL ${disks[$j]} "offline" || \
			    log_fail "Failed to set ${disks[$j]} offline"
			((j++))
		done
	elif [[ $pooltype = 'raidz' ]]; then
		# Hold one disk offline, verify the others can't be offlined.
		log_must zpool offline $TESTPOOL ${disks[$i]}
		check_state $TESTPOOL ${disks[$i]} "offline" || \
		    log_fail "Failed to set ${disks[$i]} offline"
		while [[ $j -lt ${#disks[*]} ]]; do
			if [[ $j -eq $i ]]; then
				((j++))
				continue
			fi
			log_mustnot zpool offline $TESTPOOL ${disks[$j]}
			check_state $TESTPOOL ${disks[$j]} "online" || \
			    log_fail "Failed to set ${disks[$j]} online"
			check_state $TESTPOOL ${disks[$i]} "offline" || \
			    log_fail "Failed to set ${disks[$i]} offline"
			((j++))
		done
		log_must zpool online $TESTPOOL ${disks[$i]}
		check_state $TESTPOOL ${disks[$i]} "online" || \
		    log_fail "Failed to set ${disks[$i]} online"
		log_must zpool wait -t resilver $TESTPOOL
		log_must zpool clear $TESTPOOL
	fi
	((i++))
done

log_must kill $killpid
sync_all_pools
log_must sync

typeset dir=$(get_device_dir $DISKS)
verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir"

log_pass