]> git.proxmox.com Git - mirror_zfs.git/blobdiff - tests/zfs-tests/tests/functional/fault/auto_spare_001_pos.ksh
Distributed Spare (dRAID) Feature
[mirror_zfs.git] / tests / zfs-tests / tests / functional / fault / auto_spare_001_pos.ksh
index b6af1a3f40f83bc14af8936e6f38995361cafe87..a93267185b06365495d8e1385f3d09cfb55efbb6 100755 (executable)
@@ -55,36 +55,59 @@ zed_events_drain
 
 TESTFILE="/$TESTPOOL/$TESTFS/testfile"
 
-for type in "mirror" "raidz" "raidz2"; do
-       # 1. Create a pool with hot spares
-       truncate -s $SPA_MINDEVSIZE $VDEV_FILES $SPARE_FILE
-       log_must zpool create -f $TESTPOOL $type $VDEV_FILES spare $SPARE_FILE
+for type in "mirror" "raidz" "raidz2" "draid:1s"; do
+       if [ "$type" = "draid:1s" ]; then
+               # 1. Create a dRAID pool with a distributed hot spare
+               #
+               # Corruption is injected in the file-2 instead of file-1
+               # vdev since the dRAID permutation at these offsets maps
+               # to distributed spare space and not data devices.
+               #
+               log_must truncate -s $MINVDEVSIZE $VDEV_FILES
+               log_must zpool create -f $TESTPOOL $type $VDEV_FILES
+               SPARE="draid1-0-0"
+               FAULT="$TEST_BASE_DIR/file-2"
+       else
+               # 1. Create a pool with hot spares
+               log_must truncate -s $MINVDEVSIZE $VDEV_FILES $SPARE_FILE
+               log_must zpool create -f $TESTPOOL $type $VDEV_FILES \
+                   spare $SPARE_FILE
+               SPARE=$SPARE_FILE
+               FAULT=$FAULT_FILE
+       fi
 
        # 2. Create a filesystem with the primary cache disable to force reads
        log_must zfs create -o primarycache=none $TESTPOOL/$TESTFS
        log_must zfs set recordsize=16k $TESTPOOL/$TESTFS
 
        # 3. Write a file to the pool to be read back
-       log_must dd if=/dev/urandom of=$TESTFILE bs=1M count=16
+       log_must dd if=/dev/urandom of=$TESTFILE bs=1M count=64
 
        # 4. Inject IO ERRORS on read with a zinject error handler
-       log_must zinject -d $FAULT_FILE -e io -T read $TESTPOOL
+       log_must zinject -d $FAULT -e io -T read $TESTPOOL
        log_must cp $TESTFILE /dev/null
 
        # 5. Verify the ZED kicks in a hot spare and expected pool/device status
        log_note "Wait for ZED to auto-spare"
-       log_must wait_vdev_state $TESTPOOL $FAULT_FILE "FAULTED" 60
-       log_must wait_vdev_state $TESTPOOL $SPARE_FILE "ONLINE" 60
-       log_must wait_hotspare_state $TESTPOOL $SPARE_FILE "INUSE"
+       log_must wait_vdev_state $TESTPOOL $FAULT "FAULTED" 60
+       log_must wait_vdev_state $TESTPOOL $SPARE "ONLINE" 60
+       log_must wait_hotspare_state $TESTPOOL $SPARE "INUSE"
        log_must check_state $TESTPOOL "" "DEGRADED"
 
+       # The ZED will use a sequential resilver for dRAID. Wait for the
+       # resilver and subsequent scrub to complete before moving on.
+       if [ "$type" = "draid:1s" ]; then
+               log_must wait_scrubbed $TESTPOOL
+       fi
+
        # 6. Clear the fault
        log_must zinject -c all
-       log_must zpool clear $TESTPOOL $FAULT_FILE
+       log_must zpool clear $TESTPOOL $FAULT
 
        # 7. Verify the hot spare is available and expected pool/device status
-       log_must wait_vdev_state $TESTPOOL $FAULT_FILE "ONLINE" 60
-       log_must wait_hotspare_state $TESTPOOL $SPARE_FILE "AVAIL"
+       log_must wait_vdev_state $TESTPOOL $FAULT "ONLINE" 60
+       log_must wait_hotspare_state $TESTPOOL $SPARE "AVAIL"
+
        log_must is_pool_resilvered $TESTPOOL
        log_must check_state $TESTPOOL "" "ONLINE"