diff options
author | Paul Zuchowski <31706010+PaulZ-98@users.noreply.github.com> | 2020-02-10 18:00:05 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-10 14:00:05 -0800 |
commit | bc67cba7c0f8b860746b3c80251fc8a968600d61 (patch) | |
tree | 4578d49cc65178d3fa98c3deaa1bd1adfa226c0f /tests | |
parent | dda702fd16bafac1ecb081590f6b00eea8a1136b (diff) |
Fix zdb -R with 'b' flag
zdb -R :b fails due to the indirect block being compressed,
and the 'b' and 'd' flag not working in tandem when specified.
Fix the flag parsing code and create a zfs test for zdb -R
block display. Also fix the zio flags where the dotted notation
for the vdev portion of DVA (i.e. 0.0:offset:length) fails.
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Paul Zuchowski <pzuchowski@datto.com>
Closes #9640
Closes #9729
Diffstat (limited to 'tests')
-rw-r--r-- | tests/runfiles/common.run | 3 | ||||
-rw-r--r-- | tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am | 5 | ||||
-rwxr-xr-x | tests/zfs-tests/tests/functional/cli_root/zdb/zdb_display_block.ksh | 128 |
3 files changed, 133 insertions, 3 deletions
diff --git a/tests/runfiles/common.run b/tests/runfiles/common.run index 72745bfa7..81cca7eed 100644 --- a/tests/runfiles/common.run +++ b/tests/runfiles/common.run @@ -101,7 +101,8 @@ tags = ['functional', 'clean_mirror'] [tests/functional/cli_root/zdb] tests = ['zdb_001_neg', 'zdb_002_pos', 'zdb_003_pos', 'zdb_004_pos', 'zdb_005_pos', 'zdb_006_pos', 'zdb_checksum', 'zdb_decompress', - 'zdb_object_range_neg', 'zdb_object_range_pos', 'zdb_objset_id'] + 'zdb_object_range_neg', 'zdb_object_range_pos', 'zdb_display_block', + 'zdb_objset_id'] pre = post = tags = ['functional', 'cli_root', 'zdb'] diff --git a/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am b/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am index e4679ae9f..71fe68436 100644 --- a/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am +++ b/tests/zfs-tests/tests/functional/cli_root/zdb/Makefile.am @@ -8,6 +8,7 @@ dist_pkgdata_SCRIPTS = \ zdb_006_pos.ksh \ zdb_checksum.ksh \ zdb_decompress.ksh \ - zdb_objset_id.ksh \ zdb_object_range_neg.ksh \ - zdb_object_range_pos.ksh + zdb_object_range_pos.ksh \ + zdb_display_block.ksh \ + zdb_objset_id.ksh diff --git a/tests/zfs-tests/tests/functional/cli_root/zdb/zdb_display_block.ksh b/tests/zfs-tests/tests/functional/cli_root/zdb/zdb_display_block.ksh new file mode 100755 index 000000000..c8a52def4 --- /dev/null +++ b/tests/zfs-tests/tests/functional/cli_root/zdb/zdb_display_block.ksh @@ -0,0 +1,128 @@ +#!/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2019 by Datto, Inc. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# Description: +# zdb -R pool <DVA>:b will display the block +# +# Strategy: +# 1. Create a pool, set compression to lzjb +# 2. Write some identifiable data to a file +# 3. Run zdb -ddddddbbbbbb against the file +# 4. Record the DVA of the first L1 block; +# record the first L0 block display; and +# record the 2nd L0 block display. +# 5. Run zdb -R with :bd displays first L0 +# 6. Run zdb -R with :b80d displays 2nd L0 +# 7. Run zdb -R with :db80 displays 2nd L0 +# 8. Run zdb -R with :id flag displays indirect block +# (similar to zdb -ddddddbbbbbb output) +# 9. Run zdb -R with :id flag and .0 vdev +# + + +function cleanup +{ + datasetexists $TESTPOOL && destroy_pool $TESTPOOL +} + +log_assert "Verify zdb -R :b flag (block display) works as expected" +log_onexit cleanup +init_data=$TESTDIR/file1 +write_count=256 +blksize=4096 + +# only read 256 128 byte block pointers in L1 (:i flag) +# 256 x 128 = 32k / 0x8000 +l1_read_size="8000" + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +default_mirror_setup_noexit $DISKS +log_must zfs set recordsize=$blksize $TESTPOOL/$TESTFS +log_must zfs set compression=lzjb $TESTPOOL/$TESTFS + +file_write -d R -o create -w -f $init_data -b $blksize -c $write_count +sync_pool $TESTPOOL true + +# get object number of file +listing=$(ls -i $init_data) +set -A array $listing +obj=${array[0]} +log_note "file $init_data has object number $obj" + +output=$(zdb -ddddddbbbbbb $TESTPOOL/$TESTFS $obj 2> /dev/null \ + |grep -m 1 "L1 DVA" |head -n1) +dva=$(sed -Ene 's/^.+DVA\[0\]=<([^>]+)>.*/\1/p' <<< "$output") +log_note "first L1 block $init_data has a DVA of $dva" +output=$(zdb -ddddddbbbbbb $TESTPOOL/$TESTFS $obj 2> /dev/null \ + |grep -m 1 "L0 DVA" |head -n1) +blk_out0=${output##*>} +blk_out0=${blk_out0##+([[:space:]])} + +output=$(zdb -ddddddbbbbbb $TESTPOOL/$TESTFS $obj 2> /dev/null \ + |grep -m 1 "1000 L0 DVA" |head -n1) +blk_out1=${output##*>} +blk_out1=${blk_out1##+([[:space:]])} + +output=$(export ZDB_NO_ZLE=\"true\"; zdb -R $TESTPOOL $dva:bd\ + 2> /dev/null) +output=${output##*>} +output=${output##+([[:space:]])} +if [ "$output" != "$blk_out0" ]; then + log_fail "zdb -R :bd (block 0 display/decompress) failed" +fi + +output=$(export ZDB_NO_ZLE=\"true\"; zdb -R $TESTPOOL $dva:db80\ + 2> /dev/null) +output=${output##*>} +output=${output##+([[:space:]])} +if [ "$output" != "$blk_out1" ]; then + log_fail "zdb -R :db80 (block 1 display/decompress) failed" +fi + +output=$(export ZDB_NO_ZLE=\"true\"; zdb -R $TESTPOOL $dva:b80d\ + 2> /dev/null) +output=${output##*>} +output=${output##+([[:space:]])} +if [ "$output" != "$blk_out1" ]; then + log_fail "zdb -R :b80d (block 1 display/decompress) failed" +fi + +vdev=$(echo "$dva" |awk '{split($0,array,":")} END{print array[1]}') +offset=$(echo "$dva" |awk '{split($0,array,":")} END{print array[2]}') +output=$(export ZDB_NO_ZLE=\"true\";\ + zdb -R $TESTPOOL $vdev:$offset:$l1_read_size:id 2> /dev/null) +block_cnt=$(echo "$output" | grep 'L0' | wc -l) +if [ "$block_cnt" != "$write_count" ]; then + log_fail "zdb -R :id (indirect block display) failed" +fi + +# read from specific half of mirror +vdev="$vdev.0" +log_note "Reading from DVA $vdev:$offset:$l1_read_size" +output=$(export ZDB_NO_ZLE=\"true\";\ + zdb -R $TESTPOOL $vdev:$offset:$l1_read_size:id 2> /dev/null) +block_cnt=$(echo "$output" | grep 'L0' | wc -l) +if [ "$block_cnt" != "$write_count" ]; then + log_fail "zdb -R 0.0:offset:length:id (indirect block display) failed" +fi + +log_pass "zdb -R :b flag (block display) works as expected" |