]> granicus.if.org Git - zfs/commitdiff
ZTS: Fix create-o_ashift test case
authorLOLi <loli10K@users.noreply.github.com>
Tue, 19 Dec 2017 18:49:33 +0000 (19:49 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 19 Dec 2017 18:49:33 +0000 (10:49 -0800)
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 #6924
Closes #6977

cmd/zdb/zdb.c
tests/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh

index cc4f22a9ed44197294b23d7ead81f6c1a3145eb3..69001071dba9fe48a88650ec684c310a50ba3138 100644 (file)
@@ -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,
index 2d477eaf6e08505322296672d62f7a8f698ad0ab..6a9c3e28c3a41f5421d5bd9047f87680ccf99892 100755 (executable)
 
 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