mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-06-24 01:58:13 +03:00

ARC code was many times significantly modified over the years, that created significant amount of tangled and potentially broken code. This should make arc_access()/arc_read() code some more readable. - Decouple prefetch status tracking from b_refcnt. It made sense originally, but became highly cryptic over the years. Move all the logic into arc_access(). While there, clean up and comment state transitions in arc_access(). Some transitions were weird IMO. - Unify arc_access() calls to arc_read() instead of sometimes calling it from arc_read_done(). To avoid extra state changes and checks add one more b_refcnt for ARC_FLAG_IO_IN_PROGRESS. - Reimplement ARC_FLAG_WAIT in case of ARC_FLAG_IO_IN_PROGRESS with the same callback mechanism to not falsely account them as hits. Count those as "iohits", an intermediate between "hits" and "misses". While there, call read callbacks in original request order, that should be good for fairness and random speculations/allocations/aggregations. - Introduce additional statistic counters for prefetch, accounting predictive vs prescient and hits vs iohits vs misses. - Remove hash_lock argument from functions not needing it. - Remove ARC_FLAG_PREDICTIVE_PREFETCH, since it should be opposite to ARC_FLAG_PRESCIENT_PREFETCH if ARC_FLAG_PREFETCH is set. We may wish to add ARC_FLAG_PRESCIENT_PREFETCH to few more places. - Fix few false positive tests found in the process. Reviewed-by: George Wilson <gwilson@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14123
110 lines
3.4 KiB
Bash
Executable File
110 lines
3.4 KiB
Bash
Executable File
#!/bin/ksh -p
|
|
#
|
|
# CDDL HEADER START
|
|
#
|
|
# This file and its contents are supplied under the terms of the
|
|
# Common Development and Distribution License ("CDDL"), version 1.0.
|
|
# You may only use this file in accordance with the terms of version
|
|
# 1.0 of the CDDL.
|
|
#
|
|
# A full copy of the text of the CDDL should have accompanied this
|
|
# source. A copy of the CDDL is also available via the Internet at
|
|
# http://www.illumos.org/license/CDDL.
|
|
#
|
|
# CDDL HEADER END
|
|
#
|
|
|
|
#
|
|
# Copyright (c) 2019 by Tim Chase. All rights reserved.
|
|
# Copyright (c) 2019 Lawrence Livermore National Security, LLC.
|
|
#
|
|
|
|
. $STF_SUITE/include/libtest.shlib
|
|
. $STF_SUITE/tests/functional/trim/trim.kshlib
|
|
. $STF_SUITE/tests/functional/trim/trim.cfg
|
|
|
|
#
|
|
# DESCRIPTION:
|
|
# Check various pool geometries stripe, mirror, raidz
|
|
#
|
|
# STRATEGY:
|
|
# 1. Create a pool on file vdevs to trim.
|
|
# 2. Fill the pool to a known percentage of capacity.
|
|
# 3. Verify the vdevs contain 75% or more allocated blocks.
|
|
# 4. Remove all files making it possible to trim the entire pool.
|
|
# 5. Manually trim the pool.
|
|
# 6. Wait for trim to issue trim IOs for the free blocks.
|
|
# 7. Verify the disks contain 30% or less allocated blocks.
|
|
# 8. Repeat for test for striped, mirrored, and RAIDZ pools.
|
|
|
|
verify_runnable "global"
|
|
|
|
log_assert "Run 'zpool trim' verify pool disks were trimmed"
|
|
|
|
function cleanup
|
|
{
|
|
if poolexists $TESTPOOL; then
|
|
destroy_pool $TESTPOOL
|
|
fi
|
|
|
|
log_must rm -f $TRIM_VDEVS
|
|
|
|
log_must set_tunable64 TRIM_EXTENT_BYTES_MIN $trim_extent_bytes_min
|
|
log_must set_tunable64 TRIM_TXG_BATCH $trim_txg_batch
|
|
log_must set_tunable64 VDEV_MIN_MS_COUNT $vdev_min_ms_count
|
|
}
|
|
log_onexit cleanup
|
|
|
|
# Minimum trim size is decreased to verify all trim sizes.
|
|
typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN)
|
|
log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096
|
|
|
|
# Reduced TRIM_TXG_BATCH to make trimming more frequent.
|
|
typeset trim_txg_batch=$(get_tunable TRIM_TXG_BATCH)
|
|
log_must set_tunable64 TRIM_TXG_BATCH 8
|
|
|
|
# Increased metaslabs to better simulate larger more realistic devices.
|
|
typeset vdev_min_ms_count=$(get_tunable VDEV_MIN_MS_COUNT)
|
|
log_must set_tunable64 VDEV_MIN_MS_COUNT 32
|
|
|
|
typeset VDEV_MAX_MB=$(( floor(4 * MINVDEVSIZE * 0.75 / 1024 / 1024) ))
|
|
typeset VDEV_MIN_MB=$(( floor(4 * MINVDEVSIZE * 0.30 / 1024 / 1024) ))
|
|
|
|
for type in "" "mirror" "raidz2" "draid"; do
|
|
|
|
if [[ "$type" = "" ]]; then
|
|
VDEVS="$TRIM_VDEV1"
|
|
elif [[ "$type" = "mirror" ]]; then
|
|
VDEVS="$TRIM_VDEV1 $TRIM_VDEV2"
|
|
elif [[ "$type" = "raidz2" ]]; then
|
|
VDEVS="$TRIM_VDEV1 $TRIM_VDEV2 $TRIM_VDEV3"
|
|
elif [[ "$type" = "draid" ]]; then
|
|
VDEVS="$TRIM_VDEV1 $TRIM_VDEV2 $TRIM_VDEV3 $TRIM_VDEV4"
|
|
|
|
# The per-vdev utilization is lower due to the capacity
|
|
# resilverd for the distributed spare.
|
|
VDEV_MAX_MB=$(( floor(4 * MINVDEVSIZE * 0.50 / 1024 / 1024) ))
|
|
fi
|
|
|
|
log_must truncate -s $((4 * MINVDEVSIZE)) $VDEVS
|
|
log_must zpool create -f $TESTPOOL $type $VDEVS
|
|
|
|
typeset availspace=$(get_prop available $TESTPOOL)
|
|
typeset fill_mb=$(( floor(availspace * 0.90 / 1024 / 1024) ))
|
|
|
|
# Fill the pool, verify the vdevs are no longer sparse.
|
|
file_write -o create -f /$TESTPOOL/file -b 1048576 -c $fill_mb -d R
|
|
sync_pool $TESTPOOL
|
|
verify_vdevs "-ge" "$VDEV_MAX_MB" $VDEVS
|
|
|
|
# Remove the file, issue trim, verify the vdevs are now sparse.
|
|
log_must rm /$TESTPOOL/file
|
|
log_must timeout 120 zpool trim -w $TESTPOOL
|
|
verify_vdevs "-le" "$VDEV_MIN_MB" $VDEVS
|
|
|
|
log_must zpool destroy $TESTPOOL
|
|
log_must rm -f $VDEVS
|
|
done
|
|
|
|
log_pass "Manual trim successfully shrunk vdevs"
|