From 09b85f2dedfae2f15fed3140ffb3246bef36da97 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Mon, 5 Nov 2018 11:53:49 -0800 Subject: [PATCH] ztest: reduce gangblock creation In order to validate the gang block code ztest is configured to artificially force a fraction of large blocks to be written as gang blocks. The default setting chosen for this was to write 25% of all blocks 32k or larger using gang blocks. The confluence of an unrealistically large number of gang blocks, the aggressive fault injection done by ztest, and the split segment reconstruction logic introduced by device removal has resulted in the following type of failure: zdb -bccsv -G -d ... exit code 3 Specifically, zdb was unable to open the pool because it was unable to reconstruct a damaged block. Manual investigation of multiple failures clearly showed that the block could be reconstructed. However, due to the large number of damaged segments (>35) it could not be done in the allotted time. Furthermore, the large number of gang blocks was determined to be the reason for the unrealistically large number of damaged segments. In order to make this situation less likely, this change both increases the forced gang block size to 64k and reduces the frequency to 3% of blocks. Reviewed-by: Matthew Ahrens Reviewed-by: Tom Caputi Signed-off-by: Brian Behlendorf Closes #8080 --- cmd/ztest/ztest.c | 2 +- module/zfs/metaslab.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c index 03c62fc6f..1ad87bb30 100644 --- a/cmd/ztest/ztest.c +++ b/cmd/ztest/ztest.c @@ -201,7 +201,7 @@ static const ztest_shared_opts_t ztest_opts_defaults = { .zo_init = 1, .zo_time = 300, /* 5 minutes */ .zo_maxloops = 50, /* max loops during spa_freeze() */ - .zo_metaslab_force_ganging = 32 << 10, + .zo_metaslab_force_ganging = 64 << 10, .zo_special_vdevs = ZTEST_VDEV_CLASS_RND, }; diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c index 616a89507..4b5baf6a6 100644 --- a/module/zfs/metaslab.c +++ b/module/zfs/metaslab.c @@ -3309,9 +3309,12 @@ metaslab_alloc_dva(spa_t *spa, metaslab_class_t *mc, uint64_t psize, /* * For testing, make some blocks above a certain size be gang blocks. - * This will also test spilling from special to normal. + * This will result in more split blocks when using device removal, + * and a large number of split blocks coupled with ztest-induced + * damage can result in extremely long reconstruction times. This + * will also test spilling from special to normal. */ - if (psize >= metaslab_force_ganging && (ddi_get_lbolt() & 3) == 0) { + if (psize >= metaslab_force_ganging && (spa_get_random(100) < 3)) { metaslab_trace_add(zal, NULL, NULL, psize, d, TRACE_FORCE_GANG, allocator); return (SET_ERROR(ENOSPC)); -- 2.39.5