Re: [PATCH] fstests: filter.btrfs: handle detailed missing device report better

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Wed, Nov 09, 2022 at 02:22:36PM +0800, Qu Wenruo wrote:
> [FAILURES]
> The following btrfs test cases failed with newer btrfs-progs:
> 
> - btrfs/197
> - btrfs/198
> - btrfs/254
> 
> They all fail due to output mismatch like the following:
> 
>      Label: none  uuid: <UUID>
>      	Total devices <NUM> FS bytes used <SIZE>
>      	devid <DEVID> size <SIZE> used <SIZE> path SCRATCH_DEV
>     -	*** Some devices missing
>     +	devid <DEVID> size 0 used 0 path  MISSING
> 
> [CAUSE]
> Since btrfs-progs commit 957a79c9b016 ("btrfs-progs: fi show: print
> missing device for a mounted file system"), we output the detailed info
> of a missing device if "btrfs filesystem show" is executed using
> "-m <mnt>" option.
> 
> Such detailed output no longer follows the old format, thus causing the
> output mismatch.
> 
> [FIX]
> Update _filter_btrfs_filesystem_show() to handle detailed missing
> device by:
> 
> - Buffer the output first
> 
> - Output the first two lines
>   Which is always label/uuid and the total device accounting.
> 
> - Replace the detailed missing device line with old output
> 
> - Sort (in reverse order) and uniq the device list
> 
> By this we can handle both old and new output correctly.
> Although this means we lacks the ability to detect mutltiple missing
> devices, thankfully the involved test cases are not checking this yet.
> 
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
> ---
>  common/filter.btrfs | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/common/filter.btrfs b/common/filter.btrfs
> index d4169cc6..c570d366 100644
> --- a/common/filter.btrfs
> +++ b/common/filter.btrfs
> @@ -35,7 +35,17 @@ _filter_btrfs_filesystem_show()
>  	_filter_size | _filter_btrfs_version | _filter_devid | \
>  	_filter_zero_size | \
>  	sed -e "s/\(Total devices\) $NUMDEVS/\1 $NUM_SUBST/g" | \
> -	uniq
> +	uniq > $tmp.btrfs_filesystem_show
> +
> +	# The first two lines are Label/UUID and total devices
> +	head -n 2 $tmp.btrfs_filesystem_show
> +
> +	# The remaining is the device list, first filter out the detailed
> +	# missing device to the generic one.
> +	# Then sort and uniq the result
> +	tail -n +3 $tmp.btrfs_filesystem_show | \
> +	sed -e "s/devid <DEVID> size 0 used 0 path  MISSING/*** Some devices missing/" | \
> +	sort -r | uniq

Ah, I had updated to btrfs-progs 6.0 last week, and was wondering how
was it possible no one had fixed this before - either no one is testing
with 5.19+ or no one cares.

It looks good to me, and it works for me.

I had a local patch here as well, but you beat me to it.
My version is based on awk only, no sorting needed:

diff --git a/common/filter.btrfs b/common/filter.btrfs
index d4169cc6..a27a7276 100644
--- a/common/filter.btrfs
+++ b/common/filter.btrfs
@@ -30,11 +30,22 @@ _filter_btrfs_filesystem_show()
                UUID=$2
        fi
 
-       # the uniq collapses all device lines into 1
+       # The awk script converts between the output format of btrfs-progs 5.19+
+       # to the output format of older versions when there are missing devices.
+       # That format changed in the btrfs-progs commit:
+       #
+       #   957a79c9b016 ("btrfs-progs: fi show: print missing device for a mounted file system")
+       #
+       # The uniq at the end collapses all device lines into 1.
        _filter_uuid $UUID | _filter_scratch | _filter_scratch_pool | \
        _filter_size | _filter_btrfs_version | _filter_devid | \
        _filter_zero_size | \
        sed -e "s/\(Total devices\) $NUMDEVS/\1 $NUM_SUBST/g" | \
+       $AWK_PROG -e 'BEGIN { missing = 0 }' \
+                 -e '/\sMISSING$/ { missing = 1 }' \
+                 -e '/^\s*$/ { next }' \
+                 -e '!/\sMISSING$/ { print }' \
+                 -e 'END { if (missing) print "\t*** Some devices missing\n" }' | \
        uniq
 }

Either way, it looks good to me, thanks!

Reviewed-by: Filipe Manana <fdmanana@xxxxxxxx>


>  }
>  
>  # This eliminates all numbers, and shows only unique lines,
> -- 
> 2.38.0
> 



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux