btrfs-progs: tests: always wait for subvolume cleaning before clear-stale

[BUG]
There is a random chance that misc/055 would fail with stale qgroups
detected.

[CAUSE]
Commit 82f7d6c1d7 ("btrfs-progs: qgroup: handle stale qgroup deletion
more accurately") changed the behavior of "btrfs qgroup clear-stale"
that it will no longer try to remove qgroup under deletion.

And the test case itself relies on the return value of "btrfs qgroup
clear-stale" to do the extra wait for subvolume deletion.

This means after that commit, the test case would skip the wait if there
is a subvolume waiting for cleanup, resulting in a race window where the
subvolume can be dropped and become stale, and eventually trigger the
stale qgroup detection and cause false alerts.

[FIX]
Fix the test case by always wait for the subvolume to be dropped, so
that later "btrfs qgroup clear-stale" can properly remove all stale
qgroups.

Pull-request: #814
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2024-06-13 09:58:48 +09:30 committed by David Sterba
parent 760e879b4a
commit c1882f9e30

View file

@ -18,14 +18,15 @@ run_check $SUDO_HELPER "$TOP/btrfs" qgroup show "$TEST_MNT"
rootid=$(run_check_stdout "$TOP/btrfs" inspect-internal rootid "$TEST_MNT/subv1")
run_check $SUDO_HELPER "$TOP/btrfs" subvolume delete "$TEST_MNT/subv1"
run_check $SUDO_HELPER "$TOP/btrfs" qgroup show "$TEST_MNT"
# Subvolume deletion could be slow and won't let the qgroup to be cleaned,
# shown as '<under deletion>'.
if ! run_mayfail $SUDO_HELPER "$TOP/btrfs" qgroup clear-stale "$TEST_MNT"; then
run_check $SUDO_HELPER "$TOP/btrfs" subvolume sync "$TEST_MNT" "$rootid"
run_check $SUDO_HELPER "$TOP/btrfs" qgroup show "$TEST_MNT"
# After cleaning the subvolume it must pass
run_check $SUDO_HELPER "$TOP/btrfs" qgroup clear-stale "$TEST_MNT"
fi
# Subvolume under deletion won't be deleted and "btrfs qgroup clear-stale"
# would detect it and not report an error.
# So here we have to wait for the subvolume deletion.
run_check $SUDO_HELPER "$TOP/btrfs" subvolume sync "$TEST_MNT" "$rootid"
run_check $SUDO_HELPER "$TOP/btrfs" qgroup show "$TEST_MNT"
# After cleaning the subvolume it must pass
run_check $SUDO_HELPER "$TOP/btrfs" qgroup clear-stale "$TEST_MNT"
list=$(run_check_stdout $SUDO_HELPER "$TOP/btrfs" qgroup show "$TEST_MNT")
if echo "$list" | grep -q "0/$rootid"; then
_fail "stale qgroups not deleted"