From: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: <fstests@vger.kernel.org>, <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH v3] generic: make 17[1-4] work well when btrfs compression is enabled
Date: Fri, 28 Oct 2016 15:00:29 +0800 [thread overview]
Message-ID: <5812F78D.9020802@cn.fujitsu.com> (raw)
In-Reply-To: <20161027171321.GA5251@birch.djwong.org>
hi,
On 10/28/2016 01:13 AM, Darrick J. Wong wrote:
> On Wed, Oct 26, 2016 at 05:52:11PM +0800, Wang Xiaoguang wrote:
>> When enabling btrfs compression, original codes can not fill fs
>> correctly, here we introduce _fill_fs() in common/rc, which'll keep
>> creating and writing files until enospc error occurs. Note _fill_fs
>> is copied from tests/generic/256, but with some minor modifications.
>>
>> Signed-off-by: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
>> ---
>> V2: In common/, I did't find an existing function suitable for
>> these 4 test cases to fill fs, so I still use _pwrite_byte() with
>> a big enough file length fo fill fs. Note, for btrfs, metadata space
>> still is not full, only data space is full, but it's OK for these
>> 4 test cases.
>>
>> All these 4 cases pass in xfs and btrfs(without compression), if
>> btrfs has compression enabled, these 4 cases will fail for false
>> enospc error, I have sent kernel patches to fix this bug.
>>
>> V3: Introduce _fill_fs in common/rc to fill fs.
>> ---
>> common/rc | 50 ++++++++++++++++++++++++++++++++++++++++++
>> tests/generic/171 | 4 +---
>> tests/generic/172 | 4 ++--
>> tests/generic/173 | 4 +---
>> tests/generic/174 | 4 +---
>> tests/generic/256 | 65 +++++--------------------------------------------------
>> 6 files changed, 60 insertions(+), 71 deletions(-)
>>
>> diff --git a/common/rc b/common/rc
>> index 7a9fc90..0e1ac5d 100644
>> --- a/common/rc
>> +++ b/common/rc
> Would you mind moving this to common/populate, where I've been (slowly)
> collecting all the "create stuff inside the filesystem" routines?
OK, sure.
>
> (It's part of a slow-moving effort to declutter common/rc.)
>
>> @@ -4003,6 +4003,56 @@ _require_xfs_mkfs_without_validation()
>> fi
>> }
>>
>> +# Fill a file system by repeatedly creating files in the given folder
>> +# starting with the given file size. Files are reduced in size when
>> +# they can no longer fit until no more files can be created.
>> +_fill_fs()
>> +{
>> + local file_size=$1
>> + local dir=$2
>> + local block_size=$3
>> + local switch_user=$4
>> + local file_count=1
>> + local bytes_written=0
>> +
>> + if [ $# -ne 4 ]; then
>> + echo "Usage: _fill_fs filesize dir blocksize"
>> + exit 1
>> + fi
>> +
>> + if [ $switch_user -eq 0 ]; then
>> + mkdir -p $dir
>> + else
>> + _user_do "mkdir -p $dir"
>> + fi
>> +
>> + if [ $file_size -lt $block_size ]; then
>> + $file_size = $block_size
>> + fi
>> +
>> + while [ $file_size -ge $block_size ]; do
>> + bytes_written=0
>> + if [ $switch_user -eq 0 ]; then
>> + $XFS_IO_PROG -f -c "pwrite 0 $file_size" \
>> + $dir/$file_count > /dev/null
> If you want to speed this up some more you could pass "-b 8388608" in
> the pwrite string so that xfs_io will allocate an 8MB memory buffer
> internally when writing out data.
>
> $XFS_IO_PROG -f -c "pwrite -b 8388608 0 $file_size" $dir/$file_count
Thanks for this info, I'll use it.
>
>> + else
>> + _user_do "$XFS_IO_PROG -f -c \"pwrite 0 $file_size\" \
>> + $dir/$file_count > /dev/null"
> Also, why redirect to /dev/null? I think helper functions generally let
> the individual test decide where the stdout & stderr output ultimately
> end up. Most tests seem to dump to $seqres.full or /dev/null, but we
> should let the test decide where potentially useful diagnostic
> information ends up.
Agree :)
> /me also wonders if falloc would be a faster way to consume disk blocks
> than pwrite, but ... <shrug>
Oh, it is. Falloc is not affected by compression.
>> + fi
>> +
>> + if [ -f $dir/$file_count ]; then
>> + bytes_written=$(stat -c '%s' $dir/$file_count)
>> + fi
>> +
>> + # If there was no room to make the file, then divide it in
>> + # half, and keep going
>> + if [ $bytes_written -lt $file_size ]; then
>> + file_size=$((file_size / 2))
>> + fi
>> + file_count=$((file_count + 1))
>> + done
>> +}
>> +
>> init_rc
>>
>> ################################################################################
>> diff --git a/tests/generic/171 b/tests/generic/171
>> index a69f798..fde8ef2 100755
>> --- a/tests/generic/171
>> +++ b/tests/generic/171
>> @@ -75,9 +75,7 @@ _cp_reflink $testdir/bigfile $testdir/clonefile
>> sync
>>
>> echo "Allocate the rest of the space"
>> -nr_free=$(stat -f -c '%f' $testdir)
>> -touch $testdir/file0 $testdir/file1
>> -_pwrite_byte 0x61 0 $((blksz * nr_free)) $testdir/eat_my_space >> $seqres.full 2>&1
>> +_fill_fs $((32 * 1024 * 1024)) $testdir/space $blksz 0 >> $seqres.full 2>&1
> Given that _fill_fs has exponential backoff to try to really fill the fs,
> why not call it with $((blksz * nr_free)) instead of a fixed 32MB?
OK, I'll send v4 soon.
Thanks for all your comments.
Regards,
Xiaoguang Wang
>
> --D
>
>> sync
>>
>> echo "CoW the big file"
>> diff --git a/tests/generic/172 b/tests/generic/172
>> index 8192290..3625546 100755
>> --- a/tests/generic/172
>> +++ b/tests/generic/172
>> @@ -57,6 +57,7 @@ testdir=$SCRATCH_MNT/test-$seq
>> mkdir $testdir
>>
>> echo "Reformat with appropriate size"
>> +blksz="$(get_block_size $testdir)"
>> umount $SCRATCH_MNT
>>
>> file_size=$((168 * 1024 * 1024))
>> @@ -72,8 +73,7 @@ _cp_reflink $testdir/bigfile $testdir/clonefile
>> sync
>>
>> echo "Allocate the rest of the space"
>> -touch $testdir/file0 $testdir/file1
>> -_pwrite_byte 0x61 0 $fs_size $testdir/eat_my_space >> $seqres.full 2>&1
>> +_fill_fs $((32 * 1024 * 1024)) $testdir/space $blksz 0 >> $seqres.full 2>&1
>> sync
>>
>> echo "CoW the big file"
>> diff --git a/tests/generic/173 b/tests/generic/173
>> index e35597f..3d583b1 100755
>> --- a/tests/generic/173
>> +++ b/tests/generic/173
>> @@ -75,9 +75,7 @@ _cp_reflink $testdir/bigfile $testdir/clonefile
>> sync
>>
>> echo "Allocate the rest of the space"
>> -nr_free=$(stat -f -c '%f' $testdir)
>> -touch $testdir/file0 $testdir/file1
>> -_pwrite_byte 0x61 0 $((blksz * nr_free)) $testdir/eat_my_space >> $seqres.full 2>&1
>> +_fill_fs $((32 * 1024 * 1024)) $testdir/space $blksz 0 >> $seqres.full 2>&1
>> sync
>>
>> echo "mmap CoW the big file"
>> diff --git a/tests/generic/174 b/tests/generic/174
>> index e58d64b..bd7fc11 100755
>> --- a/tests/generic/174
>> +++ b/tests/generic/174
>> @@ -76,9 +76,7 @@ _cp_reflink $testdir/bigfile $testdir/clonefile
>> sync
>>
>> echo "Allocate the rest of the space"
>> -nr_free=$(stat -f -c '%f' $testdir)
>> -touch $testdir/file0 $testdir/file1
>> -_pwrite_byte 0x61 0 $((blksz * nr_free)) $testdir/eat_my_space >> $seqres.full 2>&1
>> +_fill_fs $((32 * 1024 * 1024)) $testdir/space $blksz 0 >> $seqres.full 2>&1
>> sync
>>
>> echo "CoW the big file"
>> diff --git a/tests/generic/256 b/tests/generic/256
>> index cfbf790..9488648 100755
>> --- a/tests/generic/256
>> +++ b/tests/generic/256
>> @@ -53,64 +53,6 @@ _require_test
>>
>> testfile=$TEST_DIR/256.$$
>>
>> -# _fill_fs()
>> -#
>> -# Fills a file system by repeatedly creating files in the given folder
>> -# starting with the given file size. Files are reduced in size when
>> -# they can no longer fit untill no more files can be created.
>> -#
>> -# This routine is used by _test_full_fs_punch to test that a hole may
>> -# still be punched when the disk is full by borrowing reserved blocks.
>> -# All files are created as a non root user to prevent reserved blocks
>> -# from being consumed.
>> -#
>> -_fill_fs() {
>> - local file_size=$1
>> - local dir=$2
>> - local block_size=$3
>> - local file_count=1
>> - local bytes_written=0
>> -
>> - if [ $# -ne 3 ]
>> - then
>> - echo "USAGE: _fill_fs filesize dir block size"
>> - exit 1
>> - fi
>> -
>> - # Creation of files or folders
>> - # must not be done as root or
>> - # reserved blocks will be consumed
>> - _user_do "mkdir -p $dir &> /dev/null"
>> - if [ $? -ne 0 ] ; then
>> - return 0
>> - fi
>> -
>> - if [ $file_size -lt $block_size ]
>> - then
>> - $file_size = $block_size
>> - fi
>> -
>> - while [ $file_size -ge $block_size ]
>> - do
>> - bytes_written=0
>> - _user_do "$XFS_IO_PROG -f -c \"pwrite 0 $file_size\" $dir/$file_count.bin &> /dev/null"
>> -
>> - if [ -f $dir/$file_count.bin ]
>> - then
>> - bytes_written=`$XFS_IO_PROG -c "stat" $dir/$file_count.bin | grep stat.size | cut -d ' ' -f3`
>> - fi
>> -
>> - # If there was no room to make the file,
>> - # then divide it in half, and keep going
>> - if [ $bytes_written -lt $file_size ]
>> - then
>> - file_size=$(( $file_size / 2 ))
>> - fi
>> - file_count=$(( $file_count + 1 ))
>> -
>> - done
>> -}
>> -
>> # _test_full_fs_punch()
>> #
>> # This function will test that a hole may be punched
>> @@ -144,7 +86,10 @@ _test_full_fs_punch()
>> -c "fsync" $file_name &> /dev/null
>> chmod 666 $file_name
>>
>> - _fill_fs $(( 1024 * 1024 * 1024 )) $path/fill $block_size
>> + # All files are created as a non root user to prevent reserved blocks
>> + # from being consumed.
>> + _fill_fs $(( 1024 * 1024 * 1024 )) $path/fill $block_size 1 \
>> + > /dev/null 2>&1
>>
>> for (( i=0; i<$iterations; i++ ))
>> do
>> @@ -159,7 +104,7 @@ _test_full_fs_punch()
>>
>> hole_offset=$(( $hole_offset + $hole_len + $hole_interval ))
>>
>> - _fill_fs $hole_len $path/fill.$i $block_size
>> + _fill_fs $hole_len $path/fill.$i $block_size 1 > /dev/null 2>&1
>>
>> done
>> }
>> --
>> 2.9.0
>>
>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe fstests" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2016-10-28 7:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-26 9:52 [PATCH v3] generic: make 17[1-4] work well when btrfs compression is enabled Wang Xiaoguang
2016-10-27 11:25 ` Eryu Guan
2016-10-28 7:05 ` Wang Xiaoguang
2016-10-28 7:22 ` Eryu Guan
2016-10-27 17:13 ` Darrick J. Wong
2016-10-28 7:00 ` Wang Xiaoguang [this message]
2016-10-28 7:16 ` Eryu Guan
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=5812F78D.9020802@cn.fujitsu.com \
--to=wangxg.fnst@cn.fujitsu.com \
--cc=darrick.wong@oracle.com \
--cc=fstests@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).