From: "Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
Brute force all possible blocksize clustersize combination on a bigalloc
filesystem for stressing atomic write using fio data crc verifier. We run
multiple threads in parallel with each job writing to its own file. The
parallel jobs running on a constrained filesystem size ensure that we
stress the ext4 allocator to allocate contiguous extents.
This test might do overlapping atomic writes but that should be okay
since overlapping parallel hardware atomic writes don't cause tearing as
long as io size is the same for all writes.
Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
---
tests/ext4/062 | 176 +++++++++++++++++++++++++++++++++++++++++++++
tests/ext4/062.out | 2 +
2 files changed, 178 insertions(+)
create mode 100755 tests/ext4/062
create mode 100644 tests/ext4/062.out
diff --git a/tests/ext4/062 b/tests/ext4/062
new file mode 100755
index 00000000..da5e1076
--- /dev/null
+++ b/tests/ext4/062
@@ -0,0 +1,176 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2025 IBM Corporation. All Rights Reserved.
+#
+# FS QA Test 062
+#
+# Brute force all possible blocksize clustersize combination on a bigalloc
+# filesystem for stressing atomic write using fio data crc verifier. We run
+# nproc * $LOAD_FACTOR threads in parallel writing to a single
+# $SCRATCH_MNT/test-file. We also create 8 such parallel jobs to run on
+# a constrained filesystem size to stress the ext4 allocator to allocate
+# contiguous extents.
+#
+
+. ./common/preamble
+. ./common/atomicwrites
+
+_begin_fstest auto rw stress atomicwrites
+
+_require_scratch_write_atomic
+_require_aiodio
+
+FSSIZE=$((360*1024*1024))
+FIO_LOAD=$(($(nproc) * LOAD_FACTOR))
+fiobsize=4096
+
+# Calculate fsblocksize as per bdev atomic write units.
+bdev_awu_min=$(_get_atomic_write_unit_min $SCRATCH_DEV)
+bdev_awu_max=$(_get_atomic_write_unit_max $SCRATCH_DEV)
+fsblocksize=$(_max 4096 "$bdev_awu_min")
+
+function create_fio_configs()
+{
+ create_fio_aw_config
+ create_fio_verify_config
+}
+
+function create_fio_verify_config()
+{
+cat >$fio_verify_config <<EOF
+ [global]
+ direct=1
+ ioengine=libaio
+ rw=randwrite
+ bs=$fiobsize
+ fallocate=truncate
+ size=$((FSSIZE / 12))
+ iodepth=$FIO_LOAD
+ numjobs=$FIO_LOAD
+ group_reporting=1
+ atomic=1
+
+ verify_only=1
+ verify_state_save=0
+ verify=crc32c
+ verify_fatal=1
+ verify_write_sequence=0
+
+ [verify-job1]
+ filename=$SCRATCH_MNT/testfile-job1
+
+ [verify-job2]
+ filename=$SCRATCH_MNT/testfile-job2
+
+ [verify-job3]
+ filename=$SCRATCH_MNT/testfile-job3
+
+ [verify-job4]
+ filename=$SCRATCH_MNT/testfile-job4
+
+ [verify-job5]
+ filename=$SCRATCH_MNT/testfile-job5
+
+ [verify-job6]
+ filename=$SCRATCH_MNT/testfile-job6
+
+ [verify-job7]
+ filename=$SCRATCH_MNT/testfile-job7
+
+ [verify-job8]
+ filename=$SCRATCH_MNT/testfile-job8
+
+EOF
+}
+
+function create_fio_aw_config()
+{
+cat >$fio_aw_config <<EOF
+ [global]
+ direct=1
+ ioengine=libaio
+ rw=randwrite
+ bs=$fiobsize
+ fallocate=truncate
+ size=$((FSSIZE / 12))
+ iodepth=$FIO_LOAD
+ numjobs=$FIO_LOAD
+ group_reporting=1
+ atomic=1
+
+ verify_state_save=0
+ verify=crc32c
+ do_verify=0
+
+ [write-job1]
+ filename=$SCRATCH_MNT/testfile-job1
+
+ [write-job2]
+ filename=$SCRATCH_MNT/testfile-job2
+
+ [write-job3]
+ filename=$SCRATCH_MNT/testfile-job3
+
+ [write-job4]
+ filename=$SCRATCH_MNT/testfile-job4
+
+ [write-job5]
+ filename=$SCRATCH_MNT/testfile-job5
+
+ [write-job6]
+ filename=$SCRATCH_MNT/testfile-job6
+
+ [write-job7]
+ filename=$SCRATCH_MNT/testfile-job7
+
+ [write-job8]
+ filename=$SCRATCH_MNT/testfile-job8
+
+EOF
+}
+
+# Let's create a sample fio config to check whether fio supports all options.
+fio_aw_config=$tmp.aw.fio
+fio_verify_config=$tmp.verify.fio
+fio_out=$tmp.fio.out
+
+create_fio_configs
+_require_fio $fio_aw_config
+
+for ((fsblocksize=$fsblocksize; fsblocksize <= $(_get_page_size); fsblocksize = $fsblocksize << 1)); do
+ # cluster sizes above 16 x blocksize are experimental so avoid them
+ # Also, cap cluster size at 128kb to keep it reasonable for large
+ # blocks size cases.
+ fs_max_clustersize=$(_min $((16 * fsblocksize)) "$bdev_awu_max" $((128 * 1024)))
+
+ for ((fsclustersize=$fsblocksize; fsclustersize <= $fs_max_clustersize; fsclustersize = $fsclustersize << 1)); do
+ for ((fiobsize = $fsblocksize; fiobsize <= $fsclustersize; fiobsize = $fiobsize << 1)); do
+ MKFS_OPTIONS="-O bigalloc -b $fsblocksize -C $fsclustersize"
+ _scratch_mkfs_sized "$FSSIZE" >> $seqres.full 2>&1 || continue
+ if _try_scratch_mount >> $seqres.full 2>&1; then
+ echo "== FIO test for fsblocksize=$fsblocksize fsclustersize=$fsclustersize fiobsize=$fiobsize ==" >> $seqres.full
+
+ touch $SCRATCH_MNT/f1
+ create_fio_configs
+
+ cat $fio_aw_config >> $seqres.full
+ cat $fio_verify_config >> $seqres.full
+
+ $FIO_PROG $fio_aw_config >> $seqres.full
+ ret1=$?
+
+ $FIO_PROG $fio_verify_config >> $seqres.full
+ ret2=$?
+
+ _scratch_unmount
+
+ [[ $ret1 -eq 0 && $ret2 -eq 0 ]] || _fail "fio with atomic write failed"
+ fi
+ done
+ done
+done
+
+# success, all done
+echo Silence is golden
+status=0
+exit
diff --git a/tests/ext4/062.out b/tests/ext4/062.out
new file mode 100644
index 00000000..a1578f48
--- /dev/null
+++ b/tests/ext4/062.out
@@ -0,0 +1,2 @@
+QA output created by 062
+Silence is golden
--
2.49.0
On 10/08/2025 14:42, Ojaswin Mujoo wrote: > From: "Ritesh Harjani (IBM)"<ritesh.list@gmail.com> > > Brute force all possible blocksize clustersize combination on a bigalloc > filesystem for stressing atomic write using fio data crc verifier. We run > multiple threads in parallel with each job writing to its own file. The > parallel jobs running on a constrained filesystem size ensure that we > stress the ext4 allocator to allocate contiguous extents. > > This test might do overlapping atomic writes but that should be okay > since overlapping parallel hardware atomic writes don't cause tearing as > long as io size is the same for all writes. > > Signed-off-by: Ritesh Harjani (IBM)<ritesh.list@gmail.com> > Reviewed-by: Darrick J. Wong<djwong@kernel.org> > Signed-off-by: Ojaswin Mujoo<ojaswin@linux.ibm.com> > --- > tests/ext4/062 | 176 +++++++++++++++++++++++++++++++++++++++++++++ > tests/ext4/062.out | 2 + > 2 files changed, 178 insertions(+) > create mode 100755 tests/ext4/062 > create mode 100644 tests/ext4/062.out Is the only difference to 061 that we have multiple files (and not a single file)? Thanks, John
On Wed, Aug 13, 2025 at 02:45:28PM +0100, John Garry wrote: > On 10/08/2025 14:42, Ojaswin Mujoo wrote: > > From: "Ritesh Harjani (IBM)"<ritesh.list@gmail.com> > > > > Brute force all possible blocksize clustersize combination on a bigalloc > > filesystem for stressing atomic write using fio data crc verifier. We run > > multiple threads in parallel with each job writing to its own file. The > > parallel jobs running on a constrained filesystem size ensure that we > > stress the ext4 allocator to allocate contiguous extents. > > > > This test might do overlapping atomic writes but that should be okay > > since overlapping parallel hardware atomic writes don't cause tearing as > > long as io size is the same for all writes. > > > > Signed-off-by: Ritesh Harjani (IBM)<ritesh.list@gmail.com> > > Reviewed-by: Darrick J. Wong<djwong@kernel.org> > > Signed-off-by: Ojaswin Mujoo<ojaswin@linux.ibm.com> > > --- > > tests/ext4/062 | 176 +++++++++++++++++++++++++++++++++++++++++++++ > > tests/ext4/062.out | 2 + > > 2 files changed, 178 insertions(+) > > create mode 100755 tests/ext4/062 > > create mode 100644 tests/ext4/062.out > > Is the only difference to 061 that we have multiple files (and not a single > file)? Hey John, Yes these 2 tests are similar however 061 uses fallocate=native + _scratch_mkfs_ext4 to test whether atomic writes on preallocated file via multiple threads works correctly. The 062 uses fallocate=truncate + _scratch_mkfs_sized 360MB + 'multiple jobs each writing to a different file' to ensure we are extensively stressing the allocation logic in low space scenarios. Regards, ojaswin > > Thanks, > John
On 21/08/2025 09:28, Ojaswin Mujoo wrote: > Yes these 2 tests are similar however 061 uses fallocate=native + > _scratch_mkfs_ext4 to test whether atomic writes on preallocated file > via multiple threads works correctly. > > The 062 uses fallocate=truncate + _scratch_mkfs_sized 360MB + > 'multiple jobs each writing to a different file' to ensure we are > extensively stressing the allocation logic in low space scenarios. I see, please at least fully document this in the commit messages. Thanks
On Thu, Aug 21, 2025 at 10:28:56AM +0100, John Garry wrote: > On 21/08/2025 09:28, Ojaswin Mujoo wrote: > > Yes these 2 tests are similar however 061 uses fallocate=native + > > _scratch_mkfs_ext4 to test whether atomic writes on preallocated file > > via multiple threads works correctly. > > > > The 062 uses fallocate=truncate + _scratch_mkfs_sized 360MB + > > 'multiple jobs each writing to a different file' to ensure we are > > extensively stressing the allocation logic in low space scenarios. > > I see, please at least fully document this in the commit messages. > > Thanks Will do. Regards, ojaswin
© 2016 - 2025 Red Hat, Inc.