Skip to content

Commit

Permalink
ZTS: Fix create-o_ashift test case
Browse files Browse the repository at this point in the history
The function that fills the uberblock ring buffer on every device label
has been reworked to avoid occasional failures caused by a race
condition that prevents 'zpool sync' from writing some uberblock
sequentially: this happens when the pool sync ioctl dispatch code calls
txg_wait_synced() while we're already waiting for a TXG to sync.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes openzfs#6924
Closes openzfs#6977
  • Loading branch information
loli10K authored and Nasf-Fan committed Feb 13, 2018
1 parent cc90037 commit c101204
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 34 deletions.
8 changes: 4 additions & 4 deletions cmd/zdb/zdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -2788,17 +2788,17 @@ dump_label(const char *dev)
exit(1);
}

if (ioctl(fd, BLKFLSBUF) != 0)
(void) printf("failed to invalidate cache '%s' : %s\n", path,
strerror(errno));

if (fstat64_blk(fd, &statbuf) != 0) {
(void) printf("failed to stat '%s': %s\n", path,
strerror(errno));
(void) close(fd);
exit(1);
}

if (S_ISBLK(statbuf.st_mode) && ioctl(fd, BLKFLSBUF) != 0)
(void) printf("failed to invalidate cache '%s' : %s\n", path,
strerror(errno));

avl_create(&config_tree, cksum_record_compare,
sizeof (cksum_record_t), offsetof(cksum_record_t, link));
avl_create(&uberblock_tree, cksum_record_compare,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,54 +42,47 @@

verify_runnable "global"

# See issue: https://github.com/zfsonlinux/zfs/issues/6924
if is_linux; then
log_unsupported "Test case occasionally fails"
fi

function cleanup
{
poolexists $TESTPOOL && destroy_pool $TESTPOOL
destroy_pool $TESTPOOL
log_must rm -f $disk
}

#
# Commit the specified number of TXGs to the provided pool
# We use 'zpool sync' here because we can't force it via sync(1) like on illumos
# $1 pool name
# $2 number of txg syncs
# Fill the uberblock ring in every <device> label: we do this by committing
# TXGs to the provided <pool> until every slot contains a valid uberblock.
# NOTE: We use 'zpool sync' here because we can't force it via sync(1) like on
# illumos
#
function txg_sync
function write_device_uberblocks # <device> <pool>
{
typeset pool=$1
typeset -i count=$2
typeset -i i=0;
typeset device=$1
typeset pool=$2

while [ $i -lt $count ]
while [ "$(zdb -quuul $device | grep -c 'invalid')" -ne 0 ]
do
log_must sync_pool $pool true
((i = i + 1))
sync_pool $pool true
done
}

#
# Verify device $1 labels contains $2 valid uberblocks in every label
# $1 device
# $2 uberblocks count
# Verify every label on <device> contains <count> (valid) uberblocks
#
function verify_device_uberblocks
function verify_device_uberblocks # <device> <count>
{
typeset device=$1
typeset ubcount=$2

zdb -quuul $device | egrep '^(\s+)?Uberblock' |
egrep -v 'invalid$' | awk \
-v ubcount=$ubcount '{ uberblocks[$0]++; }
END { for (i in uberblocks) {
count++;
if (uberblocks[i] != 4) { exit 1; }
}
if (count != ubcount) { exit 1; } }'
awk -v ubcount=$ubcount 'BEGIN { count=0 } { uberblocks[$0]++; }
END {
for (i in uberblocks) {
if (i ~ /invalid/) { continue; }
if (uberblocks[i] != 4) { exit 1; }
count++;
}
if (count != ubcount) { exit 1; }
}'

return $?
}
Expand All @@ -115,8 +108,7 @@ do
log_fail "Pool was created without setting ashift value to "\
"$ashift (current = $pprop)"
fi
# force 128 txg sync to fill the uberblock ring
txg_sync $TESTPOOL 128
write_device_uberblocks $disk $TESTPOOL
verify_device_uberblocks $disk ${ubcount[$i]}
if [[ $? -ne 0 ]]
then
Expand Down

0 comments on commit c101204

Please sign in to comment.