mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user