f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER START
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# The contents of this file are subject to the terms of the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Common Development and Distribution License (the "License").
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You may not use this file except in compliance with the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# or http://www.opensolaris.org/os/licensing.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# See the License for the specific language governing permissions
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# and limitations under the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER END
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Use is subject to license terms.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy. $STF_SUITE/include/libtest.shlib
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy. $STF_SUITE/tests/functional/redundancy/redundancy.cfg
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction cleanup
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if poolexists $TESTPOOL; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy destroy_pool $TESTPOOL
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dir
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for dir in $TESTDIR $BASEDIR; do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ -d $dir ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must rm -rf $dir
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Get random number between min and max number.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 Minimal value
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 Maximal value
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction random
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i min=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i max=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i value
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while true; do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((value = RANDOM % (max + 1)))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((value >= min)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy break
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo $value
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Record the directories construction and checksum all the files which reside
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# within the specified pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 The specified pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 The file which save the record.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction record_data
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset recordfile=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy [[ -z $pool ]] && log_fail "No specified pool."
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy [[ -f $recordfile ]] && log_must rm -f $recordfile
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset mntpnt
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy mntpnt=$(get_prop mountpoint $pool)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must eval "du -a $mntpnt > $recordfile 2>&1"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # When the data was damaged, checksum is failing and return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # So, will not use log_must
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy find $mntpnt -type f -exec cksum {} + >> $recordfile 2>&1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Create test pool and fill with files and directories.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 pool type
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $3 virtual devices number
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction setup_test_env
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset keyword=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i vdev_cnt=$3
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i i=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while (( i < vdev_cnt )); do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy vdevs="$vdevs $BASEDIR/vdev$i"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((i += 1))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ ! -d $BASEDIR ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must mkdir $BASEDIR
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if poolexists $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy destroy_pool $pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must mkfile $MINVDEVSIZE $vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zpool create -m $TESTDIR $pool $keyword $vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_note "Filling up the filesystem ..."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i i=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset file=$TESTDIR/file
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy while true ; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy file_write -o create -f $file.$i \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy -b $BLOCKSZ -c $NUM_WRITES
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( $ret != 0 )) && break
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( i = i + 1 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy (($ret != 28 )) && log_note "file_write return value($ret) is unexpected."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy record_data $TESTPOOL $PRE_RECORD_FILE
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Check pool status is healthy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction is_healthy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset healthy_output="pool '$pool' is healthy"
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset real_output=$(zpool status -x $pool)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ "$real_output" == "$healthy_output" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy zpool status -x $pool | grep "state:" | \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy grep "FAULTED" >/dev/null 2>&1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( $ret == 0 )) && return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset l_scan
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset errnum
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy l_scan=$(zpool status -x $pool | grep "scan:")
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy l_scan=${l_scan##*"with"}
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy errnum=$(echo $l_scan | awk '{print $1}')
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return $errnum
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Check pool data is valid
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction is_data_valid
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy record_data $pool $PST_RECORD_FILE
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy if ! diff $PRE_RECORD_FILE $PST_RECORD_FILE > /dev/null 2>&1; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Get the specified count devices name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 devices count
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction get_vdevs #pool cnt
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i cnt=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset all_devs=$(zpool iostat -v $pool | awk '{print $1}'| \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy egrep -v "^pool$|^capacity$|^mirror$|^raidz1$|^raidz2$|---" | \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy egrep -v "/old$|^$pool$")
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i i=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while ((i < cnt)); do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset dev=$(echo $all_devs | awk '{print $1}')
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy eval all_devs=\${all_devs##*$dev}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy vdevs="$dev $vdevs"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((i += 1))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo "$vdevs"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Synchronize all the data in pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction sync_pool #pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must sync
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must sleep 2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # Flush all the pool data.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy zpool scrub $pool >/dev/null 2>&1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy (( $ret != 0 )) && \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_fail "zpool scrub $pool failed."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while ! is_pool_scrubbed $pool; do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if is_pool_resilvered $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_fail "$pool should not be resilver completed."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must sleep 2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Create and replace the same name virtual device files
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2-n virtual device files
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction replace_missing_devs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy shift
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset vdev
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for vdev in $@; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must mkfile $MINVDEVSIZE $vdev
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zpool replace -f $pool $vdev $vdev
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy while true; do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! is_pool_resilvered $pool ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must sleep 2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy break
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Damage the pool's virtual device files.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 Failing devices count
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $3 damage vdevs method, if not null, we keep
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# the label for the vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction damage_devs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i cnt=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset label="$3"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset vdevs
4b5c8e93cab28d3c65ba9d407fd8f46e3be1db1cMatthew Ahrens typeset -i bs_count=$((64 * 1024))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy vdevs=$(get_vdevs $pool $cnt)
4b5c8e93cab28d3c65ba9d407fd8f46e3be1db1cMatthew Ahrens typeset dev
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ -n $label ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for dev in $vdevs; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy dd if=/dev/zero of=$dev seek=512 bs=1024 \
4b5c8e93cab28d3c65ba9d407fd8f46e3be1db1cMatthew Ahrens count=$bs_count conv=notrunc >/dev/null 2>&1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
4b5c8e93cab28d3c65ba9d407fd8f46e3be1db1cMatthew Ahrens for dev in $vdevs; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy dd if=/dev/zero of=$dev bs=1024 count=$bs_count \
4b5c8e93cab28d3c65ba9d407fd8f46e3be1db1cMatthew Ahrens conv=notrunc >/dev/null 2>&1
4b5c8e93cab28d3c65ba9d407fd8f46e3be1db1cMatthew Ahrens done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy sync_pool $pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Clear errors in the pool caused by data corruptions
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction clear_errors
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zpool clear $pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! is_healthy $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_note "$pool should be healthy."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! is_data_valid $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_note "Data should be valid in $pool."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Remove the specified pool's virtual device files
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 Pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 Missing devices count
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction remove_devs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i cnt=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy vdevs=$(get_vdevs $pool $cnt)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must rm -f $vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy sync_pool $pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Recover the bad or missing device files in the pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 Pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 Missing devices count
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction recover_bad_missing_devs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i cnt=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy vdevs=$(get_vdevs $pool $cnt)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy replace_missing_devs $pool $vdevs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! is_healthy $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_note "$pool should be healthy."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! is_data_valid $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_note "Data should be valid in $pool."
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}