1663207adSDon Brady#!/bin/ksh -p 2663207adSDon Brady 3663207adSDon Brady# 4663207adSDon Brady# This file and its contents are supplied under the terms of the 5663207adSDon Brady# Common Development and Distribution License ("CDDL"), version 1.0. 6663207adSDon Brady# You may only use this file in accordance with the terms of version 7663207adSDon Brady# 1.0 of the CDDL. 8663207adSDon Brady# 9663207adSDon Brady# A full copy of the text of the CDDL should have accompanied this 10663207adSDon Brady# source. A copy of the CDDL is also available via the Internet at 11663207adSDon Brady# http://www.illumos.org/license/CDDL. 12663207adSDon Brady# 13663207adSDon Brady 14663207adSDon Brady# 15663207adSDon Brady# Copyright (c) 2018 by Delphix. All rights reserved. 16663207adSDon Brady# Copyright 2019 Joyent, Inc. 17663207adSDon Brady# 18663207adSDon Brady 19663207adSDon Brady. $STF_SUITE/tests/functional/alloc_class/alloc_class.kshlib 20663207adSDon Brady 21663207adSDon Brady# 22663207adSDon Brady# DESCRIPTION: 23663207adSDon Brady# Removing a special device from a pool succeeds. 24663207adSDon Brady# 25663207adSDon Brady 26663207adSDon Bradyverify_runnable "global" 27663207adSDon Brady 28663207adSDon Brady# 29663207adSDon Brady# Verify the file identified by the input <inode> is written on a special vdev 30663207adSDon Brady# According to the pool layout used in this test vdev_id 3 and 4 are special 31663207adSDon Brady# XXX: move this function to libtest.shlib once we get "Vdev Properties" 32663207adSDon Brady# 33663207adSDon Bradyfunction file_in_special_vdev # <dataset> <inode> 34663207adSDon Brady{ 35663207adSDon Brady typeset dataset="$1" 36663207adSDon Brady typeset inum="$2" 37663207adSDon Brady 38663207adSDon Brady zdb -dddddd $dataset $inum | nawk '{ 39663207adSDon Brady# find DVAs from string "offset level dva" only for L0 (data) blocks 40663207adSDon Bradyif (match($0,"L0 [0-9]+")) { 41663207adSDon Brady dvas[0]=$3 42663207adSDon Brady dvas[1]=$4 43663207adSDon Brady dvas[2]=$5 44663207adSDon Brady for (i = 0; i < 3; ++i) { 45663207adSDon Brady if (match(dvas[i],"([^:]+):.*")) { 46663207adSDon Brady dva = substr(dvas[i], RSTART, RLENGTH); 47663207adSDon Brady # parse DVA from string "vdev:offset:asize" 48663207adSDon Brady if (split(dva,arr,":") != 3) { 49663207adSDon Brady print "Error parsing DVA: <" dva ">"; 50663207adSDon Brady exit 1; 51663207adSDon Brady } 52663207adSDon Brady # verify vdev is "special" 53663207adSDon Brady if (arr[1] < 3) { 54663207adSDon Brady exit 1; 55663207adSDon Brady } 56663207adSDon Brady } 57663207adSDon Brady } 58663207adSDon Brady}}' 59663207adSDon Brady} 60663207adSDon Brady 61663207adSDon Bradyclaim="Removing a special device from a pool succeeds." 62663207adSDon Brady 63663207adSDon Bradylog_assert $claim 64663207adSDon Bradylog_onexit cleanup 65663207adSDon Brady 66663207adSDon Brady# 67663207adSDon Brady# Create a non-raidz pool so we can remove top-level vdevs 68663207adSDon Brady# 69663207adSDon Bradylog_must disk_setup 70663207adSDon Bradylog_must zpool create $TESTPOOL $ZPOOL_DISK0 $ZPOOL_DISK1 $ZPOOL_DISK2 \ 71663207adSDon Brady special $CLASS_DISK0 special $CLASS_DISK1 72663207adSDon Bradylog_must display_status "$TESTPOOL" 73663207adSDon Brady 74663207adSDon Brady# 75663207adSDon Brady# Generate some metadata and small blocks in the special class before removal 76663207adSDon Brady# 77663207adSDon Bradytypeset -l i=1 78663207adSDon Bradytypeset -l blocks=25 79663207adSDon Brady 80663207adSDon Bradylog_must zfs create -o special_small_blocks=32K -o recordsize=32K \ 81663207adSDon Brady $TESTPOOL/$TESTFS 82663207adSDon Bradyfor i in 1 2 3 4; do 83663207adSDon Brady log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/testfile.$i bs=1M \ 84663207adSDon Brady count=$blocks 85663207adSDon Brady ((blocks = blocks + 25)) 86663207adSDon Bradydone 87*09fbbb7dSAllan Judesync_pool $TESTPOOL 88663207adSDon Bradylog_must zpool list -v $TESTPOOL 89663207adSDon Brady 90663207adSDon Brady# Verify the files were written in the special class vdevs 91663207adSDon Bradyfor i in 1 2 3 4; do 92663207adSDon Brady dataset="$TESTPOOL/$TESTFS" 93663207adSDon Brady inum="$(stat -c '%i' /$TESTPOOL/$TESTFS/testfile.$i)" 94663207adSDon Brady log_must file_in_special_vdev $dataset $inum 95663207adSDon Bradydone 96663207adSDon Brady 97663207adSDon Brady# 98663207adSDon Brady# remove a special allocation vdev and force a remapping 99663207adSDon Brady# 100663207adSDon Bradylog_must zpool remove $TESTPOOL $CLASS_DISK0 101663207adSDon Bradylog_must zfs remap $TESTPOOL/$TESTFS 102663207adSDon Brady 103663207adSDon Bradysleep 5 104*09fbbb7dSAllan Judesync_pool $TESTPOOL 105663207adSDon Bradysleep 1 106663207adSDon Brady 107663207adSDon Bradylog_must zdb -bbcc $TESTPOOL 108663207adSDon Bradylog_must zpool list -v $TESTPOOL 109663207adSDon Bradylog_must zpool destroy -f "$TESTPOOL" 110663207adSDon Brady 111663207adSDon Bradylog_pass $claim 112