OSDN Git Service

btrfs: don't end the transaction for delayed refs in throttle
authorJosef Bacik <josef@toxicpanda.com>
Thu, 24 Jan 2019 14:31:43 +0000 (09:31 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 28 Jan 2019 14:41:11 +0000 (15:41 +0100)
commit302167c50b32e7fccc98994a91d40ddbbab04e52
tree732ce7fdb28c9b5f7e7768856016fc5fd5755d13
parenta6279470762c19ba97e454f90798373dccdf6148
btrfs: don't end the transaction for delayed refs in throttle

Previously callers to btrfs_end_transaction_throttle() would commit the
transaction if there wasn't enough delayed refs space.  This happens in
relocation, and if the fs is relatively empty we'll run out of delayed
refs space basically immediately, so we'll just be stuck in this loop of
committing the transaction over and over again.

This code existed because we didn't have a good feedback mechanism for
running delayed refs, but with the delayed refs rsv we do now.  Delete
this throttling code and let the btrfs_start_transaction() in relocation
deal with putting pressure on the delayed refs infrastructure.  With
this patch we no longer take 5 minutes to balance a metadata only fs.

Qu has submitted a fstest to catch slow balance or excessive transaction
commits. Steps to reproduce:

* create subvolume
* create many (eg. 16000) inlined files, of size 2KiB
* iteratively snapshot and touch several files to trigger metadata
  updates
* start balance -m

Reported-by: Qu Wenruo <wqu@suse.com>
Fixes: 64403612b73a ("btrfs: rework btrfs_check_space_for_delayed_refs")
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
[ add tags and steps to reproduce ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/transaction.c