On Thu, Feb 2, 2023 at 4:00 PM <fdmanana@xxxxxxxxxx> wrote: > > From: Filipe Manana <fdmanana@xxxxxxxx> > > Currently we don't have any test case in fstests to do randomized and > stress testing of the send stream v2, added in kernel 6.0 and support for > it in btrfs-progs v5.19. For the send v2 stream, we only have btrfs/281 > that exercises a specific scenario which used to trigger a bug. > > So add a test that uses fsstress to generate a filesystem and exercise > both full and incremental send operations using the v2 send stream with > compressed extents, and then receive the streams without and with > decompression, to verify they work and produce the same results as in > the original filesystem. This is the same base idea as btrfs/007, but > for the send v2 stream with compressed data. > > Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx> Zorro, this is missing in the last fstests update. The test was reviewed (by Anand), do you expect anything from my side? I also often see other patches that get reviewed and don't get merged, even after several weeks. For example: https://lore.kernel.org/fstests/20230113070653.44512-1-wqu@xxxxxxxx/ Thanks. > --- > tests/btrfs/284 | 133 ++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/284.out | 2 + > 2 files changed, 135 insertions(+) > create mode 100755 tests/btrfs/284 > create mode 100644 tests/btrfs/284.out > > diff --git a/tests/btrfs/284 b/tests/btrfs/284 > new file mode 100755 > index 00000000..0d31e5d9 > --- /dev/null > +++ b/tests/btrfs/284 > @@ -0,0 +1,133 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (C) 2023 SUSE Linux Products GmbH. All Rights Reserved. > +# > +# FS QA Test 284 > +# > +# Test btrfs send stream v2, sending and receiving compressed data without > +# decompression at the sending side. > +# > +. ./common/preamble > +_begin_fstest auto quick send compress snapshot > + > +# Modify as appropriate. > +_supported_fs btrfs > +_require_btrfs_send_v2 > +_require_test > +# The size needed is variable as it depends on the specific randomized > +# operations from fsstress and on the value of $LOAD_FACTOR. But require at > +# least $LOAD_FACTOR * 1G, just to be on the safe side. > +_require_scratch_size $(($LOAD_FACTOR * 1 * 1024 * 1024)) > +_require_fssum > + > +send_files_dir=$TEST_DIR/btrfs-test-$seq > + > +rm -fr $send_files_dir > +mkdir $send_files_dir > + > +# Redirect stdout to the .full file and make it not part of the golden output. > +# This is because the number of available compression algorithms may vary across > +# kernel versions, so the number of times we are running this function is > +# variable. > +run_send_test() > +{ > + local algo=$1 > + local snapshot_cmd > + local first_stream="$send_files_dir/snap1.stream" > + local second_stream="$send_files_dir/snap2.stream" > + local first_fssum="$send_files_dir/snap1.fssum" > + local second_fssum="$send_files_dir/snap2.fssum" > + > + _scratch_mkfs >> $seqres.full 2>&1 > + _scratch_mount -o compress=$algo > + > + snapshot_cmd="$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT" > + snapshot_cmd="$snapshot_cmd $SCRATCH_MNT/snap1" > + > + # Use a single process so that in case of failure it's easier to > + # reproduce by using the same seed (logged in $seqres.full). > + run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p 1 -n $((LOAD_FACTOR * 200)) \ > + -w $FSSTRESS_AVOID -x "$snapshot_cmd" >> $seqres.full > + > + $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/snap2 \ > + >> $seqres.full > + > + echo "Creating full and incremental send streams..." >> $seqres.full > + > + $BTRFS_UTIL_PROG send --compressed-data -q -f $first_stream \ > + $SCRATCH_MNT/snap1 2>&1 | tee -a $seqres.full > + $BTRFS_UTIL_PROG send --compressed-data -q -f $second_stream \ > + -p $SCRATCH_MNT/snap1 $SCRATCH_MNT/snap2 2>&1 | \ > + tee -a $seqres.full > + > + echo "Computing the checksums for each snapshot..." >> $seqres.full > + > + $FSSUM_PROG -A -f -w $first_fssum $SCRATCH_MNT/snap1 2>&1 | \ > + tee -a $seqres.full > + $FSSUM_PROG -A -f -w $second_fssum -x $SCRATCH_MNT/snap2/snap1 \ > + $SCRATCH_MNT/snap2 2>&1 | tee -a $seqres.full > + > + echo "Creating a new fs to receive the streams..." >> $seqres.full > + > + _scratch_unmount > + _scratch_mkfs >> $seqres.full 2>&1 > + _scratch_mount > + > + echo "Receiving the streams..." >> $seqres.full > + > + $BTRFS_UTIL_PROG receive -q -f $first_stream $SCRATCH_MNT 2>&1 | \ > + tee -a $seqres.full > + $BTRFS_UTIL_PROG receive -q -f $second_stream $SCRATCH_MNT 2>&1 | \ > + tee -a $seqres.full > + > + echo "Verifying the checksums for each snapshot..." >> $seqres.full > + > + # On success, fssum outputs only a single line with "OK" to stdout, and > + # on error it outputs several lines to stdout telling about each file > + # with data or metadata mismatches. Since the number of times we run > + # fssum depends on the available compression algorithms for the running > + # kernel, filter out the success case, so we don't have a mismatch with > + # the golden output. We only want the mismatch with the golden output in > + # case there's a checksum failure. > + $FSSUM_PROG -r $first_fssum $SCRATCH_MNT/snap1 | grep -Ev '^OK$' | \ > + tee -a $seqres.full > + $FSSUM_PROG -r $second_fssum $SCRATCH_MNT/snap2 | grep -Ev '^OK$' | \ > + tee -a $seqres.full > + > + # Now receive again the streams in a new filesystem, but this time use > + # the option --force-decompress of the receiver to verify that it works > + # as expected. > + echo "Creating a new fs to receive the streams with decompression..." >> $seqres.full > + > + _scratch_unmount > + _scratch_mkfs >> $seqres.full 2>&1 > + _scratch_mount > + > + echo "Receiving the streams with decompression..." >> $seqres.full > + > + $BTRFS_UTIL_PROG receive -q --force-decompress -f $first_stream $SCRATCH_MNT 2>&1 \ > + | tee -a $seqres.full > + $BTRFS_UTIL_PROG receive -q --force-decompress -f $second_stream $SCRATCH_MNT 2>&1 \ > + | tee -a $seqres.full > + > + echo "Verifying the checksums for each snapshot..." >> $seqres.full > + > + $FSSUM_PROG -r $first_fssum $SCRATCH_MNT/snap1 | grep -Ev '^OK$' | \ > + tee -a $seqres.full > + $FSSUM_PROG -r $second_fssum $SCRATCH_MNT/snap2 | grep -Ev '^OK$' | \ > + tee -a $seqres.full > + > + _scratch_unmount > + rm -f $send_files_dir/* > +} > + > +algo_list=($(_btrfs_compression_algos)) > +for algo in ${algo_list[@]}; do > + echo -e "\nTesting with $algo...\n" >> $seqres.full > + run_send_test $algo > +done > + > +# success, all done > +echo "Silence is golden" > +status=0 > +exit > diff --git a/tests/btrfs/284.out b/tests/btrfs/284.out > new file mode 100644 > index 00000000..931839fe > --- /dev/null > +++ b/tests/btrfs/284.out > @@ -0,0 +1,2 @@ > +QA output created by 284 > +Silence is golden > -- > 2.35.1 >