public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: Gerhard Wiesinger <lists@wiesinger.com>, linux-btrfs@vger.kernel.org
Subject: Re: BTRFS doesn't compress on the fly
Date: Sun, 3 Dec 2023 19:41:23 +1030	[thread overview]
Message-ID: <6c2424bb-9c91-4ac0-970b-613ca97b3e01@gmx.com> (raw)
In-Reply-To: <a9fafe9c-27c8-4465-aafa-a4af6987c031@wiesinger.com>



On 2023/12/3 18:54, Gerhard Wiesinger wrote:
> On 02.12.2023 22:56, Qu Wenruo wrote:
>>>
>>>>
>>>> How can I find something about preallocation out?
>>>
>>> Above compsize is already showing there is some preallocated space.
>>>
>>> Thus I'm wondering if the preallocation is the cause.
>>>
>>> As should_nocow() would also check the PREALLOC inode flag, and tries
>>> NOCOW path first (then falls to COW if needed)
>>
>> Yep, I just reproduced it, for any INODE with PREALLOC flag (aka, the
>> file has some preallocated range), even we're writing into the range
>> that needs COW anyway (e.g. new writes which would enlarge the file),
>> the compression would not work anyway.
>>
>>  # mkfs.btrfs test.img
>>  # mount test.img -o compress-force=zstd /mnt/btrfs
>>  # fallocate -l 128k /mnt/btrfs/file1
>>  # xfs_io -f -c "pwrite 128k 128k" /mnt/btrfs/file1
>>  # xfs_io -f -c "pwrite 128k 128k" /mnt/btrfs/file2
>>  # sync
>>
>> Since file1 has 128K preallocated range, thus the inode has PREALLOC
>> flag, and would lead to no compression:
>>
>>     item 6 key (257 INODE_ITEM 0) itemoff 15811 itemsize 160
>>         generation 8 transid 8 size 262144 nbytes 262144
>>         block group 0 mode 100644 links 1 uid 0 gid 0 rdev 0
>>         sequence 33 flags 0x10(PREALLOC) <<<<
>>     item 7 key (257 INODE_REF 256) itemoff 15796 itemsize 15
>>         index 2 namelen 5 name: file1
>>     item 8 key (257 EXTENT_DATA 0) itemoff 15743 itemsize 53
>>         generation 8 type 2 (prealloc)
>>         prealloc data disk byte 13631488 nr 131072
>>         prealloc data offset 0 nr 131072
>>     item 9 key (257 EXTENT_DATA 131072) itemoff 15690 itemsize 53
>>         generation 8 type 1 (regular)
>>         extent data disk byte 13762560 nr 131072
>>         extent data offset 0 nr 131072 ram 131072
>>         extent compression 0 (none) <<<
>>
>> Meanwhile for the other file, which has no prealloc, would go regular
>> compression path.
>>
>>     item 10 key (258 INODE_ITEM 0) itemoff 15530 itemsize 160
>>         generation 8 transid 8 size 262144 nbytes 131072
>>         block group 0 mode 100600 links 1 uid 0 gid 0 rdev 0
>>         sequence 32 flags 0x0(none)
>>     item 11 key (258 INODE_REF 256) itemoff 15515 itemsize 15
>>         index 3 namelen 5 name: file2
>>     item 12 key (258 EXTENT_DATA 131072) itemoff 15462 itemsize 53
>>         generation 8 type 1 (regular)
>>         extent data disk byte 13893632 nr 4096
>>         extent data offset 0 nr 131072 ram 131072
>>         extent compression 3 (zstd)
>>
>> To me, this looks a bug, and the reason is exactly what I explained
>> before.
>>
>> The worst thing is, as long as the inode has PREALLOC flag, even if all
>> preallocated extents are used, it would prevent compression from
>> happening, forever for that inode.
>>
>> Let me try to fix the fallback to COW path to include compression.
>
>
> Thank you for reproducting it. Think we nailed it down.
>
> Is there a way to get the output of the file of the chunks/items?

You can always dump the full subvolume (`btrfs ins dump-tree -t
<subvolid> <device>`), then try to grep the inode which has PREALLOC
alloc (`| grep -C 5 "flags.*PREALLOC"), which would include the inode
number, then you can ping down the inodes which has PREALLOC flags and
not undergoing compression.

I won't be surprised most (if not all) files of postgresql would have
that flag.

Thanks,
Qu
>
> Thnx.
>
> Ciao,
>
> Gerhard
>

  reply	other threads:[~2023-12-03  9:12 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-30 11:21 BTRFS doesn't compress on the fly Gerhard Wiesinger
2023-11-30 20:53 ` Qu Wenruo
2023-12-02 12:02   ` Gerhard Wiesinger
2023-12-02 20:07     ` Qu Wenruo
2023-12-02 21:56       ` Qu Wenruo
2023-12-03  8:24         ` Gerhard Wiesinger
2023-12-03  9:11           ` Qu Wenruo [this message]
2023-12-03  9:45             ` Gerhard Wiesinger
2023-12-03 10:19               ` Qu Wenruo
2023-12-22  5:58                 ` Gerhard Wiesinger
2023-12-22  6:13                   ` Qu Wenruo
2024-08-11  9:39                     ` Gerhard Wiesinger

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=6c2424bb-9c91-4ac0-970b-613ca97b3e01@gmx.com \
    --to=quwenruo.btrfs@gmx.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=lists@wiesinger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox