Skip to content

RFC btrfs: qgroup: Pause and resume qgroup for subvolume removal

Qu Wenruo linux-btrfs 1 version New

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 RFC Latest3 patches 0 repliesNew

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/3btrfs: Refactor btrfs_clean_one_deleted_snapshot() to use fs_info other than rootfs/btrfs/disk-io.c fs/btrfs/transaction.c fs/btrfs/transaction.h+6 -70 replies
2/3btrfs: qgroup: Introduce quota pause infrastrucutrefs/btrfs/qgroup.c fs/btrfs/qgroup.h+80 -20 replies
3/3btrfs: Pause and resume qgroup for snapshot dropfs/btrfs/ctree.h fs/btrfs/disk-io.c fs/btrfs/extent-tree.c +2 more+20 -60 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH RFC 0/3] btrfs: qgroup: Pause and resume qgroup for subvolume removal

Btrfs qgroup has one big performance overhead for certain snapshot drop.

Current btrfs_drop_snapshot() will try its best to find the highest shared node, and just drop one ref of that common node. This behavior is good for minimize extent tree modification, but a disaster for qgroup.

Example:

      Root 300  Root 301
        A         B
        | \     / |
        |    X    |
        | /     \ |
        C         D
      /   \     /   \
     E     F    G    H
    / \   / \  / \   / \

I J K L M N O P

In above case, if we're dropping root 301, btrfs_drop_snapshot() will only drop one ref for tree block C and D.

But for qgroup, tree blocks E~P also have their owner changed, from 300, 301 to 300 only.

Currently we use btrfs_qgroup_trace_subtree() to manually re-dirty tree block E~P. And since such ref change happens in one transaction for each ref drop, we can't split the overhead to different transactions.

This could cause qgroup extent record flood, hugely damage performance or even cause OOM for too many qgroup extent records.

Unfortunately unlike previous qgroup + balance optimization, we can't really do much to help.
So to make the problem less obvious, let's just pause qgroup and resume it for snapshot drop, and queue a rescan automatically.

For independent subvolume or small snapshot, we don't really need to do such pause/rescan workaround, as regular per-tree-block dropping is pretty qgroup friendly.

Qu Wenruo (3):
btrfs: Refactor btrfs_clean_one_deleted_snapshot() to use fs_info
other than root
btrfs: qgroup: Introduce quota pause infrastrucutre
btrfs: Pause and resume qgroup for snapshot drop

 fs/btrfs/ctree.h       |  3 +-
 fs/btrfs/disk-io.c     |  9 ++---
 fs/btrfs/extent-tree.c | 13 ++++++-
 fs/btrfs/qgroup.c      | 79 ++++++++++++++++++++++++++++++++++++++++--
 fs/btrfs/qgroup.h      |  3 ++
 fs/btrfs/relocation.c  |  4 +--
 fs/btrfs/transaction.c |  8 ++---
 fs/btrfs/transaction.h |  2 +-
 8 files changed, 106 insertions(+), 15 deletions(-)
Signature · 1 line
2.22.0