diff options
author | LOLi <[email protected]> | 2017-12-19 19:49:33 +0100 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-12-19 10:49:33 -0800 |
commit | c30e34faa12e4b6e190edcccd4b2db185a286680 (patch) | |
tree | a52c946aab279cca8486309c4ff4a896fbf90f07 | |
parent | bbffb59efc49baba1d131d497202e8cda0068c3d (diff) |
ZTS: Fix create-o_ashift test case
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 <[email protected]>
Signed-off-by: loli10K <[email protected]>
Closes #6924
Closes #6977
-rw-r--r-- | cmd/zdb/zdb.c | 8 | ||||
-rwxr-xr-x | tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh | 52 |
2 files changed, 26 insertions, 34 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index cc4f22a9e..69001071d 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -2788,10 +2788,6 @@ 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)); @@ -2799,6 +2795,10 @@ dump_label(const char *dev) 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, diff --git a/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh b/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh index 2d477eaf6..6a9c3e28c 100755 --- a/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh +++ b/tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh @@ -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 $? } @@ -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 |