xref: /illumos-gate/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib (revision bd0ce624be4492bab2f6c53383a40618647aba28)
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 2007 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#
30
31. $STF_SUITE/tests/functional/clean_mirror/default.cfg
32
33# Most of the code related to the clearing of mirrors is duplicated in all
34# the test cases below this directory, barring a few minor changes
35# involving the device to be affected and the 'object' to use to mangle
36# the contents of the mirror.
37# This code is sourced into each of these test cases.
38
39#
40# Synchronize all the data in pool
41#
42# $1 pool name
43#
44function sync_pool #pool
45{
46	typeset pool=$1
47
48	log_must sync
49	log_must sleep 2
50	# Flush all the pool data.
51	typeset -i ret
52	zpool scrub $pool >/dev/null 2>&1
53	ret=$?
54	(( $ret != 0 )) && \
55		log_fail "zpool scrub $pool failed."
56
57	while ! is_pool_scrubbed $pool; do
58		if is_pool_resilvered $pool ; then
59			log_fail "$pool should not be resilver completed."
60		fi
61		log_must sleep 2
62	done
63}
64
65function overwrite_verify_mirror
66{
67	typeset AFFECTED_DEVICE=$1
68	typeset OVERWRITING_DEVICE=$2
69
70	typeset atfile=0
71	set -A files
72	set -A cksums
73	set -A newcksums
74
75	while (( atfile < FILE_COUNT )); do
76		files[$atfile]=$TESTDIR/file.$atfile
77		log_must file_write -o create -f $TESTDIR/file.$atfile \
78			-b $FILE_SIZE -c 1
79		cksums[$atfile]=$(cksum ${files[$atfile]})
80		(( atfile = atfile + 1 ))
81	done
82
83	# dd the primary side of the mirror
84	log_must dd if=$OVERWRITING_DEVICE of=/dev/dsk/$AFFECTED_DEVICE \
85		seek=8 bs=$DD_BLOCK count=$(( DD_COUNT - 8 )) conv=notrunc
86
87	atfile=0
88
89	#
90	# Flush out the cache so that we ensure we're reading from disk.
91	#
92	log_must zpool export $TESTPOOL
93	log_must zpool import $TESTPOOL
94
95	typeset -i failedcount=0
96	while (( atfile < FILE_COUNT )); do
97		files[$atfile]=$TESTDIR/file.$atfile
98		newcksum=$(cksum ${files[$atfile]})
99		if [[ $newcksum != ${cksums[$atfile]} ]]; then
100			(( failedcount = failedcount + 1 ))
101		fi
102		rm -f ${files[$atfile]}
103		(( atfile = atfile + 1 ))
104	done
105
106	if (( $failedcount > 0 )); then
107		log_fail "of the $FILE_COUNT files $failedcount did not " \
108		    "have the same checksum before and after."
109	fi
110
111	sync_pool $TESTPOOL
112}
113