• Josef Bacik's avatar
    btrfs: don't end the transaction for delayed refs in throttle · 302167c5
    Josef Bacik authored
    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: default avatarQu Wenruo <wqu@suse.com>
    Fixes: 64403612 ("btrfs: rework btrfs_check_space_for_delayed_refs")
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    [ add tags and steps to reproduce ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    302167c5
transaction.c 64.3 KB