1*6f793812SPavel Zakharov#!/usr/bin/ksh -p
2*6f793812SPavel Zakharov
3*6f793812SPavel Zakharov#
4*6f793812SPavel Zakharov# This file and its contents are supplied under the terms of the
5*6f793812SPavel Zakharov# Common Development and Distribution License ("CDDL"), version 1.0.
6*6f793812SPavel Zakharov# You may only use this file in accordance with the terms of version
7*6f793812SPavel Zakharov# 1.0 of the CDDL.
8*6f793812SPavel Zakharov#
9*6f793812SPavel Zakharov# A full copy of the text of the CDDL should have accompanied this
10*6f793812SPavel Zakharov# source.  A copy of the CDDL is also available via the Internet at
11*6f793812SPavel Zakharov# http://www.illumos.org/license/CDDL.
12*6f793812SPavel Zakharov#
13*6f793812SPavel Zakharov
14*6f793812SPavel Zakharov#
15*6f793812SPavel Zakharov# Copyright (c) 2016 by Delphix. All rights reserved.
16*6f793812SPavel Zakharov#
17*6f793812SPavel Zakharov
18*6f793812SPavel Zakharov. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib
19*6f793812SPavel Zakharov
20*6f793812SPavel Zakharov#
21*6f793812SPavel Zakharov# DESCRIPTION:
22*6f793812SPavel Zakharov#	A pool should be importable when up to 2 top-level devices are missing.
23*6f793812SPavel Zakharov#
24*6f793812SPavel Zakharov# STRATEGY:
25*6f793812SPavel Zakharov#	1. Create a pool.
26*6f793812SPavel Zakharov#	2. Write some data to the pool and checksum it.
27*6f793812SPavel Zakharov#	3. Add one or more devices.
28*6f793812SPavel Zakharov#	4. Write more data to the pool and checksum it.
29*6f793812SPavel Zakharov#	5. Export the pool.
30*6f793812SPavel Zakharov#	6. Move added devices out of the devices directory.
31*6f793812SPavel Zakharov#	7. Import the pool with missing devices.
32*6f793812SPavel Zakharov#	8. Verify that the first batch of data is intact.
33*6f793812SPavel Zakharov#	9. Verify that accessing the second batch of data doesn't suspend pool.
34*6f793812SPavel Zakharov#	10. Export the pool, move back missing devices, Re-import the pool.
35*6f793812SPavel Zakharov#	11. Verify that all the data is intact.
36*6f793812SPavel Zakharov#
37*6f793812SPavel Zakharov
38*6f793812SPavel Zakharovverify_runnable "global"
39*6f793812SPavel Zakharov
40*6f793812SPavel Zakharovfunction custom_cleanup
41*6f793812SPavel Zakharov{
42*6f793812SPavel Zakharov	log_must set_spa_load_verify_metadata 1
43*6f793812SPavel Zakharov	log_must set_spa_load_verify_data 1
44*6f793812SPavel Zakharov	log_must set_zfs_max_missing_tvds 0
45*6f793812SPavel Zakharov	log_must rm -rf $BACKUP_DEVICE_DIR
46*6f793812SPavel Zakharov	# Highly damaged pools may fail to be destroyed, so we export them.
47*6f793812SPavel Zakharov	poolexists $TESTPOOL1 && log_must zpool export $TESTPOOL1
48*6f793812SPavel Zakharov	cleanup
49*6f793812SPavel Zakharov}
50*6f793812SPavel Zakharov
51*6f793812SPavel Zakharovlog_onexit custom_cleanup
52*6f793812SPavel Zakharov
53*6f793812SPavel Zakharovfunction test_devices_missing
54*6f793812SPavel Zakharov{
55*6f793812SPavel Zakharov	typeset poolcreate="$1"
56*6f793812SPavel Zakharov	typeset addvdevs="$2"
57*6f793812SPavel Zakharov	typeset missingvdevs="$3"
58*6f793812SPavel Zakharov	typeset -i missingtvds="$4"
59*6f793812SPavel Zakharov
60*6f793812SPavel Zakharov	log_note "$0: pool '$poolcreate', adding $addvdevs, then" \
61*6f793812SPavel Zakharov	    "moving away $missingvdevs."
62*6f793812SPavel Zakharov
63*6f793812SPavel Zakharov	log_must zpool create $TESTPOOL1 $poolcreate
64*6f793812SPavel Zakharov
65*6f793812SPavel Zakharov	log_must generate_data $TESTPOOL1 $MD5FILE "first"
66*6f793812SPavel Zakharov
67*6f793812SPavel Zakharov	log_must zpool add $TESTPOOL1 $addvdevs
68*6f793812SPavel Zakharov
69*6f793812SPavel Zakharov	log_must generate_data $TESTPOOL1 $MD5FILE2 "second"
70*6f793812SPavel Zakharov
71*6f793812SPavel Zakharov	log_must zpool export $TESTPOOL1
72*6f793812SPavel Zakharov
73*6f793812SPavel Zakharov	log_must mv $missingvdevs $BACKUP_DEVICE_DIR
74*6f793812SPavel Zakharov
75*6f793812SPavel Zakharov	# Tell zfs that it is ok to import a pool with missing top-level vdevs
76*6f793812SPavel Zakharov	log_must set_zfs_max_missing_tvds $missingtvds
77*6f793812SPavel Zakharov	# Missing devices means that data or metadata may be corrupted.
78*6f793812SPavel Zakharov	(( missingtvds > 1 )) && log_must set_spa_load_verify_metadata 0
79*6f793812SPavel Zakharov	log_must set_spa_load_verify_data 0
80*6f793812SPavel Zakharov	log_must zpool import -o readonly=on -d $DEVICE_DIR $TESTPOOL1
81*6f793812SPavel Zakharov
82*6f793812SPavel Zakharov	log_must verify_data_md5sums $MD5FILE
83*6f793812SPavel Zakharov
84*6f793812SPavel Zakharov	log_note "Try reading second batch of data, make sure pool doesn't" \
85*6f793812SPavel Zakharov	    "get suspended."
86*6f793812SPavel Zakharov	verify_data_md5sums $MD5FILE >/dev/null 2>&1
87*6f793812SPavel Zakharov
88*6f793812SPavel Zakharov	log_must zpool export $TESTPOOL1
89*6f793812SPavel Zakharov
90*6f793812SPavel Zakharov	typeset newpaths=$(echo "$missingvdevs" | \
91*6f793812SPavel Zakharov		sed "s:$DEVICE_DIR:$BACKUP_DEVICE_DIR:g")
92*6f793812SPavel Zakharov	log_must mv $newpaths $DEVICE_DIR
93*6f793812SPavel Zakharov	log_must set_spa_load_verify_metadata 1
94*6f793812SPavel Zakharov	log_must set_spa_load_verify_data 1
95*6f793812SPavel Zakharov	log_must set_zfs_max_missing_tvds 0
96*6f793812SPavel Zakharov	log_must zpool import -d $DEVICE_DIR $TESTPOOL1
97*6f793812SPavel Zakharov
98*6f793812SPavel Zakharov	log_must verify_data_md5sums $MD5FILE
99*6f793812SPavel Zakharov	log_must verify_data_md5sums $MD5FILE2
100*6f793812SPavel Zakharov
101*6f793812SPavel Zakharov	# Cleanup
102*6f793812SPavel Zakharov	log_must zpool destroy $TESTPOOL1
103*6f793812SPavel Zakharov
104*6f793812SPavel Zakharov	log_note ""
105*6f793812SPavel Zakharov}
106*6f793812SPavel Zakharov
107*6f793812SPavel Zakharovlog_must mkdir $BACKUP_DEVICE_DIR
108*6f793812SPavel Zakharov
109*6f793812SPavel Zakharovtest_devices_missing "$VDEV0" "$VDEV1" "$VDEV1" 1
110*6f793812SPavel Zakharovtest_devices_missing "$VDEV0" "$VDEV1 $VDEV2" "$VDEV1" 1
111*6f793812SPavel Zakharovtest_devices_missing "mirror $VDEV0 $VDEV1" "mirror $VDEV2 $VDEV3" \
112*6f793812SPavel Zakharov    "$VDEV2 $VDEV3" 1
113*6f793812SPavel Zakharovtest_devices_missing "$VDEV0 log $VDEV1" "$VDEV2" "$VDEV2" 1
114*6f793812SPavel Zakharov
115*6f793812SPavel Zakharov#
116*6f793812SPavel Zakharov# Note that we are testing for 2 non-consecutive missing devices.
117*6f793812SPavel Zakharov# Missing consecutive devices results in missing metadata. Because of
118*6f793812SPavel Zakharov# Missing metadata can cause the root dataset to fail to mount.
119*6f793812SPavel Zakharov#
120*6f793812SPavel Zakharovtest_devices_missing "$VDEV0" "$VDEV1 $VDEV2 $VDEV3" "$VDEV1 $VDEV3" 2
121*6f793812SPavel Zakharov
122*6f793812SPavel Zakharovlog_pass "zpool import succeeded with missing devices."
123