From: "Darrick J. Wong" <djwong@kernel.org>
To: Hans Holmberg <Hans.Holmberg@wdc.com>
Cc: "Zorro Lang" <zlang@redhat.com>,
"linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org>,
"Damien Le Moal" <Damien.LeMoal@wdc.com>,
"Matias Bjørling" <Matias.Bjorling@wdc.com>,
"Naohiro Aota" <Naohiro.Aota@wdc.com>,
"Johannes Thumshirn" <Johannes.Thumshirn@wdc.com>,
"hch@lst.de" <hch@lst.de>,
"fstests@vger.kernel.org" <fstests@vger.kernel.org>
Subject: Re: [PATCH] generic: add gc stress test
Date: Tue, 16 Apr 2024 11:54:37 -0700 [thread overview]
Message-ID: <20240416185437.GC11935@frogsfrogsfrogs> (raw)
In-Reply-To: <e748ee35-e53e-475a-8f38-68522fb80bee@wdc.com>
On Tue, Apr 16, 2024 at 09:07:43AM +0000, Hans Holmberg wrote:
> +Zorro (doh!)
>
> On 2024-04-15 13:23, Hans Holmberg wrote:
> > This test stresses garbage collection for file systems by first filling
> > up a scratch mount to a specific usage point with files of random size,
> > then doing overwrites in parallel with deletes to fragment the backing
> > storage, forcing reclaim.
> >
> > Signed-off-by: Hans Holmberg <hans.holmberg@wdc.com>
> > ---
> >
> > Test results in my setup (kernel 6.8.0-rc4+)
> > f2fs on zoned nullblk: pass (77s)
> > f2fs on conventional nvme ssd: pass (13s)
> > btrfs on zoned nublk: fails (-ENOSPC)
> > btrfs on conventional nvme ssd: fails (-ENOSPC)
> > xfs on conventional nvme ssd: pass (8s)
> >
> > Johannes(cc) is working on the btrfs ENOSPC issue.
> >
> > tests/generic/744 | 124 ++++++++++++++++++++++++++++++++++++++++++
> > tests/generic/744.out | 6 ++
> > 2 files changed, 130 insertions(+)
> > create mode 100755 tests/generic/744
> > create mode 100644 tests/generic/744.out
> >
> > diff --git a/tests/generic/744 b/tests/generic/744
> > new file mode 100755
> > index 000000000000..2c7ab76bf8b1
> > --- /dev/null
> > +++ b/tests/generic/744
> > @@ -0,0 +1,124 @@
> > +#! /bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Copyright (c) 2024 Western Digital Corporation. All Rights Reserved.
> > +#
> > +# FS QA Test No. 744
> > +#
> > +# Inspired by btrfs/273 and generic/015
> > +#
> > +# This test stresses garbage collection in file systems
> > +# by first filling up a scratch mount to a specific usage point with
> > +# files of random size, then doing overwrites in parallel with
> > +# deletes to fragment the backing zones, forcing reclaim.
> > +
> > +. ./common/preamble
> > +_begin_fstest auto
> > +
> > +# real QA test starts here
> > +
> > +_require_scratch
> > +
> > +# This test requires specific data space usage, skip if we have compression
> > +# enabled.
> > +_require_no_compress
> > +
> > +M=$((1024 * 1024))
> > +min_fsz=$((1 * ${M}))
> > +max_fsz=$((256 * ${M}))
> > +bs=${M}
> > +fill_percent=95
> > +overwrite_percentage=20
> > +seq=0
> > +
> > +_create_file() {
> > + local file_name=${SCRATCH_MNT}/data_$1
> > + local file_sz=$2
> > + local dd_extra=$3
> > +
> > + POSIXLY_CORRECT=yes dd if=/dev/zero of=${file_name} \
> > + bs=${bs} count=$(( $file_sz / ${bs} )) \
> > + status=none $dd_extra 2>&1
> > +
> > + status=$?
> > + if [ $status -ne 0 ]; then
> > + echo "Failed writing $file_name" >>$seqres.full
> > + exit
> > + fi
> > +}
I wonder, is there a particular reason for doing all these file
operations with shell code instead of using fsstress to create and
delete files to fill the fs and stress all the zone-gc code? This test
reminds me a lot of generic/476 but with more fork()ing.
--D
> > +
> > +_total_M() {
> > + local total=$(stat -f -c '%b' ${SCRATCH_MNT})
> > + local bs=$(stat -f -c '%S' ${SCRATCH_MNT})
> > + echo $(( ${total} * ${bs} / ${M}))
> > +}
> > +
> > +_used_percent() {
> > + local available=$(stat -f -c '%a' ${SCRATCH_MNT})
> > + local total=$(stat -f -c '%b' ${SCRATCH_MNT})
> > + echo $((100 - (100 * ${available}) / ${total} ))
> > +}
> > +
> > +
> > +_delete_random_file() {
> > + local to_delete=$(find ${SCRATCH_MNT} -type f | shuf | head -1)
> > + rm $to_delete
> > + sync ${SCRATCH_MNT}
> > +}
> > +
> > +_get_random_fsz() {
> > + local r=$RANDOM
> > + echo $(( ${min_fsz} + (${max_fsz} - ${min_fsz}) * (${r} % 100) / 100 ))
> > +}
> > +
> > +_direct_fillup () {
> > + while [ $(_used_percent) -lt $fill_percent ]; do
> > + local fsz=$(_get_random_fsz)
> > +
> > + _create_file $seq $fsz "oflag=direct conv=fsync"
> > + seq=$((${seq} + 1))
> > + done
> > +}
> > +
> > +_mixed_write_delete() {
> > + local dd_extra=$1
> > + local total_M=$(_total_M)
> > + local to_write_M=$(( ${overwrite_percentage} * ${total_M} / 100 ))
> > + local written_M=0
> > +
> > + while [ $written_M -lt $to_write_M ]; do
> > + if [ $(_used_percent) -lt $fill_percent ]; then
> > + local fsz=$(_get_random_fsz)
> > +
> > + _create_file $seq $fsz "$dd_extra"
> > + written_M=$((${written_M} + ${fsz}/${M}))
> > + seq=$((${seq} + 1))
> > + else
> > + _delete_random_file
> > + fi
> > + done
> > +}
> > +
> > +seed=$RANDOM
> > +RANDOM=$seed
> > +echo "Running test with seed=$seed" >>$seqres.full
> > +
> > +_scratch_mkfs_sized $((8 * 1024 * 1024 * 1024)) >>$seqres.full
> > +_scratch_mount
> > +
> > +echo "Starting fillup using direct IO"
> > +_direct_fillup
> > +
> > +echo "Starting mixed write/delete test using direct IO"
> > +_mixed_write_delete "oflag=direct"
> > +
> > +echo "Starting mixed write/delete test using buffered IO"
> > +_mixed_write_delete ""
> > +
> > +echo "Syncing"
> > +sync ${SCRATCH_MNT}/*
> > +
> > +echo "Done, all good"
> > +
> > +# success, all done
> > +status=0
> > +exit
> > diff --git a/tests/generic/744.out b/tests/generic/744.out
> > new file mode 100644
> > index 000000000000..b40c2f43108e
> > --- /dev/null
> > +++ b/tests/generic/744.out
> > @@ -0,0 +1,6 @@
> > +QA output created by 744
> > +Starting fillup using direct IO
> > +Starting mixed write/delete test using direct IO
> > +Starting mixed write/delete test using buffered IO
> > +Syncing
> > +Done, all good
>
next prev parent reply other threads:[~2024-04-16 18:54 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-15 11:23 [PATCH] generic: add gc stress test Hans Holmberg
2024-04-16 9:07 ` Hans Holmberg
2024-04-16 18:54 ` Darrick J. Wong [this message]
2024-04-17 12:43 ` Zorro Lang
2024-04-17 13:21 ` Hans Holmberg
2024-04-17 14:06 ` Zorro Lang
2024-04-17 14:45 ` Hans Holmberg
2024-05-08 7:08 ` Hans Holmberg
2024-05-08 8:51 ` Zorro Lang
2024-05-08 9:28 ` Qu Wenruo
2024-05-08 11:02 ` Johannes Thumshirn
2024-05-09 5:43 ` hch
2024-05-09 9:42 ` Zorro Lang
2024-05-09 12:54 ` hch
2024-05-10 3:21 ` Zorro Lang
2024-05-11 13:08 ` Hans Holmberg
2024-05-12 16:54 ` Johannes Thumshirn
2024-05-12 16:56 ` Johannes Thumshirn
2024-05-13 7:33 ` Qu Wenruo
2024-05-14 8:02 ` Hans Holmberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240416185437.GC11935@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=Damien.LeMoal@wdc.com \
--cc=Hans.Holmberg@wdc.com \
--cc=Johannes.Thumshirn@wdc.com \
--cc=Matias.Bjorling@wdc.com \
--cc=Naohiro.Aota@wdc.com \
--cc=fstests@vger.kernel.org \
--cc=hch@lst.de \
--cc=linux-btrfs@vger.kernel.org \
--cc=zlang@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.