xref: /illumos-gate/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen.shlib (revision d3b5f56344d8bfcdd6cfb82446af0e5e55ad9ebe)
1#
2# This file and its contents are supplied under the terms of the
3# Common Development and Distribution License ("CDDL"), version 1.0.
4# You may only use this file in accordance with the terms of version
5# 1.0 of the CDDL.
6#
7# A full copy of the text of the CDDL should have accompanied this
8# source.  A copy of the CDDL is also available via the Internet at
9# http://www.illumos.org/license/CDDL.
10#
11#
12# Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
13#
14
15. $STF_SUITE/tests/functional/cli_root/zpool_reopen/zpool_reopen.cfg
16
17#
18# Clear labels on the given disks
19#
20function clear_labels #disks
21{
22	for disk in $@; do
23		if ( is_loop_device $disk ) || ( is_mpath_device $disk ); then
24			zpool labelclear -f /dev/$disk
25		else
26			zpool labelclear -f /dev/${disk}1
27		fi
28	done
29}
30
31#
32# Set the REMOVED_DISK and REMOVED_DISK_ID constants for device
33# used for re-plugging. When the disk is loop device use the
34# scsi_debug emulated drive. Otherwise use the real drive.
35#
36function set_removed_disk
37{
38	if is_loop_device $DISK1; then
39		export REMOVED_DISK=$(get_debug_device)
40		export REMOVED_DISK_ID=$(get_persistent_disk_name $REMOVED_DISK)
41	elif ( is_real_device $DISK1 ) || ( is_mpath_device $DISK1 ); then
42		export REMOVED_DISK="$DISK1"
43		export REMOVED_DISK_ID=${devs_id[0]}
44	else
45		log_fail "No drives that supports removal"
46	fi
47}
48
49#
50# Generate random file of the given size in MiB
51#
52function generate_random_file #path size_mb
53{
54	typeset path=$1
55	typeset -i size_mb=$2
56	file_write -o create -f $path -b 1048576 -s0 -c $size_mb -d R
57}
58
59#
60# Wait until specific event or timeout occur.
61#
62# The passed function is executed with pool name as argument
63# with an interval of 1 second until it succeeds or until the
64# timeout occurs.
65# It returns 1 on timeout or 0 otherwise.
66#
67function wait_for_action #pool timeout function
68{
69	typeset pool=$1
70	typeset -i timeout=$2
71	typeset func=$3
72
73	while [ $timeout -gt 0 ]; do
74		(( --timeout ))
75		if ( $func $pool ); then
76			return 0
77		fi
78		sleep 1
79	done
80
81	return 1
82}
83
84#
85# Helpers for wait_for_action function:
86# wait_for_resilver_start - wait until resilver is started
87# wait_for_resilver_end - wait until resilver is finished
88# wait_for_scrub_end - wait until scrub is finished
89#
90function wait_for_resilver_start #pool timeout
91{
92	wait_for_action $1 $2 is_pool_resilvering
93	return $?
94}
95
96function wait_for_resilver_end #pool timeout
97{
98	wait_for_action $1 $2 is_pool_resilvered
99	return $?
100}
101
102function wait_for_scrub_end #pool timeout
103{
104	wait_for_action $1 $2 is_pool_scrubbed
105	return $?
106}
107
108#
109# Check if scan action has been restarted on the given pool
110#
111
112function is_scan_restarted #pool
113{
114	typeset pool=$1
115	zpool history -i $pool | grep -q "scan aborted, restarting"
116	return $?
117}
118
119function is_deferred_scan_started #pool
120{
121	typeset pool=$1
122	zpool history -i $pool | grep -q "starting deferred resilver"
123	return $?
124}
125