From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH 0/2] btrfs-progs: free space tree fixes
Date: Fri, 20 May 2022 09:31:49 +0800 [thread overview]
Message-ID: <cover.1653009947.git.wqu@suse.com> (raw)
I was debugging a weird behavior that btrfs kernel chooses not to
allocate a new data extent at an empty data block group.
And when checking the free space tree, it turned out that, we always
use bitmaps in btrfs-progs no matter what.
This results some every concerning free space tree after mkfs:
$ mkfs.btrfs -f -m raid1 -d raid0 /dev/test/scratch[1234]
btrfs-progs v5.17
[...]
Block group profiles:
Data: RAID0 4.00GiB
Metadata: RAID1 256.00MiB
System: RAID1 8.00MiB
[..]
$ btrfs ins dump-tree -t free-space /dev/test/scratch1
btrfs-progs v5.17
free space tree key (FREE_SPACE_TREE ROOT_ITEM 0)
node 30441472 level 1 items 10 free space 483 generation 6 owner FREE_SPACE_TREE
node 30441472 flags 0x1(WRITTEN) backref revision 1
fs uuid deddccae-afd0-4160-9a12-48fe7b526fb1
chunk uuid 68f6cf98-afe3-4f47-9797-37fd9c610219
key (1048576 FREE_SPACE_INFO 4194304) block 30457856 gen 6
key (475004928 FREE_SPACE_BITMAP 8388608) block 30703616 gen 5
key (953155584 FREE_SPACE_BITMAP 8388608) block 30720000 gen 5
key (1431306240 FREE_SPACE_BITMAP 8388608) block 30736384 gen 5
key (1909456896 FREE_SPACE_BITMAP 8388608) block 30752768 gen 5
key (2387607552 FREE_SPACE_BITMAP 8388608) block 30769152 gen 5
key (2865758208 FREE_SPACE_BITMAP 8388608) block 30785536 gen 5
key (3343908864 FREE_SPACE_BITMAP 8388608) block 30801920 gen 5
key (3822059520 FREE_SPACE_BITMAP 8388608) block 30818304 gen 5
key (4300210176 FREE_SPACE_BITMAP 8388608) block 30834688 gen 5
[...]
^^^ So many bitmaps that an empty fs will have two levels for free
space tree already
Thankfully, kernel can properly merge those bitmaps into a large extent
at mount, so it won't be that scary forever.
It turns out that, we never set btrfs_block_group::bitmap_high_thresh,
thus we always convert free space extents to bitmaps, and waste space
unnecessarily.
Fix it by cross-port the needed function
set_free_space_tree_thresholds() from kernel and call it at correct
timing.
And finally add a test case for it.
Unfortunately, even with this fixed, kernel is still doing its weird
behavior, as it's the cached un-clustered allocation code causing the
problem...
Qu Wenruo (2):
btrfs-progs: properly initialize btrfs_block_group::bitmap_high_thresh
btrfs-progs: mkfs-tests: add test case to make sure we don't create
bitmaps for empty fs
kernel-shared/extent-tree.c | 2 ++
kernel-shared/free-space-tree.c | 29 ++++++++++++++++++++
kernel-shared/free-space-tree.h | 2 ++
tests/mkfs-tests/024-fst-bitmaps/test.sh | 35 ++++++++++++++++++++++++
4 files changed, 68 insertions(+)
create mode 100755 tests/mkfs-tests/024-fst-bitmaps/test.sh
--
2.36.1
next reply other threads:[~2022-05-20 1:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-20 1:31 Qu Wenruo [this message]
2022-05-20 1:31 ` [PATCH 1/2] btrfs-progs: properly initialize btrfs_block_group::bitmap_high_thresh Qu Wenruo
2022-05-20 1:31 ` [PATCH 2/2] btrfs-progs: mkfs-tests: add test case to make sure we don't create bitmaps for empty fs Qu Wenruo
2022-05-20 14:34 ` [PATCH 0/2] btrfs-progs: free space tree fixes David Sterba
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=cover.1653009947.git.wqu@suse.com \
--to=wqu@suse.com \
--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