Author: delphij
Date: Fri Jul 18 17:55:12 2014
New Revision: 268848
URL: http://svnweb.freebsd.org/changeset/base/268848

Log:
  4958 zdb trips assert on pools with ashift >= 0xe
  Reviewed by: Matthew Ahrens <mahr...@delphix.com>
  Reviewed by: Max Grossman <max.gross...@delphix.com>
  Reviewed by: George Wilson <george.wil...@delphix.com>
  Reviewed by: Christopher Siden <christopher.si...@delphix.com>
  Approved by: Garrett D'Amore <garr...@damore.org>
  
  illumos/illumos-gate@2a104a5236475eb73aa41eaaf3ed9f3ccbe0ca55

Modified:
  vendor/illumos/dist/cmd/ztest/ztest.c

Changes in other areas also in this revision:
Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/dsl_pool.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/metaslab.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/spa_misc.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/vdev_impl.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zio.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_debug.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zio.c

Modified: vendor/illumos/dist/cmd/ztest/ztest.c
==============================================================================
--- vendor/illumos/dist/cmd/ztest/ztest.c       Fri Jul 18 16:25:35 2014        
(r268847)
+++ vendor/illumos/dist/cmd/ztest/ztest.c       Fri Jul 18 17:55:12 2014        
(r268848)
@@ -808,7 +808,7 @@ static uint64_t
 ztest_get_ashift(void)
 {
        if (ztest_opts.zo_ashift == 0)
-               return (SPA_MINBLOCKSHIFT + ztest_random(3));
+               return (SPA_MINBLOCKSHIFT + ztest_random(5));
        return (ztest_opts.zo_ashift);
 }
 
@@ -967,11 +967,28 @@ ztest_random_spa_version(uint64_t initia
        return (version);
 }
 
+/*
+ * Find the largest ashift used
+ */
+static uint64_t
+ztest_spa_get_ashift() {
+       uint64_t i;
+       uint64_t ashift = SPA_MINBLOCKSHIFT;
+       vdev_t *rvd = ztest_spa->spa_root_vdev;
+
+       for (i = 0; i < rvd->vdev_children; i++) {
+               ashift = MAX(ashift, rvd->vdev_child[i]->vdev_ashift);
+       }
+       return (ashift);
+}
+
 static int
 ztest_random_blocksize(void)
 {
-       return (1 << (SPA_MINBLOCKSHIFT +
-           ztest_random(SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)));
+       // Choose a block size >= the ashift.
+       uint64_t block_shift =
+           ztest_random(SPA_MAXBLOCKSHIFT - ztest_spa_get_ashift() + 1);
+       return (1 << (SPA_MINBLOCKSHIFT + block_shift));
 }
 
 static int
@@ -5765,16 +5782,30 @@ ztest_freeze(void)
        spa_freeze(spa);
 
        /*
+        * Because it is hard to predict how much space a write will actually
+        * require beforehand, we leave ourselves some fudge space to write over
+        * capacity.
+        */
+       uint64_t capacity = metaslab_class_get_space(spa_normal_class(spa)) / 2;
+
+       /*
         * Run tests that generate log records but don't alter the pool config
         * or depend on DSL sync tasks (snapshots, objset create/destroy, etc).
         * We do a txg_wait_synced() after each iteration to force the txg
         * to increase well beyond the last synced value in the uberblock.
         * The ZIL should be OK with that.
+        *
+        * Run a random number of times less than zo_maxloops and ensure we do
+        * not run out of space on the pool.
         */
        while (ztest_random(10) != 0 &&
-           numloops++ < ztest_opts.zo_maxloops) {
-               ztest_dmu_write_parallel(zd, 0);
-               ztest_dmu_object_alloc_free(zd, 0);
+           numloops++ < ztest_opts.zo_maxloops &&
+           metaslab_class_get_alloc(spa_normal_class(spa)) < capacity) {
+               ztest_od_t od;
+               ztest_od_init(&od, 0, FTAG, 0, DMU_OT_UINT64_OTHER, 0, 0);
+               VERIFY0(ztest_object_init(zd, &od, sizeof (od), B_FALSE));
+               ztest_io(zd, od.od_object,
+                   ztest_random(ZTEST_RANGE_LOCKS) << SPA_MAXBLOCKSHIFT);
                txg_wait_synced(spa_get_dsl(spa), 0);
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to